blob: eddbab4c1556a53a3c19ad22e2574cca6c538aa8 [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 {
Geoff Lang0b833232013-08-21 10:13:29 -0400828 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
829
830 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
831 {
832 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
833 }
834
835 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
836 {
837 return gl::error(GL_INVALID_VALUE);
838 }
839
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000840 context->clear(mask);
841 }
842 }
843 catch(std::bad_alloc&)
844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000845 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000846 }
847}
848
849void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
850{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000851 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000852 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000853
854 try
855 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000856 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000857
858 if (context)
859 {
860 context->setClearColor(red, green, blue, alpha);
861 }
862 }
863 catch(std::bad_alloc&)
864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000865 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000866 }
867}
868
869void __stdcall glClearDepthf(GLclampf depth)
870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000871 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000872
873 try
874 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000875 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000876
877 if (context)
878 {
879 context->setClearDepth(depth);
880 }
881 }
882 catch(std::bad_alloc&)
883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000884 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000885 }
886}
887
888void __stdcall glClearStencil(GLint s)
889{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000890 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000891
892 try
893 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000894 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000895
896 if (context)
897 {
898 context->setClearStencil(s);
899 }
900 }
901 catch(std::bad_alloc&)
902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000903 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000904 }
905}
906
907void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
908{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000909 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000910 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000911
912 try
913 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000914 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000915
916 if (context)
917 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000918 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000919 }
920 }
921 catch(std::bad_alloc&)
922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000923 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000924 }
925}
926
927void __stdcall glCompileShader(GLuint shader)
928{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000929 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000930
931 try
932 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000933 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000934
935 if (context)
936 {
937 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000938
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000939 if (!shaderObject)
940 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000941 if (context->getProgram(shader))
942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000943 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000944 }
945 else
946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000947 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000948 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000949 }
950
951 shaderObject->compile();
952 }
953 }
954 catch(std::bad_alloc&)
955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000956 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000957 }
958}
959
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000960void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
961 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000962{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000963 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000964 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000965 target, level, internalformat, width, height, border, imageSize, data);
966
967 try
968 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000969 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000970
971 if (context)
972 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000973 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400974 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000975 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
976 {
977 return;
978 }
979
980 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400981 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400982 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000983 {
984 return;
985 }
986
987 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000989 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000990 }
991
992 switch (target)
993 {
994 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000995 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000996 gl::Texture2D *texture = context->getTexture2D();
997 texture->setCompressedImage(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 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1002 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1003 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1004 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1005 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1006 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001007 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001008 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1009 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001010 }
1011 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001012
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001013 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001014 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001015 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001016 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001017 }
1018 catch(std::bad_alloc&)
1019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001020 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001021 }
1022}
1023
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001024void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1025 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001026{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001027 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001028 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001029 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001030 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1031
1032 try
1033 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001034 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001035
1036 if (context)
1037 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001038 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001039 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001040 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
1041 {
1042 return;
1043 }
1044
1045 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001046 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04001047 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001048 {
1049 return;
1050 }
1051
1052 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001054 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001055 }
1056
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001057 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +00001058 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001059 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001060 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001061 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001062 texture->subImageCompressed(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 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1067 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1068 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1069 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1070 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1071 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001072 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001073 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001074 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001075 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001076 break;
1077
1078 default:
1079 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001080 }
1081 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001082 }
1083 catch(std::bad_alloc&)
1084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001085 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001086 }
1087}
1088
1089void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1090{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001091 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001092 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001093 target, level, internalformat, x, y, width, height, border);
1094
1095 try
1096 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001097 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001098
1099 if (context)
1100 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001101 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001102 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001103 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001104 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001105 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001106 }
1107
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001108 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001109 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001110 0, 0, 0, x, y, width, height, border))
1111 {
1112 return;
1113 }
1114
1115 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
1116
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001117 switch (target)
1118 {
1119 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001120 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001121 gl::Texture2D *texture = context->getTexture2D();
1122 texture->copyImage(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
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001126 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1127 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1128 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1129 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1130 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1131 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001132 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001133 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1134 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001135 }
1136 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001137
1138 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001139 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001140 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001141 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001142 }
1143 catch(std::bad_alloc&)
1144 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001145 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001146 }
1147}
1148
1149void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1150{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001151 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001152 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001153 target, level, xoffset, yoffset, x, y, width, height);
1154
1155 try
1156 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001157 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001158
1159 if (context)
1160 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001161 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001162 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001163 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001164 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001165 return;
1166 }
1167
1168 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001169 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001170 xoffset, yoffset, 0, x, y, width, height, 0))
1171 {
1172 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001173 }
1174
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001175 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001176
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001177 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001178 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001179 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001180 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001181 gl::Texture2D *texture = context->getTexture2D();
1182 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001183 }
1184 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001185
1186 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1187 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1188 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1189 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1190 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1191 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001192 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001193 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1194 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001195 }
1196 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001197
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001198 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001199 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001200 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001201 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001202 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001203
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001204 catch(std::bad_alloc&)
1205 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001206 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001207 }
1208}
1209
1210GLuint __stdcall glCreateProgram(void)
1211{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001212 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001213
1214 try
1215 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001216 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001217
1218 if (context)
1219 {
1220 return context->createProgram();
1221 }
1222 }
1223 catch(std::bad_alloc&)
1224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001225 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001226 }
1227
1228 return 0;
1229}
1230
1231GLuint __stdcall glCreateShader(GLenum type)
1232{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001233 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001234
1235 try
1236 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001237 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001238
1239 if (context)
1240 {
1241 switch (type)
1242 {
1243 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001244 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001245 return context->createShader(type);
1246 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001247 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001248 }
1249 }
1250 }
1251 catch(std::bad_alloc&)
1252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001253 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001254 }
1255
1256 return 0;
1257}
1258
1259void __stdcall glCullFace(GLenum mode)
1260{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001261 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001262
1263 try
1264 {
1265 switch (mode)
1266 {
1267 case GL_FRONT:
1268 case GL_BACK:
1269 case GL_FRONT_AND_BACK:
1270 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001271 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001272
1273 if (context)
1274 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001275 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001276 }
1277 }
1278 break;
1279 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001280 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001281 }
1282 }
1283 catch(std::bad_alloc&)
1284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001285 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001286 }
1287}
1288
1289void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1290{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001291 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001292
1293 try
1294 {
1295 if (n < 0)
1296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001297 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001298 }
1299
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001300 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001301
1302 if (context)
1303 {
1304 for (int i = 0; i < n; i++)
1305 {
1306 context->deleteBuffer(buffers[i]);
1307 }
1308 }
1309 }
1310 catch(std::bad_alloc&)
1311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001312 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001313 }
1314}
1315
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001316void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1317{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001318 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001319
1320 try
1321 {
1322 if (n < 0)
1323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001324 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001325 }
1326
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001327 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001328
1329 if (context)
1330 {
1331 for (int i = 0; i < n; i++)
1332 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001333 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001334 }
1335 }
1336 }
1337 catch(std::bad_alloc&)
1338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001339 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001340 }
1341}
1342
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001343void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1344{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001345 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001346
1347 try
1348 {
1349 if (n < 0)
1350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001351 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001352 }
1353
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001354 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001355
1356 if (context)
1357 {
1358 for (int i = 0; i < n; i++)
1359 {
1360 if (framebuffers[i] != 0)
1361 {
1362 context->deleteFramebuffer(framebuffers[i]);
1363 }
1364 }
1365 }
1366 }
1367 catch(std::bad_alloc&)
1368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001369 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001370 }
1371}
1372
1373void __stdcall glDeleteProgram(GLuint program)
1374{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001375 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001376
1377 try
1378 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001379 if (program == 0)
1380 {
1381 return;
1382 }
1383
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001384 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001385
1386 if (context)
1387 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001388 if (!context->getProgram(program))
1389 {
1390 if(context->getShader(program))
1391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001392 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001393 }
1394 else
1395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001396 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001397 }
1398 }
1399
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001400 context->deleteProgram(program);
1401 }
1402 }
1403 catch(std::bad_alloc&)
1404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001405 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001406 }
1407}
1408
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001409void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1410{
1411 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1412
1413 try
1414 {
1415 if (n < 0)
1416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001417 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001418 }
1419
1420 gl::Context *context = gl::getNonLostContext();
1421
1422 if (context)
1423 {
1424 for (int i = 0; i < n; i++)
1425 {
1426 context->deleteQuery(ids[i]);
1427 }
1428 }
1429 }
1430 catch(std::bad_alloc&)
1431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001432 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001433 }
1434}
1435
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001436void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1437{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001438 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001439
1440 try
1441 {
1442 if (n < 0)
1443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001444 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001445 }
1446
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001447 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001448
1449 if (context)
1450 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001451 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001452 {
1453 context->deleteRenderbuffer(renderbuffers[i]);
1454 }
1455 }
1456 }
1457 catch(std::bad_alloc&)
1458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001459 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001460 }
1461}
1462
1463void __stdcall glDeleteShader(GLuint shader)
1464{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001465 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001466
1467 try
1468 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001469 if (shader == 0)
1470 {
1471 return;
1472 }
1473
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001474 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001475
1476 if (context)
1477 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001478 if (!context->getShader(shader))
1479 {
1480 if(context->getProgram(shader))
1481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001482 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001483 }
1484 else
1485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001486 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001487 }
1488 }
1489
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001490 context->deleteShader(shader);
1491 }
1492 }
1493 catch(std::bad_alloc&)
1494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001495 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001496 }
1497}
1498
1499void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1500{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001501 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001502
1503 try
1504 {
1505 if (n < 0)
1506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001507 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001508 }
1509
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001510 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001511
1512 if (context)
1513 {
1514 for (int i = 0; i < n; i++)
1515 {
1516 if (textures[i] != 0)
1517 {
1518 context->deleteTexture(textures[i]);
1519 }
1520 }
1521 }
1522 }
1523 catch(std::bad_alloc&)
1524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001525 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001526 }
1527}
1528
1529void __stdcall glDepthFunc(GLenum func)
1530{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001531 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001532
1533 try
1534 {
1535 switch (func)
1536 {
1537 case GL_NEVER:
1538 case GL_ALWAYS:
1539 case GL_LESS:
1540 case GL_LEQUAL:
1541 case GL_EQUAL:
1542 case GL_GREATER:
1543 case GL_GEQUAL:
1544 case GL_NOTEQUAL:
1545 break;
1546 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001547 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001548 }
1549
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001550 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001551
1552 if (context)
1553 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001554 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001555 }
1556 }
1557 catch(std::bad_alloc&)
1558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001559 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001560 }
1561}
1562
1563void __stdcall glDepthMask(GLboolean flag)
1564{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001565 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001566
1567 try
1568 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001569 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001570
1571 if (context)
1572 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001573 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001574 }
1575 }
1576 catch(std::bad_alloc&)
1577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001578 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001579 }
1580}
1581
1582void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1583{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001584 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001585
1586 try
1587 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001588 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001589
1590 if (context)
1591 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001592 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001593 }
1594 }
1595 catch(std::bad_alloc&)
1596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001597 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001598 }
1599}
1600
1601void __stdcall glDetachShader(GLuint program, GLuint shader)
1602{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001603 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001604
1605 try
1606 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001607 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001608
1609 if (context)
1610 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001611
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001612 gl::Program *programObject = context->getProgram(program);
1613 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001614
1615 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001616 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001617 gl::Shader *shaderByProgramHandle;
1618 shaderByProgramHandle = context->getShader(program);
1619 if (!shaderByProgramHandle)
1620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001621 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001622 }
1623 else
1624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001625 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001626 }
1627 }
1628
1629 if (!shaderObject)
1630 {
1631 gl::Program *programByShaderHandle = context->getProgram(shader);
1632 if (!programByShaderHandle)
1633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001634 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001635 }
1636 else
1637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001638 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001639 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001640 }
1641
1642 if (!programObject->detachShader(shaderObject))
1643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001644 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001645 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001646 }
1647 }
1648 catch(std::bad_alloc&)
1649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001650 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001651 }
1652}
1653
1654void __stdcall glDisable(GLenum cap)
1655{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001656 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001657
1658 try
1659 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001661
1662 if (context)
1663 {
1664 switch (cap)
1665 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001666 case GL_CULL_FACE: context->setCullFace(false); break;
1667 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
1668 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
1669 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
1670 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
1671 case GL_STENCIL_TEST: context->setStencilTest(false); break;
1672 case GL_DEPTH_TEST: context->setDepthTest(false); break;
1673 case GL_BLEND: context->setBlend(false); break;
1674 case GL_DITHER: context->setDither(false); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00001675
1676 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1677 case GL_RASTERIZER_DISCARD:
1678 if (context->getClientVersion() < 3)
1679 {
1680 return gl::error(GL_INVALID_ENUM);
1681 }
1682 UNIMPLEMENTED();
1683 break;
1684
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001685 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001686 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001687 }
1688 }
1689 }
1690 catch(std::bad_alloc&)
1691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001692 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001693 }
1694}
1695
1696void __stdcall glDisableVertexAttribArray(GLuint index)
1697{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001698 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001699
1700 try
1701 {
1702 if (index >= gl::MAX_VERTEX_ATTRIBS)
1703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001704 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001705 }
1706
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001707 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001708
1709 if (context)
1710 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001711 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001712 }
1713 }
1714 catch(std::bad_alloc&)
1715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001716 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001717 }
1718}
1719
1720void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1721{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001722 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001723
1724 try
1725 {
1726 if (count < 0 || first < 0)
1727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001728 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001729 }
1730
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001731 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001732
1733 if (context)
1734 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001735 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001736 }
1737 }
1738 catch(std::bad_alloc&)
1739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001740 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001741 }
1742}
1743
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001744void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1745{
1746 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1747
1748 try
1749 {
1750 if (count < 0 || first < 0 || primcount < 0)
1751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001752 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001753 }
1754
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001755 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001756 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001757 gl::Context *context = gl::getNonLostContext();
1758
1759 if (context)
1760 {
1761 context->drawArrays(mode, first, count, primcount);
1762 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001763 }
1764 }
1765 catch(std::bad_alloc&)
1766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001767 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001768 }
1769}
1770
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001771void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001772{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001773 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 +00001774 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001775
1776 try
1777 {
1778 if (count < 0)
1779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001780 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001781 }
1782
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001783 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001784
1785 if (context)
1786 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001787 switch (type)
1788 {
1789 case GL_UNSIGNED_BYTE:
1790 case GL_UNSIGNED_SHORT:
1791 break;
1792 case GL_UNSIGNED_INT:
1793 if (!context->supports32bitIndices())
1794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001795 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001796 }
1797 break;
1798 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001799 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001800 }
1801
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001802 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803 }
1804 }
1805 catch(std::bad_alloc&)
1806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001807 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001808 }
1809}
1810
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001811void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1812{
1813 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1814 mode, count, type, indices, primcount);
1815
1816 try
1817 {
1818 if (count < 0 || primcount < 0)
1819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001820 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001821 }
1822
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001823 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001824 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001825 gl::Context *context = gl::getNonLostContext();
1826
1827 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001828 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001829 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001830 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001831 case GL_UNSIGNED_BYTE:
1832 case GL_UNSIGNED_SHORT:
1833 break;
1834 case GL_UNSIGNED_INT:
1835 if (!context->supports32bitIndices())
1836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001837 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001838 }
1839 break;
1840 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001841 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001842 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001843
1844 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001845 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001846 }
1847 }
1848 catch(std::bad_alloc&)
1849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001850 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001851 }
1852}
1853
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001854void __stdcall glEnable(GLenum cap)
1855{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001856 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001857
1858 try
1859 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001860 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001861
1862 if (context)
1863 {
1864 switch (cap)
1865 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001866 case GL_CULL_FACE: context->setCullFace(true); break;
1867 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
1868 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
1869 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
1870 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
1871 case GL_STENCIL_TEST: context->setStencilTest(true); break;
1872 case GL_DEPTH_TEST: context->setDepthTest(true); break;
1873 case GL_BLEND: context->setBlend(true); break;
1874 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001875 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001876 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001877 }
1878 }
1879 }
1880 catch(std::bad_alloc&)
1881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001882 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001883 }
1884}
1885
1886void __stdcall glEnableVertexAttribArray(GLuint index)
1887{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001888 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001889
1890 try
1891 {
1892 if (index >= gl::MAX_VERTEX_ATTRIBS)
1893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001894 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001895 }
1896
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001897 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001898
1899 if (context)
1900 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001901 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001902 }
1903 }
1904 catch(std::bad_alloc&)
1905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001906 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001907 }
1908}
1909
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001910void __stdcall glEndQueryEXT(GLenum target)
1911{
1912 EVENT("GLenum target = 0x%X)", target);
1913
1914 try
1915 {
1916 switch (target)
1917 {
1918 case GL_ANY_SAMPLES_PASSED_EXT:
1919 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
1920 break;
1921 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001922 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001923 }
1924
1925 gl::Context *context = gl::getNonLostContext();
1926
1927 if (context)
1928 {
1929 context->endQuery(target);
1930 }
1931 }
1932 catch(std::bad_alloc&)
1933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001934 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001935 }
1936}
1937
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001938void __stdcall glFinishFenceNV(GLuint fence)
1939{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001940 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001941
1942 try
1943 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001944 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001945
1946 if (context)
1947 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001948 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001949
1950 if (fenceObject == NULL)
1951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001952 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001953 }
1954
Jamie Madillfb9a7402013-07-26 11:55:01 -04001955 if (fenceObject->isFence() != GL_TRUE)
1956 {
1957 return gl::error(GL_INVALID_OPERATION);
1958 }
1959
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001960 fenceObject->finishFence();
1961 }
1962 }
1963 catch(std::bad_alloc&)
1964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001965 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001966 }
1967}
1968
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001969void __stdcall glFinish(void)
1970{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001971 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001972
1973 try
1974 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001975 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001976
1977 if (context)
1978 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001979 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001980 }
1981 }
1982 catch(std::bad_alloc&)
1983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001984 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001985 }
1986}
1987
1988void __stdcall glFlush(void)
1989{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001990 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001991
1992 try
1993 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001994 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001995
1996 if (context)
1997 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001998 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001999 }
2000 }
2001 catch(std::bad_alloc&)
2002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002003 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002004 }
2005}
2006
2007void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2008{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002009 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002010 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002011
2012 try
2013 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002014 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002015 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002017 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002018 }
2019
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002020 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002021
2022 if (context)
2023 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002024 gl::Framebuffer *framebuffer = NULL;
2025 GLuint framebufferHandle = 0;
2026 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2027 {
2028 framebuffer = context->getReadFramebuffer();
2029 framebufferHandle = context->getReadFramebufferHandle();
2030 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002031 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002032 {
2033 framebuffer = context->getDrawFramebuffer();
2034 framebufferHandle = context->getDrawFramebufferHandle();
2035 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002036
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002037 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002039 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002040 }
2041
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002042 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002043 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002044 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2045
2046 if (colorAttachment >= context->getMaximumRenderTargets())
2047 {
2048 return gl::error(GL_INVALID_VALUE);
2049 }
2050
Geoff Lang309c92a2013-07-25 16:23:19 -04002051 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002052 }
2053 else
2054 {
2055 switch (attachment)
2056 {
2057 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002058 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002059 break;
2060 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002061 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002062 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04002063 case GL_DEPTH_STENCIL_ATTACHMENT:
2064 if (context->getClientVersion() < 3)
2065 {
2066 return gl::error(GL_INVALID_ENUM);
2067 }
2068 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
2069 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002070 default:
2071 return gl::error(GL_INVALID_ENUM);
2072 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002073 }
2074 }
2075 }
2076 catch(std::bad_alloc&)
2077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002078 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002079 }
2080}
2081
2082void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2083{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002084 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002085 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002086
2087 try
2088 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002089 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002090 if (context)
2091 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002092 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002093 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002094 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002095 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002096 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04002097
2098 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002099 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002100 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002101 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002102 }
2103
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002104 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002105 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002106 textarget = GL_NONE;
2107 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002108
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002109 gl::Framebuffer *framebuffer = NULL;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002110 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2111 {
2112 framebuffer = context->getReadFramebuffer();
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002113 }
2114 else
2115 {
2116 framebuffer = context->getDrawFramebuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002117 }
2118
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002119 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002120 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002121 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04002122 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002123 }
2124 else
2125 {
2126 switch (attachment)
2127 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002128 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2129 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2130 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002131 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002132 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002133 }
2134 }
2135 catch(std::bad_alloc&)
2136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002137 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002138 }
2139}
2140
2141void __stdcall glFrontFace(GLenum mode)
2142{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002143 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002144
2145 try
2146 {
2147 switch (mode)
2148 {
2149 case GL_CW:
2150 case GL_CCW:
2151 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002152 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002153
2154 if (context)
2155 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002156 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002157 }
2158 }
2159 break;
2160 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002161 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002162 }
2163 }
2164 catch(std::bad_alloc&)
2165 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002166 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002167 }
2168}
2169
2170void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2171{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002172 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002173
2174 try
2175 {
2176 if (n < 0)
2177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002178 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002179 }
2180
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002181 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002182
2183 if (context)
2184 {
2185 for (int i = 0; i < n; i++)
2186 {
2187 buffers[i] = context->createBuffer();
2188 }
2189 }
2190 }
2191 catch(std::bad_alloc&)
2192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002193 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002194 }
2195}
2196
2197void __stdcall glGenerateMipmap(GLenum target)
2198{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002199 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002200
2201 try
2202 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002203 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002204
2205 if (context)
2206 {
Geoff Langae4852a2013-06-05 15:00:34 -04002207 gl::Texture *texture = NULL;
2208 GLint internalFormat = GL_NONE;
Geoff Langae4852a2013-06-05 15:00:34 -04002209
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002210 switch (target)
2211 {
2212 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002213 {
2214 gl::Texture2D *tex2d = context->getTexture2D();
Geoff Langae4852a2013-06-05 15:00:34 -04002215 if (tex2d)
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002216 {
Geoff Langae4852a2013-06-05 15:00:34 -04002217 internalFormat = tex2d->getInternalFormat(0);
Geoff Langae4852a2013-06-05 15:00:34 -04002218 texture = tex2d;
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002219 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002220 break;
2221 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002222
2223 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002224 {
2225 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
Geoff Langae4852a2013-06-05 15:00:34 -04002226 if (texcube)
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002227 {
Geoff Langae4852a2013-06-05 15:00:34 -04002228 internalFormat = texcube->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
Geoff Langae4852a2013-06-05 15:00:34 -04002229 texture = texcube;
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002230 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002231 break;
2232 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002233
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00002234 case GL_TEXTURE_3D:
2235 {
2236 if (context->getClientVersion() < 3)
2237 {
2238 return gl::error(GL_INVALID_ENUM);
2239 }
2240
2241 gl::Texture3D *tex3D = context->getTexture3D();
Geoff Langae4852a2013-06-05 15:00:34 -04002242 if (tex3D)
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00002243 {
Geoff Langae4852a2013-06-05 15:00:34 -04002244 internalFormat = tex3D->getInternalFormat(0);
Geoff Langae4852a2013-06-05 15:00:34 -04002245 texture = tex3D;
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00002246 }
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00002247 break;
2248 }
2249
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00002250 case GL_TEXTURE_2D_ARRAY:
2251 {
2252 if (context->getClientVersion() < 3)
2253 {
2254 return gl::error(GL_INVALID_ENUM);
2255 }
2256
2257 gl::Texture2DArray *tex2darr = context->getTexture2DArray();
Geoff Langae4852a2013-06-05 15:00:34 -04002258 if (tex2darr)
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00002259 {
Geoff Langae4852a2013-06-05 15:00:34 -04002260 internalFormat = tex2darr->getInternalFormat(0);
Geoff Langae4852a2013-06-05 15:00:34 -04002261 texture = tex2darr;
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00002262 }
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00002263 break;
2264 }
2265
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002266 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002267 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002268 }
Geoff Langae4852a2013-06-05 15:00:34 -04002269
2270 if (!texture)
2271 {
2272 return gl::error(GL_INVALID_OPERATION);
2273 }
2274
2275 // Internally, all texture formats are sized so checking if the format
2276 // is color renderable and filterable will not fail.
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002277 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2278 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Geoff Langae4852a2013-06-05 15:00:34 -04002279 !gl::IsColorRenderingSupported(internalFormat, context) ||
2280 !gl::IsTextureFilteringSupported(internalFormat, context))
2281 {
2282 return gl::error(GL_INVALID_OPERATION);
2283 }
2284
2285 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002286 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002287 }
2288 catch(std::bad_alloc&)
2289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002290 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002291 }
2292}
2293
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002294void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2295{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002296 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002297
2298 try
2299 {
2300 if (n < 0)
2301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002302 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002303 }
2304
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002305 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002306
2307 if (context)
2308 {
2309 for (int i = 0; i < n; i++)
2310 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002311 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002312 }
2313 }
2314 }
2315 catch(std::bad_alloc&)
2316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002317 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002318 }
2319}
2320
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002321void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2322{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002323 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002324
2325 try
2326 {
2327 if (n < 0)
2328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002329 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002330 }
2331
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002332 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002333
2334 if (context)
2335 {
2336 for (int i = 0; i < n; i++)
2337 {
2338 framebuffers[i] = context->createFramebuffer();
2339 }
2340 }
2341 }
2342 catch(std::bad_alloc&)
2343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002344 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002345 }
2346}
2347
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002348void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2349{
2350 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2351
2352 try
2353 {
2354 if (n < 0)
2355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002356 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002357 }
2358
2359 gl::Context *context = gl::getNonLostContext();
2360
2361 if (context)
2362 {
2363 for (int i = 0; i < n; i++)
2364 {
2365 ids[i] = context->createQuery();
2366 }
2367 }
2368 }
2369 catch(std::bad_alloc&)
2370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002371 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002372 }
2373}
2374
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002375void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2376{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002377 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002378
2379 try
2380 {
2381 if (n < 0)
2382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002383 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002384 }
2385
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002386 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002387
2388 if (context)
2389 {
2390 for (int i = 0; i < n; i++)
2391 {
2392 renderbuffers[i] = context->createRenderbuffer();
2393 }
2394 }
2395 }
2396 catch(std::bad_alloc&)
2397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002398 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002399 }
2400}
2401
2402void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2403{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002404 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002405
2406 try
2407 {
2408 if (n < 0)
2409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002410 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002411 }
2412
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002413 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002414
2415 if (context)
2416 {
2417 for (int i = 0; i < n; i++)
2418 {
2419 textures[i] = context->createTexture();
2420 }
2421 }
2422 }
2423 catch(std::bad_alloc&)
2424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002425 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002426 }
2427}
2428
daniel@transgaming.com85423182010-04-22 13:35:27 +00002429void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002431 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002432 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002433 program, index, bufsize, length, size, type, name);
2434
2435 try
2436 {
2437 if (bufsize < 0)
2438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002439 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002440 }
2441
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002442 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002443
2444 if (context)
2445 {
2446 gl::Program *programObject = context->getProgram(program);
2447
2448 if (!programObject)
2449 {
2450 if (context->getShader(program))
2451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002452 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002453 }
2454 else
2455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002456 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002457 }
2458 }
2459
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002460 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002462 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002463 }
2464
2465 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2466 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002467 }
2468 catch(std::bad_alloc&)
2469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002470 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002471 }
2472}
2473
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002474void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002476 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002477 "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 +00002478 program, index, bufsize, length, size, type, name);
2479
2480 try
2481 {
2482 if (bufsize < 0)
2483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002484 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002485 }
2486
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002487 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002488
2489 if (context)
2490 {
2491 gl::Program *programObject = context->getProgram(program);
2492
2493 if (!programObject)
2494 {
2495 if (context->getShader(program))
2496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002497 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002498 }
2499 else
2500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002501 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002502 }
2503 }
2504
2505 if (index >= (GLuint)programObject->getActiveUniformCount())
2506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002507 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002508 }
2509
2510 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2511 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002512 }
2513 catch(std::bad_alloc&)
2514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002515 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002516 }
2517}
2518
2519void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2520{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002521 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 +00002522 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002523
2524 try
2525 {
2526 if (maxcount < 0)
2527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002528 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002529 }
2530
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002531 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002532
2533 if (context)
2534 {
2535 gl::Program *programObject = context->getProgram(program);
2536
2537 if (!programObject)
2538 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002539 if (context->getShader(program))
2540 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002541 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002542 }
2543 else
2544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002545 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002546 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002547 }
2548
2549 return programObject->getAttachedShaders(maxcount, count, shaders);
2550 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002551 }
2552 catch(std::bad_alloc&)
2553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002554 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002555 }
2556}
2557
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002558int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002559{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002560 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002561
2562 try
2563 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002565
2566 if (context)
2567 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002568
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002569 gl::Program *programObject = context->getProgram(program);
2570
2571 if (!programObject)
2572 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002573 if (context->getShader(program))
2574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002575 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002576 }
2577 else
2578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002579 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002580 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002581 }
2582
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002583 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002584 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002586 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002587 }
2588
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002589 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002590 }
2591 }
2592 catch(std::bad_alloc&)
2593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002594 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002595 }
2596
2597 return -1;
2598}
2599
2600void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2601{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002602 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002603
2604 try
2605 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002606 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002607
2608 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002609 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002610 if (!(context->getBooleanv(pname, params)))
2611 {
2612 GLenum nativeType;
2613 unsigned int numParams = 0;
2614 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002615 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002616
2617 if (numParams == 0)
2618 return; // it is known that the pname is valid, but there are no parameters to return
2619
2620 if (nativeType == GL_FLOAT)
2621 {
2622 GLfloat *floatParams = NULL;
2623 floatParams = new GLfloat[numParams];
2624
2625 context->getFloatv(pname, floatParams);
2626
2627 for (unsigned int i = 0; i < numParams; ++i)
2628 {
2629 if (floatParams[i] == 0.0f)
2630 params[i] = GL_FALSE;
2631 else
2632 params[i] = GL_TRUE;
2633 }
2634
2635 delete [] floatParams;
2636 }
2637 else if (nativeType == GL_INT)
2638 {
2639 GLint *intParams = NULL;
2640 intParams = new GLint[numParams];
2641
2642 context->getIntegerv(pname, intParams);
2643
2644 for (unsigned int i = 0; i < numParams; ++i)
2645 {
2646 if (intParams[i] == 0)
2647 params[i] = GL_FALSE;
2648 else
2649 params[i] = GL_TRUE;
2650 }
2651
2652 delete [] intParams;
2653 }
Jamie Madill71fbd602013-07-19 16:36:55 -04002654 else if (nativeType == GL_INT_64_ANGLEX)
2655 {
2656 GLint64 *int64Params = NULL;
2657 int64Params = new GLint64[numParams];
2658
2659 context->getInteger64v(pname, int64Params);
2660
2661 for (unsigned int i = 0; i < numParams; ++i)
2662 {
2663 if (int64Params[i] == 0)
2664 params[i] = GL_FALSE;
2665 else
2666 params[i] = GL_TRUE;
2667 }
2668
2669 delete [] int64Params;
2670 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002671 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002672 }
2673 }
2674 catch(std::bad_alloc&)
2675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002676 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002677 }
2678}
2679
2680void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2681{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002682 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 +00002683
2684 try
2685 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002686 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002687
2688 if (context)
2689 {
2690 gl::Buffer *buffer;
2691
2692 switch (target)
2693 {
2694 case GL_ARRAY_BUFFER:
2695 buffer = context->getArrayBuffer();
2696 break;
2697 case GL_ELEMENT_ARRAY_BUFFER:
2698 buffer = context->getElementArrayBuffer();
2699 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002700 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002701 }
2702
2703 if (!buffer)
2704 {
2705 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002706 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002707 }
2708
2709 switch (pname)
2710 {
2711 case GL_BUFFER_USAGE:
2712 *params = buffer->usage();
2713 break;
2714 case GL_BUFFER_SIZE:
2715 *params = buffer->size();
2716 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002717 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002718 }
2719 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002720 }
2721 catch(std::bad_alloc&)
2722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002723 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002724 }
2725}
2726
2727GLenum __stdcall glGetError(void)
2728{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002729 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002730
2731 gl::Context *context = gl::getContext();
2732
2733 if (context)
2734 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002735 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002736 }
2737
2738 return GL_NO_ERROR;
2739}
2740
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002741void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2742{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002743 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002744
2745 try
2746 {
2747
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002748 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002749
2750 if (context)
2751 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002752 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002753
2754 if (fenceObject == NULL)
2755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002756 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002757 }
2758
Jamie Madillfb9a7402013-07-26 11:55:01 -04002759 if (fenceObject->isFence() != GL_TRUE)
2760 {
2761 return gl::error(GL_INVALID_OPERATION);
2762 }
2763
2764 switch (pname)
2765 {
2766 case GL_FENCE_STATUS_NV:
2767 case GL_FENCE_CONDITION_NV:
2768 break;
2769
2770 default: return gl::error(GL_INVALID_ENUM);
2771 }
2772
2773 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002774 }
2775 }
2776 catch(std::bad_alloc&)
2777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002778 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002779 }
2780}
2781
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002782void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2783{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002784 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002785
2786 try
2787 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002788 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002789
2790 if (context)
2791 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002792 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002793 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002794 GLenum nativeType;
2795 unsigned int numParams = 0;
2796 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002797 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002798
2799 if (numParams == 0)
2800 return; // it is known that the pname is valid, but that there are no parameters to return.
2801
2802 if (nativeType == GL_BOOL)
2803 {
2804 GLboolean *boolParams = NULL;
2805 boolParams = new GLboolean[numParams];
2806
2807 context->getBooleanv(pname, boolParams);
2808
2809 for (unsigned int i = 0; i < numParams; ++i)
2810 {
2811 if (boolParams[i] == GL_FALSE)
2812 params[i] = 0.0f;
2813 else
2814 params[i] = 1.0f;
2815 }
2816
2817 delete [] boolParams;
2818 }
2819 else if (nativeType == GL_INT)
2820 {
2821 GLint *intParams = NULL;
2822 intParams = new GLint[numParams];
2823
2824 context->getIntegerv(pname, intParams);
2825
2826 for (unsigned int i = 0; i < numParams; ++i)
2827 {
Jamie Madill71fbd602013-07-19 16:36:55 -04002828 params[i] = static_cast<GLfloat>(intParams[i]);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002829 }
2830
2831 delete [] intParams;
2832 }
Jamie Madill71fbd602013-07-19 16:36:55 -04002833 else if (nativeType == GL_INT_64_ANGLEX)
2834 {
2835 GLint64 *int64Params = NULL;
2836 int64Params = new GLint64[numParams];
2837
2838 context->getInteger64v(pname, int64Params);
2839
2840 for (unsigned int i = 0; i < numParams; ++i)
2841 {
2842 params[i] = static_cast<GLfloat>(int64Params[i]);
2843 }
2844
2845 delete [] int64Params;
2846 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002847 }
2848 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002849 }
2850 catch(std::bad_alloc&)
2851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002852 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002853 }
2854}
2855
2856void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2857{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002858 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 +00002859 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002860
2861 try
2862 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002863 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002864
2865 if (context)
2866 {
Geoff Lang646559f2013-08-15 11:08:15 -04002867 META_ASSERT(GL_DRAW_FRAMEBUFFER_ANGLE == GL_DRAW_FRAMEBUFFER && GL_READ_FRAMEBUFFER_ANGLE == GL_READ_FRAMEBUFFER);
2868 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002870 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002871 }
2872
Geoff Lang646559f2013-08-15 11:08:15 -04002873 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002874 {
Geoff Lang646559f2013-08-15 11:08:15 -04002875 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2876 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2877 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2878 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2879 break;
2880 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2881 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2882 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2883 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2884 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2885 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2886 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2887 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2888 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2889 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002890 {
Geoff Lang646559f2013-08-15 11:08:15 -04002891 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002892 }
Geoff Lang646559f2013-08-15 11:08:15 -04002893 default:
2894 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002895 }
Geoff Lang646559f2013-08-15 11:08:15 -04002896
2897 // Determine if the attachment is a valid enum
2898 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002899 {
Geoff Lang646559f2013-08-15 11:08:15 -04002900 case GL_BACK:
2901 case GL_FRONT:
2902 case GL_STENCIL:
2903 case GL_DEPTH_STENCIL_ATTACHMENT:
2904 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002905 {
Geoff Lang646559f2013-08-15 11:08:15 -04002906 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002907 }
Geoff Lang646559f2013-08-15 11:08:15 -04002908 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002909
Geoff Lang646559f2013-08-15 11:08:15 -04002910 case GL_DEPTH_ATTACHMENT:
2911 case GL_STENCIL_ATTACHMENT:
2912 break;
2913
2914 default:
2915 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2916 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2917 {
2918 return gl::error(GL_INVALID_ENUM);
2919 }
2920 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002921 }
2922
Geoff Lang646559f2013-08-15 11:08:15 -04002923 GLuint framebufferHandle = (target == GL_READ_FRAMEBUFFER) ? context->getReadFramebufferHandle()
2924 : context->getDrawFramebufferHandle();
2925
2926 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2927
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002928 GLenum attachmentType;
2929 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002930 GLuint attachmentLevel;
2931 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002932 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002933
Geoff Lang646559f2013-08-15 11:08:15 -04002934 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002935 {
Geoff Lang646559f2013-08-15 11:08:15 -04002936 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002937 {
Geoff Lang646559f2013-08-15 11:08:15 -04002938 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002939 }
2940
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002941 switch (attachment)
2942 {
Geoff Lang646559f2013-08-15 11:08:15 -04002943 case GL_BACK:
2944 attachmentType = framebuffer->getColorbufferType(0);
2945 attachmentHandle = framebuffer->getColorbufferHandle(0);
2946 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2947 attachmentLayer = framebuffer->getColorbufferLayer(0);
2948 renderbuffer = framebuffer->getColorbuffer(0);
2949 break;
2950 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002951 attachmentType = framebuffer->getDepthbufferType();
2952 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002953 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2954 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002955 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002956 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002957 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002958 attachmentType = framebuffer->getStencilbufferType();
2959 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002960 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2961 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002962 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002963 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002964 default:
2965 return gl::error(GL_INVALID_OPERATION);
2966 }
2967 }
2968 else
2969 {
2970 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2971 {
2972 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2973 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2974 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2975 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2976 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2977 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2978 }
2979 else
2980 {
2981 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002982 {
Geoff Lang646559f2013-08-15 11:08:15 -04002983 case GL_DEPTH_ATTACHMENT:
2984 attachmentType = framebuffer->getDepthbufferType();
2985 attachmentHandle = framebuffer->getDepthbufferHandle();
2986 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2987 attachmentLayer = framebuffer->getDepthbufferLayer();
2988 renderbuffer = framebuffer->getDepthbuffer();
2989 break;
2990 case GL_STENCIL_ATTACHMENT:
2991 attachmentType = framebuffer->getStencilbufferType();
2992 attachmentHandle = framebuffer->getStencilbufferHandle();
2993 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2994 attachmentLayer = framebuffer->getStencilbufferLayer();
2995 renderbuffer = framebuffer->getStencilbuffer();
2996 break;
2997 case GL_DEPTH_STENCIL_ATTACHMENT:
2998 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2999 {
3000 return gl::error(GL_INVALID_OPERATION);
3001 }
3002 attachmentType = framebuffer->getDepthStencilbufferType();
3003 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
3004 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
3005 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
3006 renderbuffer = framebuffer->getDepthStencilBuffer();
3007 break;
3008 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04003009 return gl::error(GL_INVALID_OPERATION);
3010 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003011 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003012 }
3013
3014 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04003015 if (framebufferHandle == 0)
3016 {
3017 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
3018 }
3019 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003020 {
3021 attachmentObjectType = attachmentType;
3022 }
Geoff Lang0fe19492013-07-25 17:04:31 -04003023 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003024 {
3025 attachmentObjectType = GL_TEXTURE;
3026 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003027 else
3028 {
3029 UNREACHABLE();
3030 return;
3031 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003032
Geoff Lang646559f2013-08-15 11:08:15 -04003033 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003034 {
Geoff Lang646559f2013-08-15 11:08:15 -04003035 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
3036 // is NONE, then querying any other pname will generate INVALID_ENUM.
3037
3038 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
3039 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
3040 // INVALID_OPERATION for all other pnames
3041
3042 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003043 {
Geoff Lang646559f2013-08-15 11:08:15 -04003044 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3045 *params = attachmentObjectType;
3046 break;
3047
3048 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3049 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003050 {
Geoff Lang646559f2013-08-15 11:08:15 -04003051 return gl::error(GL_INVALID_ENUM);
3052 }
3053 *params = 0;
3054 break;
3055
3056 default:
3057 if (context->getClientVersion() < 3)
3058 {
3059 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003060 }
3061 else
3062 {
Geoff Lang646559f2013-08-15 11:08:15 -04003063 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003064 }
3065 }
Geoff Lang646559f2013-08-15 11:08:15 -04003066 }
3067 else
3068 {
3069 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
3070 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
3071 ASSERT(renderbuffer != NULL);
3072
3073 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003074 {
Geoff Lang646559f2013-08-15 11:08:15 -04003075 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3076 *params = attachmentObjectType;
3077 break;
3078
3079 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3080 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
3081 {
3082 return gl::error(GL_INVALID_ENUM);
3083 }
3084 *params = attachmentHandle;
3085 break;
3086
3087 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3088 if (attachmentObjectType != GL_TEXTURE)
3089 {
3090 return gl::error(GL_INVALID_ENUM);
3091 }
3092 *params = attachmentLevel;
3093 break;
3094
3095 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3096 if (attachmentObjectType != GL_TEXTURE)
3097 {
3098 return gl::error(GL_INVALID_ENUM);
3099 }
3100 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
3101 break;
3102
3103 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
3104 *params = renderbuffer->getRedSize();
3105 break;
3106
3107 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
3108 *params = renderbuffer->getGreenSize();
3109 break;
3110
3111 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
3112 *params = renderbuffer->getBlueSize();
3113 break;
3114
3115 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
3116 *params = renderbuffer->getAlphaSize();
3117 break;
3118
3119 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
3120 *params = renderbuffer->getDepthSize();
3121 break;
3122
3123 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
3124 *params = renderbuffer->getStencilSize();
3125 break;
3126
3127 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
3128 if (attachment == GL_DEPTH_STENCIL)
3129 {
3130 gl::error(GL_INVALID_OPERATION);
3131 }
3132 *params = renderbuffer->getComponentType();
3133 break;
3134
3135 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
3136 *params = renderbuffer->getColorEncoding();
3137 break;
3138
3139 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
3140 if (attachmentObjectType != GL_TEXTURE)
3141 {
3142 return gl::error(GL_INVALID_ENUM);
3143 }
3144 *params = attachmentLayer;
3145 break;
3146
3147 default:
3148 UNREACHABLE();
3149 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003150 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003151 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003152 }
3153 }
3154 catch(std::bad_alloc&)
3155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003156 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003157 }
3158}
3159
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003160GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3161{
3162 EVENT("()");
3163
3164 try
3165 {
3166 gl::Context *context = gl::getContext();
3167
3168 if (context)
3169 {
3170 return context->getResetStatus();
3171 }
3172
3173 return GL_NO_ERROR;
3174 }
3175 catch(std::bad_alloc&)
3176 {
3177 return GL_OUT_OF_MEMORY;
3178 }
3179}
3180
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003181void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3182{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003183 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003184
3185 try
3186 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003187 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003188
3189 if (context)
3190 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003191 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003192 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003193 GLenum nativeType;
3194 unsigned int numParams = 0;
3195 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003196 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003197
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003198 if (numParams == 0)
3199 return; // it is known that pname is valid, but there are no parameters to return
3200
3201 if (nativeType == GL_BOOL)
3202 {
3203 GLboolean *boolParams = NULL;
3204 boolParams = new GLboolean[numParams];
3205
3206 context->getBooleanv(pname, boolParams);
3207
3208 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003209 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003210 if (boolParams[i] == GL_FALSE)
3211 params[i] = 0;
3212 else
3213 params[i] = 1;
3214 }
3215
3216 delete [] boolParams;
3217 }
3218 else if (nativeType == GL_FLOAT)
3219 {
3220 GLfloat *floatParams = NULL;
3221 floatParams = new GLfloat[numParams];
3222
3223 context->getFloatv(pname, floatParams);
3224
3225 for (unsigned int i = 0; i < numParams; ++i)
3226 {
Jamie Madill71fbd602013-07-19 16:36:55 -04003227 // 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 +00003228 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 +00003229 {
Jamie Madill71fbd602013-07-19 16:36:55 -04003230 params[i] = static_cast<GLint>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003231 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003232 else
Jamie Madill71fbd602013-07-19 16:36:55 -04003233 {
Jamie Madillaf496912013-07-19 16:36:54 -04003234 params[i] = gl::iround<GLint>(floatParams[i]);
Jamie Madill71fbd602013-07-19 16:36:55 -04003235 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003236 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003237
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003238 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003239 }
Jamie Madill71fbd602013-07-19 16:36:55 -04003240 else if (nativeType == GL_INT_64_ANGLEX)
3241 {
3242 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
3243 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
3244 GLint64 *int64Params = NULL;
3245 int64Params = new GLint64[numParams];
3246
3247 context->getInteger64v(pname, int64Params);
3248
3249 for (unsigned int i = 0; i < numParams; ++i)
3250 {
3251 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
3252 params[i] = static_cast<GLint>(clampedValue);
3253 }
3254
3255 delete [] int64Params;
3256 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003257 }
3258 }
3259 }
3260 catch(std::bad_alloc&)
3261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003262 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003263 }
3264}
3265
3266void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3267{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003268 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003269
3270 try
3271 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003272 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003273
3274 if (context)
3275 {
3276 gl::Program *programObject = context->getProgram(program);
3277
3278 if (!programObject)
3279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003280 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003281 }
3282
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003283 if (context->getClientVersion() < 3)
3284 {
3285 switch (pname)
3286 {
3287 case GL_ACTIVE_UNIFORM_BLOCKS:
3288 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3289 return gl::error(GL_INVALID_ENUM);
3290 }
3291 }
3292
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003293 switch (pname)
3294 {
3295 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003296 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003297 return;
3298 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003299 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003300 return;
3301 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003302 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003303 return;
3304 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003305 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003306 return;
3307 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003308 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003309 return;
3310 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003311 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003312 return;
3313 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003314 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003315 return;
3316 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003317 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003318 return;
3319 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003320 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003321 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003322 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003323 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003324 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003325 case GL_ACTIVE_UNIFORM_BLOCKS:
3326 *params = programObject->getActiveUniformBlockCount();
3327 return;
3328 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3329 *params = programObject->getActiveUniformBlockMaxLength();
3330 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003331 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003332 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003333 }
3334 }
3335 }
3336 catch(std::bad_alloc&)
3337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003338 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003339 }
3340}
3341
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003342void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003343{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003344 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 +00003345 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003346
3347 try
3348 {
3349 if (bufsize < 0)
3350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003351 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003352 }
3353
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003354 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003355
3356 if (context)
3357 {
3358 gl::Program *programObject = context->getProgram(program);
3359
3360 if (!programObject)
3361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003362 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003363 }
3364
3365 programObject->getInfoLog(bufsize, length, infolog);
3366 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003367 }
3368 catch(std::bad_alloc&)
3369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003370 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003371 }
3372}
3373
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003374void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3375{
3376 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3377
3378 try
3379 {
3380 switch (pname)
3381 {
3382 case GL_CURRENT_QUERY_EXT:
3383 break;
3384 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003385 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003386 }
3387
3388 gl::Context *context = gl::getNonLostContext();
3389
3390 if (context)
3391 {
3392 params[0] = context->getActiveQuery(target);
3393 }
3394 }
3395 catch(std::bad_alloc&)
3396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003397 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003398 }
3399}
3400
3401void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3402{
3403 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3404
3405 try
3406 {
3407 switch (pname)
3408 {
3409 case GL_QUERY_RESULT_EXT:
3410 case GL_QUERY_RESULT_AVAILABLE_EXT:
3411 break;
3412 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003413 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003414 }
3415 gl::Context *context = gl::getNonLostContext();
3416
3417 if (context)
3418 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003419 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3420
3421 if (!queryObject)
3422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003423 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003424 }
3425
3426 if (context->getActiveQuery(queryObject->getType()) == id)
3427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003428 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003429 }
3430
3431 switch(pname)
3432 {
3433 case GL_QUERY_RESULT_EXT:
3434 params[0] = queryObject->getResult();
3435 break;
3436 case GL_QUERY_RESULT_AVAILABLE_EXT:
3437 params[0] = queryObject->isResultAvailable();
3438 break;
3439 default:
3440 ASSERT(false);
3441 }
3442 }
3443 }
3444 catch(std::bad_alloc&)
3445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003446 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003447 }
3448}
3449
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003450void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3451{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003452 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 +00003453
3454 try
3455 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003456 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003457
3458 if (context)
3459 {
3460 if (target != GL_RENDERBUFFER)
3461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003462 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003463 }
3464
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003465 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003467 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003468 }
3469
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003470 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003471
3472 switch (pname)
3473 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003474 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3475 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3476 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3477 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3478 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3479 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3480 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3481 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3482 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003483 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003484 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003485 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003486 *params = renderbuffer->getSamples();
3487 }
3488 else
3489 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003490 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003491 }
3492 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003493 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003494 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003495 }
3496 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003497 }
3498 catch(std::bad_alloc&)
3499 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003500 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003501 }
3502}
3503
3504void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3505{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003506 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003507
3508 try
3509 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003510 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003511
3512 if (context)
3513 {
3514 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003515
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003516 if (!shaderObject)
3517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003518 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003519 }
3520
3521 switch (pname)
3522 {
3523 case GL_SHADER_TYPE:
3524 *params = shaderObject->getType();
3525 return;
3526 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003527 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003528 return;
3529 case GL_COMPILE_STATUS:
3530 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3531 return;
3532 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003533 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003534 return;
3535 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003536 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003537 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003538 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3539 *params = shaderObject->getTranslatedSourceLength();
3540 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003541 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003542 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003543 }
3544 }
3545 }
3546 catch(std::bad_alloc&)
3547 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003548 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003549 }
3550}
3551
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003552void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003553{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003554 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 +00003555 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003556
3557 try
3558 {
3559 if (bufsize < 0)
3560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003561 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003562 }
3563
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003565
3566 if (context)
3567 {
3568 gl::Shader *shaderObject = context->getShader(shader);
3569
3570 if (!shaderObject)
3571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003572 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003573 }
3574
3575 shaderObject->getInfoLog(bufsize, length, infolog);
3576 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003577 }
3578 catch(std::bad_alloc&)
3579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003580 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003581 }
3582}
3583
3584void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3585{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003586 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 +00003587 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003588
3589 try
3590 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003591 switch (shadertype)
3592 {
3593 case GL_VERTEX_SHADER:
3594 case GL_FRAGMENT_SHADER:
3595 break;
3596 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003597 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003598 }
3599
3600 switch (precisiontype)
3601 {
3602 case GL_LOW_FLOAT:
3603 case GL_MEDIUM_FLOAT:
3604 case GL_HIGH_FLOAT:
3605 // Assume IEEE 754 precision
3606 range[0] = 127;
3607 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003608 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003609 break;
3610 case GL_LOW_INT:
3611 case GL_MEDIUM_INT:
3612 case GL_HIGH_INT:
3613 // Some (most) hardware only supports single-precision floating-point numbers,
3614 // which can accurately represent integers up to +/-16777216
3615 range[0] = 24;
3616 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003617 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003618 break;
3619 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003620 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003621 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003622 }
3623 catch(std::bad_alloc&)
3624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003625 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003626 }
3627}
3628
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003629void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003630{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003631 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 +00003632 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003633
3634 try
3635 {
3636 if (bufsize < 0)
3637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003638 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003639 }
3640
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003641 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003642
3643 if (context)
3644 {
3645 gl::Shader *shaderObject = context->getShader(shader);
3646
3647 if (!shaderObject)
3648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003649 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003650 }
3651
3652 shaderObject->getSource(bufsize, length, source);
3653 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003654 }
3655 catch(std::bad_alloc&)
3656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003657 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003658 }
3659}
3660
zmo@google.coma574f782011-10-03 21:45:23 +00003661void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3662{
3663 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3664 shader, bufsize, length, source);
3665
3666 try
3667 {
3668 if (bufsize < 0)
3669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003670 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003671 }
3672
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003673 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003674
3675 if (context)
3676 {
3677 gl::Shader *shaderObject = context->getShader(shader);
3678
3679 if (!shaderObject)
3680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003681 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003682 }
3683
3684 shaderObject->getTranslatedSource(bufsize, length, source);
3685 }
3686 }
3687 catch(std::bad_alloc&)
3688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003689 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003690 }
3691}
3692
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003693const GLubyte* __stdcall glGetString(GLenum name)
3694{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003695 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003696
3697 try
3698 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003699 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003700
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003701 switch (name)
3702 {
3703 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003704 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003705 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003706 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003707 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003708 if (context->getClientVersion() == 2)
3709 {
3710 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
3711 }
3712 else
3713 {
3714 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
3715 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003716 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003717 if (context->getClientVersion() == 2)
3718 {
3719 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
3720 }
3721 else
3722 {
3723 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
3724 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003725 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003726 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003727 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003728 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003729 }
3730 }
3731 catch(std::bad_alloc&)
3732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003733 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003734 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003735}
3736
3737void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3738{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003739 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 +00003740
3741 try
3742 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003743 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003744
3745 if (context)
3746 {
Jamie Madillfb8a8302013-07-03 14:24:12 -04003747 gl::Texture *texture = getTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003748
Jamie Madillfb8a8302013-07-03 14:24:12 -04003749 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003751 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003752 }
3753
3754 switch (pname)
3755 {
3756 case GL_TEXTURE_MAG_FILTER:
3757 *params = (GLfloat)texture->getMagFilter();
3758 break;
3759 case GL_TEXTURE_MIN_FILTER:
3760 *params = (GLfloat)texture->getMinFilter();
3761 break;
3762 case GL_TEXTURE_WRAP_S:
3763 *params = (GLfloat)texture->getWrapS();
3764 break;
3765 case GL_TEXTURE_WRAP_T:
3766 *params = (GLfloat)texture->getWrapT();
3767 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003768 case GL_TEXTURE_WRAP_R:
3769 if (context->getClientVersion() < 3)
3770 {
3771 return gl::error(GL_INVALID_ENUM);
3772 }
3773 *params = (GLfloat)texture->getWrapR();
3774 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003775 case GL_TEXTURE_IMMUTABLE_FORMAT:
3776 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003777 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3778 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003779 case GL_TEXTURE_IMMUTABLE_LEVELS:
3780 if (context->getClientVersion() < 3)
3781 {
3782 return gl::error(GL_INVALID_ENUM);
3783 }
3784 *params = (GLfloat)(texture->isImmutable() ? texture->levelCount() : 0);
3785 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003786 case GL_TEXTURE_USAGE_ANGLE:
3787 *params = (GLfloat)texture->getUsage();
3788 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003789 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3790 if (!context->supportsTextureFilterAnisotropy())
3791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003792 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003793 }
3794 *params = (GLfloat)texture->getMaxAnisotropy();
3795 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003796 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003797 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003798 }
3799 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003800 }
3801 catch(std::bad_alloc&)
3802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003803 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003804 }
3805}
3806
3807void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3808{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003809 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 +00003810
3811 try
3812 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003813 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003814
3815 if (context)
3816 {
Jamie Madillfb8a8302013-07-03 14:24:12 -04003817 gl::Texture *texture = getTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003818
Jamie Madillfb8a8302013-07-03 14:24:12 -04003819 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003821 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003822 }
3823
3824 switch (pname)
3825 {
3826 case GL_TEXTURE_MAG_FILTER:
3827 *params = texture->getMagFilter();
3828 break;
3829 case GL_TEXTURE_MIN_FILTER:
3830 *params = texture->getMinFilter();
3831 break;
3832 case GL_TEXTURE_WRAP_S:
3833 *params = texture->getWrapS();
3834 break;
3835 case GL_TEXTURE_WRAP_T:
3836 *params = texture->getWrapT();
3837 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003838 case GL_TEXTURE_WRAP_R:
3839 if (context->getClientVersion() < 3)
3840 {
3841 return gl::error(GL_INVALID_ENUM);
3842 }
3843 *params = texture->getWrapR();
3844 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003845 case GL_TEXTURE_IMMUTABLE_FORMAT:
3846 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003847 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3848 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003849 case GL_TEXTURE_IMMUTABLE_LEVELS:
3850 if (context->getClientVersion() < 3)
3851 {
3852 return gl::error(GL_INVALID_ENUM);
3853 }
3854 *params = texture->isImmutable() ? texture->levelCount() : 0;
3855 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003856 case GL_TEXTURE_USAGE_ANGLE:
3857 *params = texture->getUsage();
3858 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003859 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3860 if (!context->supportsTextureFilterAnisotropy())
3861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003862 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003863 }
3864 *params = (GLint)texture->getMaxAnisotropy();
3865 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003866
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003867 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003868 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003869 }
3870 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003871 }
3872 catch(std::bad_alloc&)
3873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003874 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003875 }
3876}
3877
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003878void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3879{
3880 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3881 program, location, bufSize, params);
3882
3883 try
3884 {
3885 if (bufSize < 0)
3886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003887 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003888 }
3889
3890 gl::Context *context = gl::getNonLostContext();
3891
3892 if (context)
3893 {
3894 if (program == 0)
3895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003896 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003897 }
3898
3899 gl::Program *programObject = context->getProgram(program);
3900
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003901 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003903 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003904 }
3905
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003906 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3907 if (!programBinary)
3908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003909 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003910 }
3911
3912 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003914 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003915 }
3916 }
3917 }
3918 catch(std::bad_alloc&)
3919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003920 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003921 }
3922}
3923
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003924void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3925{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003926 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003927
3928 try
3929 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003930 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003931
3932 if (context)
3933 {
3934 if (program == 0)
3935 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003936 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003937 }
3938
3939 gl::Program *programObject = context->getProgram(program);
3940
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003941 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003943 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003944 }
3945
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003946 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3947 if (!programBinary)
3948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003949 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003950 }
3951
3952 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003954 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003955 }
3956 }
3957 }
3958 catch(std::bad_alloc&)
3959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003960 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003961 }
3962}
3963
3964void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3965{
3966 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3967 program, location, bufSize, params);
3968
3969 try
3970 {
3971 if (bufSize < 0)
3972 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003973 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003974 }
3975
3976 gl::Context *context = gl::getNonLostContext();
3977
3978 if (context)
3979 {
3980 if (program == 0)
3981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003982 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003983 }
3984
3985 gl::Program *programObject = context->getProgram(program);
3986
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003987 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003989 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003990 }
3991
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003992 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3993 if (!programBinary)
3994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003995 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003996 }
3997
3998 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004000 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004001 }
4002 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004003 }
4004 catch(std::bad_alloc&)
4005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004006 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004007 }
4008}
4009
4010void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4011{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004012 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004013
4014 try
4015 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004016 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004017
4018 if (context)
4019 {
4020 if (program == 0)
4021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004022 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004023 }
4024
4025 gl::Program *programObject = context->getProgram(program);
4026
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004027 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004028 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004029 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004030 }
4031
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004032 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4033 if (!programBinary)
4034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004035 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004036 }
4037
4038 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004040 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004041 }
4042 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004043 }
4044 catch(std::bad_alloc&)
4045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004046 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004047 }
4048}
4049
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004050int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004051{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004052 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004053
4054 try
4055 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004056 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004057
4058 if (strstr(name, "gl_") == name)
4059 {
4060 return -1;
4061 }
4062
4063 if (context)
4064 {
4065 gl::Program *programObject = context->getProgram(program);
4066
4067 if (!programObject)
4068 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004069 if (context->getShader(program))
4070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004071 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004072 }
4073 else
4074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004075 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004076 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004077 }
4078
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004079 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004080 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004082 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004083 }
4084
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004085 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004086 }
4087 }
4088 catch(std::bad_alloc&)
4089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004090 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004091 }
4092
4093 return -1;
4094}
4095
4096void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4097{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004098 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004099
4100 try
4101 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004102 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004103
daniel@transgaming.come0078962010-04-15 20:45:08 +00004104 if (context)
4105 {
4106 if (index >= gl::MAX_VERTEX_ATTRIBS)
4107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004108 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004109 }
4110
daniel@transgaming.com83921382011-01-08 05:46:00 +00004111 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004112
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004113 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004114 {
Jamie Madillaff71502013-07-02 11:57:05 -04004115 return;
4116 }
4117
4118 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4119 {
4120 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4121 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004122 {
Jamie Madillaff71502013-07-02 11:57:05 -04004123 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004124 }
Jamie Madillaff71502013-07-02 11:57:05 -04004125 }
4126 else
4127 {
4128 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004129 }
4130 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004131 }
4132 catch(std::bad_alloc&)
4133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004134 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004135 }
4136}
4137
4138void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4139{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004140 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004141
4142 try
4143 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004144 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004145
daniel@transgaming.come0078962010-04-15 20:45:08 +00004146 if (context)
4147 {
4148 if (index >= gl::MAX_VERTEX_ATTRIBS)
4149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004150 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004151 }
4152
daniel@transgaming.com83921382011-01-08 05:46:00 +00004153 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004154
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004155 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004156 {
Jamie Madillaff71502013-07-02 11:57:05 -04004157 return;
4158 }
4159
4160 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4161 {
4162 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4163 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004164 {
Jamie Madillaff71502013-07-02 11:57:05 -04004165 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04004166 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004167 }
Jamie Madillaff71502013-07-02 11:57:05 -04004168 }
4169 else
4170 {
4171 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004172 }
4173 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004174 }
4175 catch(std::bad_alloc&)
4176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004177 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004178 }
4179}
4180
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004181void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004182{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004183 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004184
4185 try
4186 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004187 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004188
daniel@transgaming.come0078962010-04-15 20:45:08 +00004189 if (context)
4190 {
4191 if (index >= gl::MAX_VERTEX_ATTRIBS)
4192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004193 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004194 }
4195
4196 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004198 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004199 }
4200
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004201 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004202 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004203 }
4204 catch(std::bad_alloc&)
4205 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004206 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004207 }
4208}
4209
4210void __stdcall glHint(GLenum target, GLenum mode)
4211{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004212 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004213
4214 try
4215 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004216 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004217 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004218 case GL_FASTEST:
4219 case GL_NICEST:
4220 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004221 break;
4222 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004223 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004224 }
4225
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004226 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004227 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004228 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004229 case GL_GENERATE_MIPMAP_HINT:
4230 if (context) context->setGenerateMipmapHint(mode);
4231 break;
4232 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4233 if (context) context->setFragmentShaderDerivativeHint(mode);
4234 break;
4235 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004236 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004237 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004238 }
4239 catch(std::bad_alloc&)
4240 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004241 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004242 }
4243}
4244
4245GLboolean __stdcall glIsBuffer(GLuint buffer)
4246{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004247 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004248
4249 try
4250 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004251 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004252
4253 if (context && buffer)
4254 {
4255 gl::Buffer *bufferObject = context->getBuffer(buffer);
4256
4257 if (bufferObject)
4258 {
4259 return GL_TRUE;
4260 }
4261 }
4262 }
4263 catch(std::bad_alloc&)
4264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004265 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004266 }
4267
4268 return GL_FALSE;
4269}
4270
4271GLboolean __stdcall glIsEnabled(GLenum cap)
4272{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004273 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004274
4275 try
4276 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004277 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004278
4279 if (context)
4280 {
4281 switch (cap)
4282 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004283 case GL_CULL_FACE: return context->isCullFaceEnabled();
4284 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4285 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4286 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4287 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4288 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4289 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4290 case GL_BLEND: return context->isBlendEnabled();
4291 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004292 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004293 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004294 }
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, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004300 }
4301
4302 return false;
4303}
4304
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004305GLboolean __stdcall glIsFenceNV(GLuint fence)
4306{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004307 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004308
4309 try
4310 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004311 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004312
4313 if (context)
4314 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004315 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004316
4317 if (fenceObject == NULL)
4318 {
4319 return GL_FALSE;
4320 }
4321
4322 return fenceObject->isFence();
4323 }
4324 }
4325 catch(std::bad_alloc&)
4326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004327 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004328 }
4329
4330 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004331}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004332
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004333GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4334{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004335 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004336
4337 try
4338 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004339 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004340
4341 if (context && framebuffer)
4342 {
4343 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4344
4345 if (framebufferObject)
4346 {
4347 return GL_TRUE;
4348 }
4349 }
4350 }
4351 catch(std::bad_alloc&)
4352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004353 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004354 }
4355
4356 return GL_FALSE;
4357}
4358
4359GLboolean __stdcall glIsProgram(GLuint program)
4360{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004361 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004362
4363 try
4364 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004365 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004366
4367 if (context && program)
4368 {
4369 gl::Program *programObject = context->getProgram(program);
4370
4371 if (programObject)
4372 {
4373 return GL_TRUE;
4374 }
4375 }
4376 }
4377 catch(std::bad_alloc&)
4378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004379 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004380 }
4381
4382 return GL_FALSE;
4383}
4384
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004385GLboolean __stdcall glIsQueryEXT(GLuint id)
4386{
4387 EVENT("(GLuint id = %d)", id);
4388
4389 try
4390 {
4391 if (id == 0)
4392 {
4393 return GL_FALSE;
4394 }
4395
4396 gl::Context *context = gl::getNonLostContext();
4397
4398 if (context)
4399 {
4400 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4401
4402 if (queryObject)
4403 {
4404 return GL_TRUE;
4405 }
4406 }
4407 }
4408 catch(std::bad_alloc&)
4409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004410 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004411 }
4412
4413 return GL_FALSE;
4414}
4415
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004416GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4417{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004418 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004419
4420 try
4421 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004422 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004423
4424 if (context && renderbuffer)
4425 {
4426 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4427
4428 if (renderbufferObject)
4429 {
4430 return GL_TRUE;
4431 }
4432 }
4433 }
4434 catch(std::bad_alloc&)
4435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004436 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004437 }
4438
4439 return GL_FALSE;
4440}
4441
4442GLboolean __stdcall glIsShader(GLuint shader)
4443{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004444 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004445
4446 try
4447 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004448 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004449
4450 if (context && shader)
4451 {
4452 gl::Shader *shaderObject = context->getShader(shader);
4453
4454 if (shaderObject)
4455 {
4456 return GL_TRUE;
4457 }
4458 }
4459 }
4460 catch(std::bad_alloc&)
4461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004462 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004463 }
4464
4465 return GL_FALSE;
4466}
4467
4468GLboolean __stdcall glIsTexture(GLuint texture)
4469{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004470 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004471
4472 try
4473 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004474 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004475
4476 if (context && texture)
4477 {
4478 gl::Texture *textureObject = context->getTexture(texture);
4479
4480 if (textureObject)
4481 {
4482 return GL_TRUE;
4483 }
4484 }
4485 }
4486 catch(std::bad_alloc&)
4487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004488 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489 }
4490
4491 return GL_FALSE;
4492}
4493
4494void __stdcall glLineWidth(GLfloat width)
4495{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004496 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004497
4498 try
4499 {
4500 if (width <= 0.0f)
4501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004502 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004503 }
4504
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004505 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004506
4507 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004508 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004509 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004510 }
4511 }
4512 catch(std::bad_alloc&)
4513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004514 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004515 }
4516}
4517
4518void __stdcall glLinkProgram(GLuint program)
4519{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004520 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004521
4522 try
4523 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004524 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004525
4526 if (context)
4527 {
4528 gl::Program *programObject = context->getProgram(program);
4529
4530 if (!programObject)
4531 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004532 if (context->getShader(program))
4533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004534 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004535 }
4536 else
4537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004538 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004539 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004540 }
4541
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004542 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004543 }
4544 }
4545 catch(std::bad_alloc&)
4546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004547 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004548 }
4549}
4550
4551void __stdcall glPixelStorei(GLenum pname, GLint param)
4552{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004553 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004554
4555 try
4556 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004557 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004558
4559 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004560 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004561 switch (pname)
4562 {
4563 case GL_UNPACK_ALIGNMENT:
4564 if (param != 1 && param != 2 && param != 4 && param != 8)
4565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004566 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004567 }
4568
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004569 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004570 break;
4571
4572 case GL_PACK_ALIGNMENT:
4573 if (param != 1 && param != 2 && param != 4 && param != 8)
4574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004575 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004576 }
4577
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004578 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004579 break;
4580
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004581 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4582 context->setPackReverseRowOrder(param != 0);
4583 break;
4584
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004585 case GL_UNPACK_IMAGE_HEIGHT:
4586 case GL_UNPACK_SKIP_IMAGES:
4587 case GL_UNPACK_ROW_LENGTH:
4588 case GL_UNPACK_SKIP_ROWS:
4589 case GL_UNPACK_SKIP_PIXELS:
4590 case GL_PACK_ROW_LENGTH:
4591 case GL_PACK_SKIP_ROWS:
4592 case GL_PACK_SKIP_PIXELS:
4593 if (context->getClientVersion() < 3)
4594 {
4595 return gl::error(GL_INVALID_ENUM);
4596 }
4597 UNIMPLEMENTED();
4598 break;
4599
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004600 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004601 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004602 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004603 }
4604 }
4605 catch(std::bad_alloc&)
4606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004607 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004608 }
4609}
4610
4611void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4612{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004613 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004614
4615 try
4616 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004617 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004618
4619 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004620 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004621 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004622 }
4623 }
4624 catch(std::bad_alloc&)
4625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004626 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004627 }
4628}
4629
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004630void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4631 GLenum format, GLenum type, GLsizei bufSize,
4632 GLvoid *data)
4633{
4634 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4635 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4636 x, y, width, height, format, type, bufSize, data);
4637
4638 try
4639 {
4640 if (width < 0 || height < 0 || bufSize < 0)
4641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004642 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004643 }
4644
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004645 gl::Context *context = gl::getNonLostContext();
4646
4647 if (context)
4648 {
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004649 GLint currentInternalFormat;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004650 GLenum currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004651
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004652 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4653 // and attempting to read back if that's the case is an error. The error will be registered
4654 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004655 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004656 return;
4657
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004658 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4659 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004660
4661 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004663 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004664 }
4665
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004666 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4667 }
4668 }
4669 catch(std::bad_alloc&)
4670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004671 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004672 }
4673}
4674
4675void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4676 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004677{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004678 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004679 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004680 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004681
4682 try
4683 {
4684 if (width < 0 || height < 0)
4685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004686 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004687 }
4688
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004689 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004690
4691 if (context)
4692 {
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004693 GLint currentInternalFormat;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004694 GLenum currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004695
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004696 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4697 // and attempting to read back if that's the case is an error. The error will be registered
4698 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004699 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004700 return;
4701
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004702 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4703 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004704
4705 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004706 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004707 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004708 }
4709
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004710 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004711 }
4712 }
4713 catch(std::bad_alloc&)
4714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004715 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004716 }
4717}
4718
4719void __stdcall glReleaseShaderCompiler(void)
4720{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004721 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004722
4723 try
4724 {
4725 gl::Shader::releaseCompiler();
4726 }
4727 catch(std::bad_alloc&)
4728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004729 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004730 }
4731}
4732
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004733void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004734{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004735 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 +00004736 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004737
4738 try
4739 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004740 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004741
4742 if (context)
4743 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004744 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004745 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004746 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004747 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004748 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004749
4750 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004751 }
4752 }
4753 catch(std::bad_alloc&)
4754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004755 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004756 }
4757}
4758
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004759void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4760{
4761 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4762}
4763
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004764void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4765{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004766 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004767
4768 try
4769 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004770 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004771
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004772 if (context)
4773 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004774 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004775 }
4776 }
4777 catch(std::bad_alloc&)
4778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004779 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004780 }
4781}
4782
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004783void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4784{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004785 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004786
4787 try
4788 {
4789 if (condition != GL_ALL_COMPLETED_NV)
4790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004791 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004792 }
4793
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004794 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004795
4796 if (context)
4797 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004798 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004799
4800 if (fenceObject == NULL)
4801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004802 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004803 }
4804
4805 fenceObject->setFence(condition);
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);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004811 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004812}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004813
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004814void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4815{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004816 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 +00004817
4818 try
4819 {
4820 if (width < 0 || height < 0)
4821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004822 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004823 }
4824
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004825 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004826
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004827 if (context)
4828 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004829 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004830 }
4831 }
4832 catch(std::bad_alloc&)
4833 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004834 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004835 }
4836}
4837
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004838void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004839{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004840 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004841 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004842 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004843
4844 try
4845 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004846 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004847 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004848 }
4849 catch(std::bad_alloc&)
4850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004851 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004852 }
4853}
4854
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004855void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004856{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004857 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 +00004858 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004859
4860 try
4861 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004862 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004863 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004864 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004865 }
4866
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004867 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004868
4869 if (context)
4870 {
4871 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004872
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004873 if (!shaderObject)
4874 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004875 if (context->getProgram(shader))
4876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004877 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004878 }
4879 else
4880 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004881 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004882 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004883 }
4884
4885 shaderObject->setSource(count, string, length);
4886 }
4887 }
4888 catch(std::bad_alloc&)
4889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004890 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004891 }
4892}
4893
4894void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4895{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004896 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004897}
4898
4899void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4900{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004901 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 +00004902
4903 try
4904 {
4905 switch (face)
4906 {
4907 case GL_FRONT:
4908 case GL_BACK:
4909 case GL_FRONT_AND_BACK:
4910 break;
4911 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004912 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004913 }
4914
4915 switch (func)
4916 {
4917 case GL_NEVER:
4918 case GL_ALWAYS:
4919 case GL_LESS:
4920 case GL_LEQUAL:
4921 case GL_EQUAL:
4922 case GL_GEQUAL:
4923 case GL_GREATER:
4924 case GL_NOTEQUAL:
4925 break;
4926 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004927 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004928 }
4929
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004930 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004931
4932 if (context)
4933 {
4934 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4935 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004936 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004937 }
4938
4939 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4940 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004941 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004942 }
4943 }
4944 }
4945 catch(std::bad_alloc&)
4946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004947 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004948 }
4949}
4950
4951void __stdcall glStencilMask(GLuint mask)
4952{
4953 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4954}
4955
4956void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4957{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004958 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004959
4960 try
4961 {
4962 switch (face)
4963 {
4964 case GL_FRONT:
4965 case GL_BACK:
4966 case GL_FRONT_AND_BACK:
4967 break;
4968 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004969 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004970 }
4971
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004972 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004973
4974 if (context)
4975 {
4976 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4977 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004978 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004979 }
4980
4981 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4982 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004983 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004984 }
4985 }
4986 }
4987 catch(std::bad_alloc&)
4988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004989 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004990 }
4991}
4992
4993void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4994{
4995 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4996}
4997
4998void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4999{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005000 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 +00005001 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005002
5003 try
5004 {
5005 switch (face)
5006 {
5007 case GL_FRONT:
5008 case GL_BACK:
5009 case GL_FRONT_AND_BACK:
5010 break;
5011 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005012 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005013 }
5014
5015 switch (fail)
5016 {
5017 case GL_ZERO:
5018 case GL_KEEP:
5019 case GL_REPLACE:
5020 case GL_INCR:
5021 case GL_DECR:
5022 case GL_INVERT:
5023 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005024 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005025 break;
5026 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005027 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005028 }
5029
5030 switch (zfail)
5031 {
5032 case GL_ZERO:
5033 case GL_KEEP:
5034 case GL_REPLACE:
5035 case GL_INCR:
5036 case GL_DECR:
5037 case GL_INVERT:
5038 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005039 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005040 break;
5041 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005042 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005043 }
5044
5045 switch (zpass)
5046 {
5047 case GL_ZERO:
5048 case GL_KEEP:
5049 case GL_REPLACE:
5050 case GL_INCR:
5051 case GL_DECR:
5052 case GL_INVERT:
5053 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005054 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005055 break;
5056 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005057 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005058 }
5059
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005060 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005061
5062 if (context)
5063 {
5064 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5065 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005066 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005067 }
5068
5069 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5070 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005071 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005072 }
5073 }
5074 }
5075 catch(std::bad_alloc&)
5076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005077 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005078 }
5079}
5080
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005081GLboolean __stdcall glTestFenceNV(GLuint fence)
5082{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005083 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005084
5085 try
5086 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005087 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005088
5089 if (context)
5090 {
Jamie Madill33dc8432013-07-26 11:55:05 -04005091 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005092
5093 if (fenceObject == NULL)
5094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005095 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005096 }
5097
Jamie Madillfb9a7402013-07-26 11:55:01 -04005098 if (fenceObject->isFence() != GL_TRUE)
5099 {
5100 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
5101 }
5102
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005103 return fenceObject->testFence();
5104 }
5105 }
5106 catch(std::bad_alloc&)
5107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005108 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005109 }
5110
5111 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005112}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005113
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005114void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5115 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005116{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005117 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 +00005118 "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 +00005119 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005120
5121 try
5122 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005123 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005124
5125 if (context)
5126 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005127 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005128 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005129 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005130 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005131 return;
5132 }
5133
5134 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005135 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005136 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005137 {
5138 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005139 }
5140
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005141 switch (target)
5142 {
5143 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005144 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005145 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005146 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005147 }
5148 break;
5149 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005150 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005151 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005152 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005153 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005154 break;
5155 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5156 {
5157 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005158 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005159 }
5160 break;
5161 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5162 {
5163 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005164 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005165 }
5166 break;
5167 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5168 {
5169 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005170 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005171 }
5172 break;
5173 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5174 {
5175 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005176 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005177 }
5178 break;
5179 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5180 {
5181 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005182 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005183 }
5184 break;
5185 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005186 }
5187 }
5188 }
5189 catch(std::bad_alloc&)
5190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005191 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005192 }
5193}
5194
5195void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5196{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005197 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5198
5199 try
5200 {
5201 gl::Context *context = gl::getNonLostContext();
5202
5203 if (context)
5204 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005205 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04005206 {
5207 return;
5208 }
5209
Jamie Madillfb8a8302013-07-03 14:24:12 -04005210 gl::Texture *texture = getTargetTexture(context, target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005211
Jamie Madillfb8a8302013-07-03 14:24:12 -04005212 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005214 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005215 }
5216
5217 switch (pname)
5218 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005219 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5220 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5221 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5222 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5223 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5224 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
5225 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
5226 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5227 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005228
Jamie Madill478fdb22013-07-19 16:36:59 -04005229 case GL_TEXTURE_SWIZZLE_R:
5230 case GL_TEXTURE_SWIZZLE_G:
5231 case GL_TEXTURE_SWIZZLE_B:
5232 case GL_TEXTURE_SWIZZLE_A:
5233 case GL_TEXTURE_BASE_LEVEL:
5234 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005235 case GL_TEXTURE_MIN_LOD:
5236 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005237 UNIMPLEMENTED();
5238 break;
5239
Jamie Madill478fdb22013-07-19 16:36:59 -04005240 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005241 }
5242 }
5243 }
5244 catch(std::bad_alloc&)
5245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005246 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005247 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005248}
5249
5250void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5251{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005252 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253}
5254
5255void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5256{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005257 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005258
5259 try
5260 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005261 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005262
5263 if (context)
5264 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005265 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005266 {
5267 return;
5268 }
5269
Jamie Madillfb8a8302013-07-03 14:24:12 -04005270 gl::Texture *texture = getTargetTexture(context, target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005271
Jamie Madillfb8a8302013-07-03 14:24:12 -04005272 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005274 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005275 }
5276
5277 switch (pname)
5278 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005279 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5280 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5281 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5282 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5283 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5284 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5285 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5286 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5287 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005288
5289 case GL_TEXTURE_SWIZZLE_R:
5290 case GL_TEXTURE_SWIZZLE_G:
5291 case GL_TEXTURE_SWIZZLE_B:
5292 case GL_TEXTURE_SWIZZLE_A:
5293 case GL_TEXTURE_BASE_LEVEL:
5294 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005295 case GL_TEXTURE_MIN_LOD:
5296 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005297 UNIMPLEMENTED();
5298 break;
5299
Jamie Madill478fdb22013-07-19 16:36:59 -04005300 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005301 }
5302 }
5303 }
5304 catch(std::bad_alloc&)
5305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005306 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005307 }
5308}
5309
5310void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5311{
5312 glTexParameteri(target, pname, *params);
5313}
5314
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005315void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5316{
5317 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5318 target, levels, internalformat, width, height);
5319
5320 try
5321 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005322 gl::Context *context = gl::getNonLostContext();
5323
5324 if (context)
5325 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005326 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005327 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005328 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005329 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005330 }
5331
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005332 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005333 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005334 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005335 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005336 }
5337
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005338 switch (target)
5339 {
5340 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005341 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005342 gl::Texture2D *texture2d = context->getTexture2D();
5343 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005344 }
5345 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005346
5347 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5348 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5349 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5350 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5351 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5352 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005353 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005354 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5355 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005356 }
5357 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005358
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005359 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005360 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005361 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005362 }
5363 }
5364 catch(std::bad_alloc&)
5365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005367 }
5368}
5369
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005370void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5371 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005372{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005373 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005374 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005375 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005376 target, level, xoffset, yoffset, width, height, format, type, pixels);
5377
5378 try
5379 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005380 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005381
5382 if (context)
5383 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005384 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005385 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005386 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005387 {
5388 return;
5389 }
5390
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005391 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005392 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005393 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005394 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005395 return;
5396 }
5397
5398 switch (target)
5399 {
5400 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005401 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005402 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005403 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005404 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005405 break;
5406
5407 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5408 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5409 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5410 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5411 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5412 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005413 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005414 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005415 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005416 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005417 break;
5418
5419 default:
5420 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005421 }
5422 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005423 }
5424 catch(std::bad_alloc&)
5425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005426 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005427 }
5428}
5429
5430void __stdcall glUniform1f(GLint location, GLfloat x)
5431{
5432 glUniform1fv(location, 1, &x);
5433}
5434
5435void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5436{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005437 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005438
5439 try
5440 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005441 if (count < 0)
5442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005443 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005444 }
5445
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005446 if (location == -1)
5447 {
5448 return;
5449 }
5450
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005451 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005452
5453 if (context)
5454 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005455 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005456 if (!programBinary)
5457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005458 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005459 }
5460
5461 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005463 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005464 }
5465 }
5466 }
5467 catch(std::bad_alloc&)
5468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005469 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005470 }
5471}
5472
5473void __stdcall glUniform1i(GLint location, GLint x)
5474{
5475 glUniform1iv(location, 1, &x);
5476}
5477
5478void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5479{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005480 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005481
5482 try
5483 {
5484 if (count < 0)
5485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005486 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005487 }
5488
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005489 if (location == -1)
5490 {
5491 return;
5492 }
5493
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005494 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005495
5496 if (context)
5497 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005498 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005499 if (!programBinary)
5500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005501 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005502 }
5503
5504 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005506 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005507 }
5508 }
5509 }
5510 catch(std::bad_alloc&)
5511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005512 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005513 }
5514}
5515
5516void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5517{
5518 GLfloat xy[2] = {x, y};
5519
5520 glUniform2fv(location, 1, (GLfloat*)&xy);
5521}
5522
5523void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5524{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005525 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005526
5527 try
5528 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005529 if (count < 0)
5530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005531 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005532 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005533
5534 if (location == -1)
5535 {
5536 return;
5537 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005538
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005539 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005540
5541 if (context)
5542 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005543 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005544 if (!programBinary)
5545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005546 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005547 }
5548
5549 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005551 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005552 }
5553 }
5554 }
5555 catch(std::bad_alloc&)
5556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005557 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005558 }
5559}
5560
5561void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5562{
5563 GLint xy[4] = {x, y};
5564
5565 glUniform2iv(location, 1, (GLint*)&xy);
5566}
5567
5568void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5569{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005570 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005571
5572 try
5573 {
5574 if (count < 0)
5575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005576 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005577 }
5578
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005579 if (location == -1)
5580 {
5581 return;
5582 }
5583
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005584 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005585
5586 if (context)
5587 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005588 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005589 if (!programBinary)
5590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005591 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005592 }
5593
5594 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005596 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005597 }
5598 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005599 }
5600 catch(std::bad_alloc&)
5601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005602 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005603 }
5604}
5605
5606void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5607{
5608 GLfloat xyz[3] = {x, y, z};
5609
5610 glUniform3fv(location, 1, (GLfloat*)&xyz);
5611}
5612
5613void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5614{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005615 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005616
5617 try
5618 {
5619 if (count < 0)
5620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005621 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005622 }
5623
5624 if (location == -1)
5625 {
5626 return;
5627 }
5628
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005629 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005630
5631 if (context)
5632 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005633 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005634 if (!programBinary)
5635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005636 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005637 }
5638
5639 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005641 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005642 }
5643 }
5644 }
5645 catch(std::bad_alloc&)
5646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005647 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005648 }
5649}
5650
5651void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5652{
5653 GLint xyz[3] = {x, y, z};
5654
5655 glUniform3iv(location, 1, (GLint*)&xyz);
5656}
5657
5658void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5659{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005660 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661
5662 try
5663 {
5664 if (count < 0)
5665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005666 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005667 }
5668
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005669 if (location == -1)
5670 {
5671 return;
5672 }
5673
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005674 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005675
5676 if (context)
5677 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005678 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005679 if (!programBinary)
5680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005681 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005682 }
5683
5684 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005686 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005687 }
5688 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005689 }
5690 catch(std::bad_alloc&)
5691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005692 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005693 }
5694}
5695
5696void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5697{
5698 GLfloat xyzw[4] = {x, y, z, w};
5699
5700 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5701}
5702
5703void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5704{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005705 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005706
5707 try
5708 {
5709 if (count < 0)
5710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005711 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005712 }
5713
5714 if (location == -1)
5715 {
5716 return;
5717 }
5718
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005719 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005720
5721 if (context)
5722 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005723 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005724 if (!programBinary)
5725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005726 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005727 }
5728
5729 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005731 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005732 }
5733 }
5734 }
5735 catch(std::bad_alloc&)
5736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005737 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005738 }
5739}
5740
5741void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5742{
5743 GLint xyzw[4] = {x, y, z, w};
5744
5745 glUniform4iv(location, 1, (GLint*)&xyzw);
5746}
5747
5748void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5749{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005750 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005751
5752 try
5753 {
5754 if (count < 0)
5755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005756 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005757 }
5758
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005759 if (location == -1)
5760 {
5761 return;
5762 }
5763
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005764 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005765
5766 if (context)
5767 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005768 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005769 if (!programBinary)
5770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005771 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005772 }
5773
5774 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005776 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005777 }
5778 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005779 }
5780 catch(std::bad_alloc&)
5781 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005782 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005783 }
5784}
5785
5786void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5787{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005788 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005789 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005790
5791 try
5792 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005793 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005795 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005796 }
5797
5798 if (location == -1)
5799 {
5800 return;
5801 }
5802
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005803 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005804
5805 if (context)
5806 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005807 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5808 {
5809 return gl::error(GL_INVALID_VALUE);
5810 }
5811
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005812 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005813 if (!programBinary)
5814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005815 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005816 }
5817
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005818 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005820 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005821 }
5822 }
5823 }
5824 catch(std::bad_alloc&)
5825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005826 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005827 }
5828}
5829
5830void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5831{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005832 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005833 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005834
5835 try
5836 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005837 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005839 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005840 }
5841
5842 if (location == -1)
5843 {
5844 return;
5845 }
5846
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005847 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005848
5849 if (context)
5850 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005851 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5852 {
5853 return gl::error(GL_INVALID_VALUE);
5854 }
5855
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005856 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005857 if (!programBinary)
5858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005859 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005860 }
5861
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005862 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005863 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005864 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005865 }
5866 }
5867 }
5868 catch(std::bad_alloc&)
5869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005870 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005871 }
5872}
5873
5874void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5875{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005876 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005877 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005878
5879 try
5880 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005881 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005883 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005884 }
5885
5886 if (location == -1)
5887 {
5888 return;
5889 }
5890
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005891 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005892
5893 if (context)
5894 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005895 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5896 {
5897 return gl::error(GL_INVALID_VALUE);
5898 }
5899
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005900 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005901 if (!programBinary)
5902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005903 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005904 }
5905
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005906 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005908 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005909 }
5910 }
5911 }
5912 catch(std::bad_alloc&)
5913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005914 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005915 }
5916}
5917
5918void __stdcall glUseProgram(GLuint program)
5919{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005920 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005921
5922 try
5923 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005924 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005925
5926 if (context)
5927 {
5928 gl::Program *programObject = context->getProgram(program);
5929
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005930 if (!programObject && program != 0)
5931 {
5932 if (context->getShader(program))
5933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005934 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005935 }
5936 else
5937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005938 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005939 }
5940 }
5941
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005942 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005944 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005945 }
5946
5947 context->useProgram(program);
5948 }
5949 }
5950 catch(std::bad_alloc&)
5951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005952 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005953 }
5954}
5955
5956void __stdcall glValidateProgram(GLuint program)
5957{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005958 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005959
5960 try
5961 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005962 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005963
5964 if (context)
5965 {
5966 gl::Program *programObject = context->getProgram(program);
5967
5968 if (!programObject)
5969 {
5970 if (context->getShader(program))
5971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005972 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005973 }
5974 else
5975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005976 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005977 }
5978 }
5979
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005980 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005981 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005982 }
5983 catch(std::bad_alloc&)
5984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005985 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005986 }
5987}
5988
5989void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5990{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005991 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005992
5993 try
5994 {
5995 if (index >= gl::MAX_VERTEX_ATTRIBS)
5996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005997 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005998 }
5999
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006000 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006001
6002 if (context)
6003 {
6004 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006005 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006006 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006007 }
6008 catch(std::bad_alloc&)
6009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006010 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006011 }
6012}
6013
6014void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6015{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006016 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006017
6018 try
6019 {
6020 if (index >= gl::MAX_VERTEX_ATTRIBS)
6021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006022 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006023 }
6024
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006025 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006026
6027 if (context)
6028 {
6029 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006030 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006031 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006032 }
6033 catch(std::bad_alloc&)
6034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006035 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006036 }
6037}
6038
6039void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6040{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006041 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006042
6043 try
6044 {
6045 if (index >= gl::MAX_VERTEX_ATTRIBS)
6046 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006047 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006048 }
6049
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006050 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006051
6052 if (context)
6053 {
6054 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006055 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006056 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006057 }
6058 catch(std::bad_alloc&)
6059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006060 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006061 }
6062}
6063
6064void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6065{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006066 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006067
6068 try
6069 {
6070 if (index >= gl::MAX_VERTEX_ATTRIBS)
6071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006072 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006073 }
6074
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006075 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006076
6077 if (context)
6078 {
6079 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006080 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006081 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006082 }
6083 catch(std::bad_alloc&)
6084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006085 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006086 }
6087}
6088
6089void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6090{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006091 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 +00006092
6093 try
6094 {
6095 if (index >= gl::MAX_VERTEX_ATTRIBS)
6096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006097 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006098 }
6099
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006100 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006101
6102 if (context)
6103 {
6104 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006105 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006106 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006107 }
6108 catch(std::bad_alloc&)
6109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006110 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006111 }
6112}
6113
6114void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6115{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006116 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006117
6118 try
6119 {
6120 if (index >= gl::MAX_VERTEX_ATTRIBS)
6121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006122 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006123 }
6124
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006125 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006126
6127 if (context)
6128 {
6129 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006130 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006131 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006132 }
6133 catch(std::bad_alloc&)
6134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006135 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006136 }
6137}
6138
6139void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6140{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006141 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 +00006142
6143 try
6144 {
6145 if (index >= gl::MAX_VERTEX_ATTRIBS)
6146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006147 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006148 }
6149
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006150 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006151
6152 if (context)
6153 {
6154 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006155 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006156 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006157 }
6158 catch(std::bad_alloc&)
6159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006160 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006161 }
6162}
6163
6164void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6165{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006166 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006167
6168 try
6169 {
6170 if (index >= gl::MAX_VERTEX_ATTRIBS)
6171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006172 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006173 }
6174
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006175 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006176
6177 if (context)
6178 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006179 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006180 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006181 }
6182 catch(std::bad_alloc&)
6183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006185 }
6186}
6187
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006188void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6189{
6190 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6191
6192 try
6193 {
6194 if (index >= gl::MAX_VERTEX_ATTRIBS)
6195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006196 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006197 }
6198
6199 gl::Context *context = gl::getNonLostContext();
6200
6201 if (context)
6202 {
6203 context->setVertexAttribDivisor(index, divisor);
6204 }
6205 }
6206 catch(std::bad_alloc&)
6207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006208 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006209 }
6210}
6211
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006212void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006213{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006214 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006215 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006216 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006217
6218 try
6219 {
6220 if (index >= gl::MAX_VERTEX_ATTRIBS)
6221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006222 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006223 }
6224
6225 if (size < 1 || size > 4)
6226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006227 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006228 }
6229
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006230 gl::Context *context = gl::getNonLostContext();
6231
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006232 switch (type)
6233 {
6234 case GL_BYTE:
6235 case GL_UNSIGNED_BYTE:
6236 case GL_SHORT:
6237 case GL_UNSIGNED_SHORT:
6238 case GL_FIXED:
6239 case GL_FLOAT:
6240 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006241 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006242 case GL_INT:
6243 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006244 case GL_INT_2_10_10_10_REV:
6245 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006246 if (context && context->getClientVersion() < 3)
6247 {
6248 return gl::error(GL_INVALID_ENUM);
6249 }
6250 else
6251 {
6252 break;
6253 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006254 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006255 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006256 }
6257
6258 if (stride < 0)
6259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006260 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006261 }
6262
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006263 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6264 {
6265 return gl::error(GL_INVALID_OPERATION);
6266 }
6267
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006268 if (context)
6269 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006270 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6271 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6272 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6273 // and the pointer argument is not NULL.
6274 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6275 {
6276 return gl::error(GL_INVALID_OPERATION);
6277 }
6278
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006279 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6280 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006281 }
6282 }
6283 catch(std::bad_alloc&)
6284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006285 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006286 }
6287}
6288
6289void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6290{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006291 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 +00006292
6293 try
6294 {
6295 if (width < 0 || height < 0)
6296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006297 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006298 }
6299
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006300 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006301
6302 if (context)
6303 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006304 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006305 }
6306 }
6307 catch(std::bad_alloc&)
6308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006309 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006310 }
6311}
6312
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006313// OpenGL ES 3.0 functions
6314
6315void __stdcall glReadBuffer(GLenum mode)
6316{
6317 EVENT("(GLenum mode = 0x%X)", mode);
6318
6319 try
6320 {
6321 gl::Context *context = gl::getNonLostContext();
6322
6323 if (context)
6324 {
6325 if (context->getClientVersion() < 3)
6326 {
6327 return gl::error(GL_INVALID_OPERATION);
6328 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006329
Jamie Madill54133512013-06-21 09:33:07 -04006330 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006331 UNIMPLEMENTED();
6332 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006333 }
6334 catch(std::bad_alloc&)
6335 {
6336 return gl::error(GL_OUT_OF_MEMORY);
6337 }
6338}
6339
6340void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6341{
6342 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6343 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
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
Jamie Madill54133512013-06-21 09:33:07 -04006356 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006357 UNIMPLEMENTED();
6358 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006359 }
6360 catch(std::bad_alloc&)
6361 {
6362 return gl::error(GL_OUT_OF_MEMORY);
6363 }
6364}
6365
6366void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6367{
6368 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6369 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6370 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6371 target, level, internalformat, width, height, depth, border, format, type, pixels);
6372
6373 try
6374 {
6375 gl::Context *context = gl::getNonLostContext();
6376
6377 if (context)
6378 {
6379 if (context->getClientVersion() < 3)
6380 {
6381 return gl::error(GL_INVALID_OPERATION);
6382 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006383
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006384 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006385 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006386 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006387 {
6388 return;
6389 }
6390
6391 switch(target)
6392 {
6393 case GL_TEXTURE_3D:
6394 {
6395 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006396 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006397 }
6398 break;
6399
6400 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006401 {
6402 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006403 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006404 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006405 break;
6406
6407 default:
6408 return gl::error(GL_INVALID_ENUM);
6409 }
6410 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006411 }
6412 catch(std::bad_alloc&)
6413 {
6414 return gl::error(GL_OUT_OF_MEMORY);
6415 }
6416}
6417
6418void __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)
6419{
6420 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6421 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6422 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6423 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6424
6425 try
6426 {
6427 gl::Context *context = gl::getNonLostContext();
6428
6429 if (context)
6430 {
6431 if (context->getClientVersion() < 3)
6432 {
6433 return gl::error(GL_INVALID_OPERATION);
6434 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006435
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006436 if (!pixels)
6437 {
6438 return gl::error(GL_INVALID_VALUE);
6439 }
6440
6441 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006442 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006443 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006444 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006445 {
6446 return;
6447 }
6448
6449 switch(target)
6450 {
6451 case GL_TEXTURE_3D:
6452 {
6453 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006454 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006455 }
6456 break;
6457
6458 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006459 {
6460 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006461 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006462 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006463 break;
6464
6465 default:
6466 return gl::error(GL_INVALID_ENUM);
6467 }
6468 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006469 }
6470 catch(std::bad_alloc&)
6471 {
6472 return gl::error(GL_OUT_OF_MEMORY);
6473 }
6474}
6475
6476void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6477{
6478 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6479 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6480 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6481
6482 try
6483 {
6484 gl::Context *context = gl::getNonLostContext();
6485
6486 if (context)
6487 {
6488 if (context->getClientVersion() < 3)
6489 {
6490 return gl::error(GL_INVALID_OPERATION);
6491 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006492
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006493 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006494 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006495 {
6496 return;
6497 }
6498
6499 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6500 gl::Texture *texture = NULL;
6501 switch (target)
6502 {
6503 case GL_TEXTURE_3D:
6504 texture = context->getTexture3D();
6505 break;
6506
6507 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006508 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006509 break;
6510
6511 default:
6512 return gl::error(GL_INVALID_ENUM);
6513 }
6514
6515 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6516 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006517 }
6518 catch(std::bad_alloc&)
6519 {
6520 return gl::error(GL_OUT_OF_MEMORY);
6521 }
6522}
6523
6524void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6525{
6526 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6527 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6528 "const GLvoid* data = 0x%0.8p)",
6529 target, level, internalformat, width, height, depth, border, imageSize, data);
6530
6531 try
6532 {
6533 gl::Context *context = gl::getNonLostContext();
6534
6535 if (context)
6536 {
6537 if (context->getClientVersion() < 3)
6538 {
6539 return gl::error(GL_INVALID_OPERATION);
6540 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006541
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006542 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 +00006543 {
6544 return gl::error(GL_INVALID_VALUE);
6545 }
6546
6547 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006548 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006549 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006550 {
6551 return;
6552 }
6553
6554 switch(target)
6555 {
6556 case GL_TEXTURE_3D:
6557 {
6558 gl::Texture3D *texture = context->getTexture3D();
6559 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6560 }
6561 break;
6562
6563 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006564 {
6565 gl::Texture2DArray *texture = context->getTexture2DArray();
6566 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6567 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006568 break;
6569
6570 default:
6571 return gl::error(GL_INVALID_ENUM);
6572 }
6573 }
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);
6578 }
6579}
6580
6581void __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)
6582{
6583 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6584 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6585 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6586 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6587
6588 try
6589 {
6590 gl::Context *context = gl::getNonLostContext();
6591
6592 if (context)
6593 {
6594 if (context->getClientVersion() < 3)
6595 {
6596 return gl::error(GL_INVALID_OPERATION);
6597 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006598
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006599 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 +00006600 {
6601 return gl::error(GL_INVALID_VALUE);
6602 }
6603
6604 if (!data)
6605 {
6606 return gl::error(GL_INVALID_VALUE);
6607 }
6608
6609 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006610 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006611 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006612 {
6613 return;
6614 }
6615
6616 switch(target)
6617 {
6618 case GL_TEXTURE_3D:
6619 {
6620 gl::Texture3D *texture = context->getTexture3D();
6621 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6622 format, imageSize, data);
6623 }
6624 break;
6625
6626 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006627 {
6628 gl::Texture2DArray *texture = context->getTexture2DArray();
6629 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6630 format, imageSize, data);
6631 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006632 break;
6633
6634 default:
6635 return gl::error(GL_INVALID_ENUM);
6636 }
6637 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006638 }
6639 catch(std::bad_alloc&)
6640 {
6641 return gl::error(GL_OUT_OF_MEMORY);
6642 }
6643}
6644
6645void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6646{
6647 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6648
6649 try
6650 {
6651 gl::Context *context = gl::getNonLostContext();
6652
6653 if (context)
6654 {
6655 if (context->getClientVersion() < 3)
6656 {
6657 return gl::error(GL_INVALID_OPERATION);
6658 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006659
Jamie Madill3641b4b2013-07-26 12:54:59 -04006660 glGenQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006661 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006662 }
6663 catch(std::bad_alloc&)
6664 {
6665 return gl::error(GL_OUT_OF_MEMORY);
6666 }
6667}
6668
6669void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6670{
6671 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6672
6673 try
6674 {
6675 gl::Context *context = gl::getNonLostContext();
6676
6677 if (context)
6678 {
6679 if (context->getClientVersion() < 3)
6680 {
6681 return gl::error(GL_INVALID_OPERATION);
6682 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006683
Jamie Madill3641b4b2013-07-26 12:54:59 -04006684 glDeleteQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006685 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006686 }
6687 catch(std::bad_alloc&)
6688 {
6689 return gl::error(GL_OUT_OF_MEMORY);
6690 }
6691}
6692
6693GLboolean __stdcall glIsQuery(GLuint id)
6694{
6695 EVENT("(GLuint id = %u)", id);
6696
6697 try
6698 {
6699 gl::Context *context = gl::getNonLostContext();
6700
6701 if (context)
6702 {
6703 if (context->getClientVersion() < 3)
6704 {
6705 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6706 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006707
Jamie Madill3641b4b2013-07-26 12:54:59 -04006708 // TODO: XFB queries
6709 return glIsQueryEXT(id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006710 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006711 }
6712 catch(std::bad_alloc&)
6713 {
6714 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6715 }
6716
6717 return GL_FALSE;
6718}
6719
6720void __stdcall glBeginQuery(GLenum target, GLuint id)
6721{
6722 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6723
6724 try
6725 {
6726 gl::Context *context = gl::getNonLostContext();
6727
6728 if (context)
6729 {
6730 if (context->getClientVersion() < 3)
6731 {
6732 return gl::error(GL_INVALID_OPERATION);
6733 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006734
Jamie Madill3641b4b2013-07-26 12:54:59 -04006735 switch (target)
6736 {
6737 case GL_ANY_SAMPLES_PASSED:
6738 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
6739 case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
6740 break;
6741 default:
6742 return gl::error(GL_INVALID_ENUM);
6743 }
6744
6745 if (id == 0)
6746 {
6747 return gl::error(GL_INVALID_OPERATION);
6748 }
6749
6750 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6751 {
6752 // TODO: XFB queries
6753 UNIMPLEMENTED();
6754 }
6755 else
6756 {
6757 context->beginQuery(target, id);
6758 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006759 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006760 }
6761 catch(std::bad_alloc&)
6762 {
6763 return gl::error(GL_OUT_OF_MEMORY);
6764 }
6765}
6766
6767void __stdcall glEndQuery(GLenum target)
6768{
6769 EVENT("(GLenum target = 0x%X)", target);
6770
6771 try
6772 {
6773 gl::Context *context = gl::getNonLostContext();
6774
6775 if (context)
6776 {
6777 if (context->getClientVersion() < 3)
6778 {
6779 return gl::error(GL_INVALID_OPERATION);
6780 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006781
Jamie Madill3641b4b2013-07-26 12:54:59 -04006782 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6783 {
6784 // TODO: XFB queries
6785 UNIMPLEMENTED();
6786 }
6787 else
6788 {
6789 glEndQueryEXT(target);
6790 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006791 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006792 }
6793 catch(std::bad_alloc&)
6794 {
6795 return gl::error(GL_OUT_OF_MEMORY);
6796 }
6797}
6798
6799void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6800{
6801 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6802
6803 try
6804 {
6805 gl::Context *context = gl::getNonLostContext();
6806
6807 if (context)
6808 {
6809 if (context->getClientVersion() < 3)
6810 {
6811 return gl::error(GL_INVALID_OPERATION);
6812 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006813
Jamie Madill3641b4b2013-07-26 12:54:59 -04006814 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6815 {
6816 // TODO: XFB queries
6817 UNIMPLEMENTED();
6818 }
6819 else
6820 {
6821 glGetQueryivEXT(target, pname, params);
6822 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006823 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006824 }
6825 catch(std::bad_alloc&)
6826 {
6827 return gl::error(GL_OUT_OF_MEMORY);
6828 }
6829}
6830
6831void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6832{
6833 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6834
6835 try
6836 {
6837 gl::Context *context = gl::getNonLostContext();
6838
6839 if (context)
6840 {
6841 if (context->getClientVersion() < 3)
6842 {
6843 return gl::error(GL_INVALID_OPERATION);
6844 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006845
Jamie Madill3641b4b2013-07-26 12:54:59 -04006846 // TODO: XFB queries
6847 glGetQueryObjectuivEXT(id, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006848 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006849 }
6850 catch(std::bad_alloc&)
6851 {
6852 return gl::error(GL_OUT_OF_MEMORY);
6853 }
6854}
6855
6856GLboolean __stdcall glUnmapBuffer(GLenum target)
6857{
6858 EVENT("(GLenum target = 0x%X)", target);
6859
6860 try
6861 {
6862 gl::Context *context = gl::getNonLostContext();
6863
6864 if (context)
6865 {
6866 if (context->getClientVersion() < 3)
6867 {
6868 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6869 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006870
Jamie Madill54133512013-06-21 09:33:07 -04006871 // glUnmapBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006872 UNIMPLEMENTED();
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, GL_FALSE);
6878 }
6879
6880 return GL_FALSE;
6881}
6882
6883void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6884{
6885 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6886
6887 try
6888 {
6889 gl::Context *context = gl::getNonLostContext();
6890
6891 if (context)
6892 {
6893 if (context->getClientVersion() < 3)
6894 {
6895 return gl::error(GL_INVALID_OPERATION);
6896 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006897
Jamie Madill54133512013-06-21 09:33:07 -04006898 // glGetBufferPointerv
shannonwoods@chromium.org2d2190a2013-05-30 00:17:35 +00006899 UNIMPLEMENTED();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006900 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006901 }
6902 catch(std::bad_alloc&)
6903 {
6904 return gl::error(GL_OUT_OF_MEMORY);
6905 }
6906}
6907
6908void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6909{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006910 try
6911 {
6912 gl::Context *context = gl::getNonLostContext();
6913
6914 if (context)
6915 {
6916 if (context->getClientVersion() < 3)
6917 {
6918 return gl::error(GL_INVALID_OPERATION);
6919 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006920
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006921 glDrawBuffersEXT(n, bufs);
6922 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006923 }
6924 catch(std::bad_alloc&)
6925 {
6926 return gl::error(GL_OUT_OF_MEMORY);
6927 }
6928}
6929
6930void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6931{
6932 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6933 location, count, transpose, value);
6934
6935 try
6936 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006937 if (count < 0)
6938 {
6939 return gl::error(GL_INVALID_VALUE);
6940 }
6941
6942 if (location == -1)
6943 {
6944 return;
6945 }
6946
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006947 gl::Context *context = gl::getNonLostContext();
6948
6949 if (context)
6950 {
6951 if (context->getClientVersion() < 3)
6952 {
6953 return gl::error(GL_INVALID_OPERATION);
6954 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006955
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006956 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6957 if (!programBinary)
6958 {
6959 return gl::error(GL_INVALID_OPERATION);
6960 }
6961
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006962 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006963 {
6964 return gl::error(GL_INVALID_OPERATION);
6965 }
6966 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006967 }
6968 catch(std::bad_alloc&)
6969 {
6970 return gl::error(GL_OUT_OF_MEMORY);
6971 }
6972}
6973
6974void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6975{
6976 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6977 location, count, transpose, value);
6978
6979 try
6980 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006981 if (count < 0)
6982 {
6983 return gl::error(GL_INVALID_VALUE);
6984 }
6985
6986 if (location == -1)
6987 {
6988 return;
6989 }
6990
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006991 gl::Context *context = gl::getNonLostContext();
6992
6993 if (context)
6994 {
6995 if (context->getClientVersion() < 3)
6996 {
6997 return gl::error(GL_INVALID_OPERATION);
6998 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006999
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007000 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7001 if (!programBinary)
7002 {
7003 return gl::error(GL_INVALID_OPERATION);
7004 }
7005
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007006 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007007 {
7008 return gl::error(GL_INVALID_OPERATION);
7009 }
7010 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007011 }
7012 catch(std::bad_alloc&)
7013 {
7014 return gl::error(GL_OUT_OF_MEMORY);
7015 }
7016}
7017
7018void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7019{
7020 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7021 location, count, transpose, value);
7022
7023 try
7024 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007025 if (count < 0)
7026 {
7027 return gl::error(GL_INVALID_VALUE);
7028 }
7029
7030 if (location == -1)
7031 {
7032 return;
7033 }
7034
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007035 gl::Context *context = gl::getNonLostContext();
7036
7037 if (context)
7038 {
7039 if (context->getClientVersion() < 3)
7040 {
7041 return gl::error(GL_INVALID_OPERATION);
7042 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007043
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007044 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7045 if (!programBinary)
7046 {
7047 return gl::error(GL_INVALID_OPERATION);
7048 }
7049
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007050 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007051 {
7052 return gl::error(GL_INVALID_OPERATION);
7053 }
7054 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007055 }
7056 catch(std::bad_alloc&)
7057 {
7058 return gl::error(GL_OUT_OF_MEMORY);
7059 }
7060}
7061
7062void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7063{
7064 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7065 location, count, transpose, value);
7066
7067 try
7068 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007069 if (count < 0)
7070 {
7071 return gl::error(GL_INVALID_VALUE);
7072 }
7073
7074 if (location == -1)
7075 {
7076 return;
7077 }
7078
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007079 gl::Context *context = gl::getNonLostContext();
7080
7081 if (context)
7082 {
7083 if (context->getClientVersion() < 3)
7084 {
7085 return gl::error(GL_INVALID_OPERATION);
7086 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007087
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007088 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7089 if (!programBinary)
7090 {
7091 return gl::error(GL_INVALID_OPERATION);
7092 }
7093
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007094 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007095 {
7096 return gl::error(GL_INVALID_OPERATION);
7097 }
7098 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007099 }
7100 catch(std::bad_alloc&)
7101 {
7102 return gl::error(GL_OUT_OF_MEMORY);
7103 }
7104}
7105
7106void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7107{
7108 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7109 location, count, transpose, value);
7110
7111 try
7112 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007113 if (count < 0)
7114 {
7115 return gl::error(GL_INVALID_VALUE);
7116 }
7117
7118 if (location == -1)
7119 {
7120 return;
7121 }
7122
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007123 gl::Context *context = gl::getNonLostContext();
7124
7125 if (context)
7126 {
7127 if (context->getClientVersion() < 3)
7128 {
7129 return gl::error(GL_INVALID_OPERATION);
7130 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007131
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007132 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7133 if (!programBinary)
7134 {
7135 return gl::error(GL_INVALID_OPERATION);
7136 }
7137
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007138 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007139 {
7140 return gl::error(GL_INVALID_OPERATION);
7141 }
7142 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007143 }
7144 catch(std::bad_alloc&)
7145 {
7146 return gl::error(GL_OUT_OF_MEMORY);
7147 }
7148}
7149
7150void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7151{
7152 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7153 location, count, transpose, value);
7154
7155 try
7156 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007157 if (count < 0)
7158 {
7159 return gl::error(GL_INVALID_VALUE);
7160 }
7161
7162 if (location == -1)
7163 {
7164 return;
7165 }
7166
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007167 gl::Context *context = gl::getNonLostContext();
7168
7169 if (context)
7170 {
7171 if (context->getClientVersion() < 3)
7172 {
7173 return gl::error(GL_INVALID_OPERATION);
7174 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007175
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007176 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7177 if (!programBinary)
7178 {
7179 return gl::error(GL_INVALID_OPERATION);
7180 }
7181
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007182 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007183 {
7184 return gl::error(GL_INVALID_OPERATION);
7185 }
7186 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007187 }
7188 catch(std::bad_alloc&)
7189 {
7190 return gl::error(GL_OUT_OF_MEMORY);
7191 }
7192}
7193
7194void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7195{
7196 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7197 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7198 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7199
7200 try
7201 {
7202 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007203 if (context)
7204 {
7205 if (context->getClientVersion() < 3)
7206 {
7207 return gl::error(GL_INVALID_OPERATION);
7208 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007209
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007210 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04007211 dstX0, dstY0, dstX1, dstY1, mask, filter,
7212 false))
7213 {
7214 return;
7215 }
7216
7217 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7218 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007219 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007220 }
7221 catch(std::bad_alloc&)
7222 {
7223 return gl::error(GL_OUT_OF_MEMORY);
7224 }
7225}
7226
7227void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7228{
7229 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7230 target, samples, internalformat, width, height);
7231
7232 try
7233 {
7234 gl::Context *context = gl::getNonLostContext();
7235
7236 if (context)
7237 {
7238 if (context->getClientVersion() < 3)
7239 {
7240 return gl::error(GL_INVALID_OPERATION);
7241 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007242
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007243 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007244 width, height, false))
7245 {
7246 return;
7247 }
7248
7249 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007250 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007251 }
7252 catch(std::bad_alloc&)
7253 {
7254 return gl::error(GL_OUT_OF_MEMORY);
7255 }
7256}
7257
7258void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7259{
7260 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7261 target, attachment, texture, level, layer);
7262
7263 try
7264 {
7265 gl::Context *context = gl::getNonLostContext();
7266
7267 if (context)
7268 {
7269 if (context->getClientVersion() < 3)
7270 {
7271 return gl::error(GL_INVALID_OPERATION);
7272 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007273
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007274 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007275 {
7276 return;
7277 }
7278
7279 gl::Framebuffer *framebuffer = NULL;
7280 if (target == GL_READ_FRAMEBUFFER)
7281 {
7282 framebuffer = context->getReadFramebuffer();
7283 }
7284 else
7285 {
7286 framebuffer = context->getDrawFramebuffer();
7287 }
7288
7289 gl::Texture *textureObject = context->getTexture(texture);
7290 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7291
7292 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7293 {
7294 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7295 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7296 }
7297 else
7298 {
7299 switch (attachment)
7300 {
7301 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7302 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7303 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7304 }
7305 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007306 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007307 }
7308 catch(std::bad_alloc&)
7309 {
7310 return gl::error(GL_OUT_OF_MEMORY);
7311 }
7312}
7313
7314GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7315{
7316 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7317 target, offset, length, access);
7318
7319 try
7320 {
7321 gl::Context *context = gl::getNonLostContext();
7322
7323 if (context)
7324 {
7325 if (context->getClientVersion() < 3)
7326 {
7327 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7328 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007329
Jamie Madill54133512013-06-21 09:33:07 -04007330 // glMapBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007331 UNIMPLEMENTED();
7332 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007333 }
7334 catch(std::bad_alloc&)
7335 {
7336 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7337 }
7338
7339 return NULL;
7340}
7341
7342void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7343{
7344 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7345
7346 try
7347 {
7348 gl::Context *context = gl::getNonLostContext();
7349
7350 if (context)
7351 {
7352 if (context->getClientVersion() < 3)
7353 {
7354 return gl::error(GL_INVALID_OPERATION);
7355 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007356
Jamie Madill54133512013-06-21 09:33:07 -04007357 // glFlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007358 UNIMPLEMENTED();
7359 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007360 }
7361 catch(std::bad_alloc&)
7362 {
7363 return gl::error(GL_OUT_OF_MEMORY);
7364 }
7365}
7366
7367void __stdcall glBindVertexArray(GLuint array)
7368{
7369 EVENT("(GLuint array = %u)", array);
7370
7371 try
7372 {
7373 gl::Context *context = gl::getNonLostContext();
7374
7375 if (context)
7376 {
7377 if (context->getClientVersion() < 3)
7378 {
7379 return gl::error(GL_INVALID_OPERATION);
7380 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007381
Jamie Madilld1028542013-07-02 11:57:04 -04007382 gl::VertexArray *vao = context->getVertexArray(array);
7383
7384 if (!vao)
7385 {
7386 // The default VAO should always exist
7387 ASSERT(array != 0);
7388 return gl::error(GL_INVALID_OPERATION);
7389 }
7390
7391 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007392 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007393 }
7394 catch(std::bad_alloc&)
7395 {
7396 return gl::error(GL_OUT_OF_MEMORY);
7397 }
7398}
7399
7400void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7401{
7402 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7403
7404 try
7405 {
7406 gl::Context *context = gl::getNonLostContext();
7407
7408 if (context)
7409 {
7410 if (context->getClientVersion() < 3)
7411 {
7412 return gl::error(GL_INVALID_OPERATION);
7413 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007414
Jamie Madilld1028542013-07-02 11:57:04 -04007415 if (n < 0)
7416 {
7417 return gl::error(GL_INVALID_VALUE);
7418 }
7419
7420 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7421 {
7422 if (arrays[arrayIndex] != 0)
7423 {
7424 context->deleteVertexArray(arrays[arrayIndex]);
7425 }
7426 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007427 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007428 }
7429 catch(std::bad_alloc&)
7430 {
7431 return gl::error(GL_OUT_OF_MEMORY);
7432 }
7433}
7434
7435void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7436{
7437 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7438
7439 try
7440 {
7441 gl::Context *context = gl::getNonLostContext();
7442
7443 if (context)
7444 {
7445 if (context->getClientVersion() < 3)
7446 {
7447 return gl::error(GL_INVALID_OPERATION);
7448 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007449
Jamie Madilld1028542013-07-02 11:57:04 -04007450 if (n < 0)
7451 {
7452 return gl::error(GL_INVALID_VALUE);
7453 }
7454
7455 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7456 {
7457 arrays[arrayIndex] = context->createVertexArray();
7458 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007459 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007460 }
7461 catch(std::bad_alloc&)
7462 {
7463 return gl::error(GL_OUT_OF_MEMORY);
7464 }
7465}
7466
7467GLboolean __stdcall glIsVertexArray(GLuint array)
7468{
7469 EVENT("(GLuint array = %u)", array);
7470
7471 try
7472 {
7473 gl::Context *context = gl::getNonLostContext();
7474
7475 if (context)
7476 {
7477 if (context->getClientVersion() < 3)
7478 {
7479 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7480 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007481
Jamie Madilld1028542013-07-02 11:57:04 -04007482 if (array == 0)
7483 {
7484 return GL_FALSE;
7485 }
7486
7487 gl::VertexArray *vao = context->getVertexArray(array);
7488
7489 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007490 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007491 }
7492 catch(std::bad_alloc&)
7493 {
7494 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7495 }
7496
7497 return GL_FALSE;
7498}
7499
7500void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7501{
7502 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7503 target, index, data);
7504
7505 try
7506 {
7507 gl::Context *context = gl::getNonLostContext();
7508
7509 if (context)
7510 {
7511 if (context->getClientVersion() < 3)
7512 {
7513 return gl::error(GL_INVALID_OPERATION);
7514 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007515
Shannon Woods15934d52013-08-19 14:28:49 -04007516 switch (target)
7517 {
7518 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7519 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7520 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7521 if (index >= context->getMaxTransformFeedbackBufferBindings())
7522 return gl::error(GL_INVALID_VALUE);
7523 break;
7524 case GL_UNIFORM_BUFFER_START:
7525 case GL_UNIFORM_BUFFER_SIZE:
7526 case GL_UNIFORM_BUFFER_BINDING:
7527 if (index >= context->getMaximumCombinedUniformBufferBindings())
7528 return gl::error(GL_INVALID_VALUE);
7529 break;
7530 default:
7531 return gl::error(GL_INVALID_ENUM);
7532 }
7533
7534 if (!(context->getIndexedIntegerv(target, index, data)))
7535 {
7536 GLenum nativeType;
7537 unsigned int numParams = 0;
7538 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7539 return gl::error(GL_INVALID_ENUM);
7540
7541 if (numParams == 0)
7542 return; // it is known that pname is valid, but there are no parameters to return
7543
7544 if (nativeType == GL_INT_64_ANGLEX)
7545 {
7546 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7547 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7548 GLint64 *int64Params = new GLint64[numParams];
7549
7550 context->getIndexedInteger64v(target, index, int64Params);
7551
7552 for (unsigned int i = 0; i < numParams; ++i)
7553 {
7554 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7555 data[i] = static_cast<GLint>(clampedValue);
7556 }
7557
7558 delete [] int64Params;
7559 }
7560 else
7561 {
7562 UNREACHABLE();
7563 }
7564 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007565 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007566 }
7567 catch(std::bad_alloc&)
7568 {
7569 return gl::error(GL_OUT_OF_MEMORY);
7570 }
7571}
7572
7573void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7574{
7575 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7576
7577 try
7578 {
7579 gl::Context *context = gl::getNonLostContext();
7580
7581 if (context)
7582 {
7583 if (context->getClientVersion() < 3)
7584 {
7585 return gl::error(GL_INVALID_OPERATION);
7586 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007587
Jamie Madill54133512013-06-21 09:33:07 -04007588 // glBeginTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007589 UNIMPLEMENTED();
7590 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007591 }
7592 catch(std::bad_alloc&)
7593 {
7594 return gl::error(GL_OUT_OF_MEMORY);
7595 }
7596}
7597
7598void __stdcall glEndTransformFeedback(void)
7599{
7600 EVENT("(void)");
7601
7602 try
7603 {
7604 gl::Context *context = gl::getNonLostContext();
7605
7606 if (context)
7607 {
7608 if (context->getClientVersion() < 3)
7609 {
7610 return gl::error(GL_INVALID_OPERATION);
7611 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007612
Jamie Madill54133512013-06-21 09:33:07 -04007613 // glEndTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007614 UNIMPLEMENTED();
7615 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007616 }
7617 catch(std::bad_alloc&)
7618 {
7619 return gl::error(GL_OUT_OF_MEMORY);
7620 }
7621}
7622
7623void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7624{
7625 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7626 target, index, buffer, offset, size);
7627
7628 try
7629 {
7630 gl::Context *context = gl::getNonLostContext();
7631
7632 if (context)
7633 {
7634 if (context->getClientVersion() < 3)
7635 {
7636 return gl::error(GL_INVALID_OPERATION);
7637 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007638
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007639 switch (target)
7640 {
7641 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007642 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007643 {
7644 return gl::error(GL_INVALID_VALUE);
7645 }
7646 break;
7647
7648 case GL_UNIFORM_BUFFER:
7649 if (index >= context->getMaximumCombinedUniformBufferBindings())
7650 {
7651 return gl::error(GL_INVALID_VALUE);
7652 }
7653 break;
7654
7655 default:
7656 return gl::error(GL_INVALID_ENUM);
7657 }
7658
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007659 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007660 {
7661 return gl::error(GL_INVALID_VALUE);
7662 }
7663
7664 switch (target)
7665 {
7666 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007667
7668 // size and offset must be a multiple of 4
7669 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7670 {
7671 return gl::error(GL_INVALID_VALUE);
7672 }
7673
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007674 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7675 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007676 break;
7677
7678 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007679
7680 // it is an error to bind an offset not a multiple of the alignment
7681 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7682 {
7683 return gl::error(GL_INVALID_VALUE);
7684 }
7685
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007686 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7687 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007688 break;
7689
7690 default:
7691 UNREACHABLE();
7692 }
7693 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007694 }
7695 catch(std::bad_alloc&)
7696 {
7697 return gl::error(GL_OUT_OF_MEMORY);
7698 }
7699}
7700
7701void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7702{
7703 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7704 target, index, buffer);
7705
7706 try
7707 {
7708 gl::Context *context = gl::getNonLostContext();
7709
7710 if (context)
7711 {
7712 if (context->getClientVersion() < 3)
7713 {
7714 return gl::error(GL_INVALID_OPERATION);
7715 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007716
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007717 switch (target)
7718 {
7719 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007720 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007721 {
7722 return gl::error(GL_INVALID_VALUE);
7723 }
7724 break;
7725
7726 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007727 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007728 {
7729 return gl::error(GL_INVALID_VALUE);
7730 }
7731 break;
7732
7733 default:
7734 return gl::error(GL_INVALID_ENUM);
7735 }
7736
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007737 switch (target)
7738 {
7739 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007740 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007741 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007742 break;
7743
7744 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007745 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007746 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007747 break;
7748
7749 default:
7750 UNREACHABLE();
7751 }
7752 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007753 }
7754 catch(std::bad_alloc&)
7755 {
7756 return gl::error(GL_OUT_OF_MEMORY);
7757 }
7758}
7759
7760void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7761{
7762 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7763 program, count, varyings, bufferMode);
7764
7765 try
7766 {
7767 gl::Context *context = gl::getNonLostContext();
7768
7769 if (context)
7770 {
7771 if (context->getClientVersion() < 3)
7772 {
7773 return gl::error(GL_INVALID_OPERATION);
7774 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007775
Jamie Madill54133512013-06-21 09:33:07 -04007776 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007777 UNIMPLEMENTED();
7778 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007779 }
7780 catch(std::bad_alloc&)
7781 {
7782 return gl::error(GL_OUT_OF_MEMORY);
7783 }
7784}
7785
7786void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7787{
7788 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7789 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7790 program, index, bufSize, length, size, type, name);
7791
7792 try
7793 {
7794 gl::Context *context = gl::getNonLostContext();
7795
7796 if (context)
7797 {
7798 if (context->getClientVersion() < 3)
7799 {
7800 return gl::error(GL_INVALID_OPERATION);
7801 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007802
Jamie Madill54133512013-06-21 09:33:07 -04007803 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007804 UNIMPLEMENTED();
7805 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007806 }
7807 catch(std::bad_alloc&)
7808 {
7809 return gl::error(GL_OUT_OF_MEMORY);
7810 }
7811}
7812
7813void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7814{
7815 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7816 index, size, type, stride, pointer);
7817
7818 try
7819 {
7820 gl::Context *context = gl::getNonLostContext();
7821
7822 if (context)
7823 {
7824 if (context->getClientVersion() < 3)
7825 {
7826 return gl::error(GL_INVALID_OPERATION);
7827 }
7828 }
7829
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007830 if (index >= gl::MAX_VERTEX_ATTRIBS)
7831 {
7832 return gl::error(GL_INVALID_VALUE);
7833 }
7834
7835 if (size < 1 || size > 4)
7836 {
7837 return gl::error(GL_INVALID_VALUE);
7838 }
7839
7840 switch (type)
7841 {
7842 case GL_BYTE:
7843 case GL_UNSIGNED_BYTE:
7844 case GL_SHORT:
7845 case GL_UNSIGNED_SHORT:
7846 case GL_INT:
7847 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007848 case GL_INT_2_10_10_10_REV:
7849 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007850 break;
7851 default:
7852 return gl::error(GL_INVALID_ENUM);
7853 }
7854
7855 if (stride < 0)
7856 {
7857 return gl::error(GL_INVALID_VALUE);
7858 }
7859
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007860 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7861 {
7862 return gl::error(GL_INVALID_OPERATION);
7863 }
7864
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007865 if (context)
7866 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007867 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7868 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7869 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7870 // and the pointer argument is not NULL.
7871 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7872 {
7873 return gl::error(GL_INVALID_OPERATION);
7874 }
7875
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007876 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7877 stride, pointer);
7878 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007879 }
7880 catch(std::bad_alloc&)
7881 {
7882 return gl::error(GL_OUT_OF_MEMORY);
7883 }
7884}
7885
7886void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7887{
7888 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7889 index, pname, params);
7890
7891 try
7892 {
7893 gl::Context *context = gl::getNonLostContext();
7894
7895 if (context)
7896 {
7897 if (context->getClientVersion() < 3)
7898 {
7899 return gl::error(GL_INVALID_OPERATION);
7900 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007901
Jamie Madilla7d05862013-07-02 11:57:06 -04007902 if (index >= gl::MAX_VERTEX_ATTRIBS)
7903 {
7904 return gl::error(GL_INVALID_VALUE);
7905 }
7906
7907 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7908
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007909 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007910 {
7911 return;
7912 }
7913
7914 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7915 {
7916 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7917 for (int i = 0; i < 4; ++i)
7918 {
7919 params[i] = currentValueData.IntValues[i];
7920 }
7921 }
7922 else
7923 {
7924 *params = attribState.querySingleParameter<GLint>(pname);
7925 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007926 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007927 }
7928 catch(std::bad_alloc&)
7929 {
7930 return gl::error(GL_OUT_OF_MEMORY);
7931 }
7932}
7933
7934void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7935{
7936 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7937 index, pname, params);
7938
7939 try
7940 {
7941 gl::Context *context = gl::getNonLostContext();
7942
7943 if (context)
7944 {
7945 if (context->getClientVersion() < 3)
7946 {
7947 return gl::error(GL_INVALID_OPERATION);
7948 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007949
Jamie Madilla7d05862013-07-02 11:57:06 -04007950 if (index >= gl::MAX_VERTEX_ATTRIBS)
7951 {
7952 return gl::error(GL_INVALID_VALUE);
7953 }
7954
7955 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7956
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007957 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007958 {
7959 return;
7960 }
7961
7962 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7963 {
7964 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7965 for (int i = 0; i < 4; ++i)
7966 {
7967 params[i] = currentValueData.UnsignedIntValues[i];
7968 }
7969 }
7970 else
7971 {
7972 *params = attribState.querySingleParameter<GLuint>(pname);
7973 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007974 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007975 }
7976 catch(std::bad_alloc&)
7977 {
7978 return gl::error(GL_OUT_OF_MEMORY);
7979 }
7980}
7981
7982void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7983{
7984 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7985 index, x, y, z, w);
7986
7987 try
7988 {
7989 gl::Context *context = gl::getNonLostContext();
7990
7991 if (context)
7992 {
7993 if (context->getClientVersion() < 3)
7994 {
7995 return gl::error(GL_INVALID_OPERATION);
7996 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007997
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007998 if (index >= gl::MAX_VERTEX_ATTRIBS)
7999 {
8000 return gl::error(GL_INVALID_VALUE);
8001 }
8002
8003 GLint vals[4] = { x, y, z, w };
8004 context->setVertexAttribi(index, vals);
8005 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008006 }
8007 catch(std::bad_alloc&)
8008 {
8009 return gl::error(GL_OUT_OF_MEMORY);
8010 }
8011}
8012
8013void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8014{
8015 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8016 index, x, y, z, w);
8017
8018 try
8019 {
8020 gl::Context *context = gl::getNonLostContext();
8021
8022 if (context)
8023 {
8024 if (context->getClientVersion() < 3)
8025 {
8026 return gl::error(GL_INVALID_OPERATION);
8027 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008028
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008029 if (index >= gl::MAX_VERTEX_ATTRIBS)
8030 {
8031 return gl::error(GL_INVALID_VALUE);
8032 }
8033
8034 GLuint vals[4] = { x, y, z, w };
8035 context->setVertexAttribu(index, vals);
8036 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008037 }
8038 catch(std::bad_alloc&)
8039 {
8040 return gl::error(GL_OUT_OF_MEMORY);
8041 }
8042}
8043
8044void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8045{
8046 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8047
8048 try
8049 {
8050 gl::Context *context = gl::getNonLostContext();
8051
8052 if (context)
8053 {
8054 if (context->getClientVersion() < 3)
8055 {
8056 return gl::error(GL_INVALID_OPERATION);
8057 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008058
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008059 if (index >= gl::MAX_VERTEX_ATTRIBS)
8060 {
8061 return gl::error(GL_INVALID_VALUE);
8062 }
8063
8064 context->setVertexAttribi(index, v);
8065 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008066 }
8067 catch(std::bad_alloc&)
8068 {
8069 return gl::error(GL_OUT_OF_MEMORY);
8070 }
8071}
8072
8073void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8074{
8075 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8076
8077 try
8078 {
8079 gl::Context *context = gl::getNonLostContext();
8080
8081 if (context)
8082 {
8083 if (context->getClientVersion() < 3)
8084 {
8085 return gl::error(GL_INVALID_OPERATION);
8086 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008087
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008088 if (index >= gl::MAX_VERTEX_ATTRIBS)
8089 {
8090 return gl::error(GL_INVALID_VALUE);
8091 }
8092
8093 context->setVertexAttribu(index, v);
8094 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008095 }
8096 catch(std::bad_alloc&)
8097 {
8098 return gl::error(GL_OUT_OF_MEMORY);
8099 }
8100}
8101
8102void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8103{
8104 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8105 program, location, params);
8106
8107 try
8108 {
8109 gl::Context *context = gl::getNonLostContext();
8110
8111 if (context)
8112 {
8113 if (context->getClientVersion() < 3)
8114 {
8115 return gl::error(GL_INVALID_OPERATION);
8116 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008117
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008118 if (program == 0)
8119 {
8120 return gl::error(GL_INVALID_VALUE);
8121 }
8122
8123 gl::Program *programObject = context->getProgram(program);
8124
8125 if (!programObject || !programObject->isLinked())
8126 {
8127 return gl::error(GL_INVALID_OPERATION);
8128 }
8129
8130 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8131 if (!programBinary)
8132 {
8133 return gl::error(GL_INVALID_OPERATION);
8134 }
8135
8136 if (!programBinary->getUniformuiv(location, NULL, params))
8137 {
8138 return gl::error(GL_INVALID_OPERATION);
8139 }
8140 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008141 }
8142 catch(std::bad_alloc&)
8143 {
8144 return gl::error(GL_OUT_OF_MEMORY);
8145 }
8146}
8147
8148GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8149{
8150 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8151 program, name);
8152
8153 try
8154 {
8155 gl::Context *context = gl::getNonLostContext();
8156
8157 if (context)
8158 {
8159 if (context->getClientVersion() < 3)
8160 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008161 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008162 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008163
Jamie Madilld1e78c92013-06-20 11:55:50 -04008164 if (program == 0)
8165 {
8166 return gl::error(GL_INVALID_VALUE, -1);
8167 }
8168
8169 gl::Program *programObject = context->getProgram(program);
8170
8171 if (!programObject || !programObject->isLinked())
8172 {
8173 return gl::error(GL_INVALID_OPERATION, -1);
8174 }
8175
8176 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8177 if (!programBinary)
8178 {
8179 return gl::error(GL_INVALID_OPERATION, -1);
8180 }
8181
8182 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008183 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008184 }
8185 catch(std::bad_alloc&)
8186 {
8187 return gl::error(GL_OUT_OF_MEMORY, 0);
8188 }
8189
8190 return 0;
8191}
8192
8193void __stdcall glUniform1ui(GLint location, GLuint v0)
8194{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008195 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008196}
8197
8198void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8199{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008200 const GLuint xy[] = { v0, v1 };
8201 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008202}
8203
8204void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8205{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008206 const GLuint xyz[] = { v0, v1, v2 };
8207 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008208}
8209
8210void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8211{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008212 const GLuint xyzw[] = { v0, v1, v2, v3 };
8213 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008214}
8215
8216void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8217{
8218 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8219 location, count, value);
8220
8221 try
8222 {
8223 gl::Context *context = gl::getNonLostContext();
8224
8225 if (context)
8226 {
8227 if (context->getClientVersion() < 3)
8228 {
8229 return gl::error(GL_INVALID_OPERATION);
8230 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008231
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008232 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8233 if (!programBinary)
8234 {
8235 return gl::error(GL_INVALID_OPERATION);
8236 }
8237
8238 if (!programBinary->setUniform1uiv(location, count, value))
8239 {
8240 return gl::error(GL_INVALID_OPERATION);
8241 }
8242 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008243 }
8244 catch(std::bad_alloc&)
8245 {
8246 return gl::error(GL_OUT_OF_MEMORY);
8247 }
8248}
8249
8250void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8251{
8252 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8253 location, count, value);
8254
8255 try
8256 {
8257 gl::Context *context = gl::getNonLostContext();
8258
8259 if (context)
8260 {
8261 if (context->getClientVersion() < 3)
8262 {
8263 return gl::error(GL_INVALID_OPERATION);
8264 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008265
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008266 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8267 if (!programBinary)
8268 {
8269 return gl::error(GL_INVALID_OPERATION);
8270 }
8271
8272 if (!programBinary->setUniform2uiv(location, count, value))
8273 {
8274 return gl::error(GL_INVALID_OPERATION);
8275 }
8276 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008277 }
8278 catch(std::bad_alloc&)
8279 {
8280 return gl::error(GL_OUT_OF_MEMORY);
8281 }
8282}
8283
8284void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8285{
8286 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8287 location, count, value);
8288
8289 try
8290 {
8291 gl::Context *context = gl::getNonLostContext();
8292
8293 if (context)
8294 {
8295 if (context->getClientVersion() < 3)
8296 {
8297 return gl::error(GL_INVALID_OPERATION);
8298 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008299
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008300 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8301 if (!programBinary)
8302 {
8303 return gl::error(GL_INVALID_OPERATION);
8304 }
8305
8306 if (!programBinary->setUniform3uiv(location, count, value))
8307 {
8308 return gl::error(GL_INVALID_OPERATION);
8309 }
8310 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008311 }
8312 catch(std::bad_alloc&)
8313 {
8314 return gl::error(GL_OUT_OF_MEMORY);
8315 }
8316}
8317
8318void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8319{
8320 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8321 location, count, value);
8322
8323 try
8324 {
8325 gl::Context *context = gl::getNonLostContext();
8326
8327 if (context)
8328 {
8329 if (context->getClientVersion() < 3)
8330 {
8331 return gl::error(GL_INVALID_OPERATION);
8332 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008333
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008334 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8335 if (!programBinary)
8336 {
8337 return gl::error(GL_INVALID_OPERATION);
8338 }
8339
8340 if (!programBinary->setUniform4uiv(location, count, value))
8341 {
8342 return gl::error(GL_INVALID_OPERATION);
8343 }
8344 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008345 }
8346 catch(std::bad_alloc&)
8347 {
8348 return gl::error(GL_OUT_OF_MEMORY);
8349 }
8350}
8351
8352void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8353{
8354 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8355 buffer, drawbuffer, value);
8356
8357 try
8358 {
8359 gl::Context *context = gl::getNonLostContext();
8360
8361 if (context)
8362 {
8363 if (context->getClientVersion() < 3)
8364 {
8365 return gl::error(GL_INVALID_OPERATION);
8366 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008367
Geoff Lang42359ca2013-08-21 13:25:17 -04008368 switch (buffer)
8369 {
8370 case GL_COLOR:
8371 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8372 {
8373 return gl::error(GL_INVALID_VALUE);
8374 }
8375 break;
8376 case GL_STENCIL:
8377 if (drawbuffer != 0)
8378 {
8379 return gl::error(GL_INVALID_VALUE);
8380 }
8381 default:
8382 return gl::error(GL_INVALID_ENUM);
8383 }
8384
8385 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008386 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008387 }
8388 catch(std::bad_alloc&)
8389 {
8390 return gl::error(GL_OUT_OF_MEMORY);
8391 }
8392}
8393
8394void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8395{
8396 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8397 buffer, drawbuffer, value);
8398
8399 try
8400 {
8401 gl::Context *context = gl::getNonLostContext();
8402
8403 if (context)
8404 {
8405 if (context->getClientVersion() < 3)
8406 {
8407 return gl::error(GL_INVALID_OPERATION);
8408 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008409
Geoff Lang42359ca2013-08-21 13:25:17 -04008410 switch (buffer)
8411 {
8412 case GL_COLOR:
8413 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8414 {
8415 return gl::error(GL_INVALID_VALUE);
8416 }
8417 break;
8418 default:
8419 return gl::error(GL_INVALID_ENUM);
8420 }
8421
8422 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008423 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008424 }
8425 catch(std::bad_alloc&)
8426 {
8427 return gl::error(GL_OUT_OF_MEMORY);
8428 }
8429}
8430
8431void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8432{
8433 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8434 buffer, drawbuffer, value);
8435
8436 try
8437 {
8438 gl::Context *context = gl::getNonLostContext();
8439
8440 if (context)
8441 {
8442 if (context->getClientVersion() < 3)
8443 {
8444 return gl::error(GL_INVALID_OPERATION);
8445 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008446
Geoff Lang42359ca2013-08-21 13:25:17 -04008447 switch (buffer)
8448 {
8449 case GL_COLOR:
8450 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8451 {
8452 return gl::error(GL_INVALID_VALUE);
8453 }
8454 break;
8455 case GL_DEPTH:
8456 if (drawbuffer != 0)
8457 {
8458 return gl::error(GL_INVALID_VALUE);
8459 }
8460 break;
8461 default:
8462 return gl::error(GL_INVALID_ENUM);
8463 }
8464
8465 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008466 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008467 }
8468 catch(std::bad_alloc&)
8469 {
8470 return gl::error(GL_OUT_OF_MEMORY);
8471 }
8472}
8473
8474void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8475{
8476 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8477 buffer, drawbuffer, depth, stencil);
8478
8479 try
8480 {
8481 gl::Context *context = gl::getNonLostContext();
8482
8483 if (context)
8484 {
8485 if (context->getClientVersion() < 3)
8486 {
8487 return gl::error(GL_INVALID_OPERATION);
8488 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008489
Geoff Lang42359ca2013-08-21 13:25:17 -04008490 switch (buffer)
8491 {
8492 case GL_DEPTH_STENCIL:
8493 if (drawbuffer != 0)
8494 {
8495 return gl::error(GL_INVALID_VALUE);
8496 }
8497 break;
8498 default:
8499 return gl::error(GL_INVALID_ENUM);
8500 }
8501
8502 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008503 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008504 }
8505 catch(std::bad_alloc&)
8506 {
8507 return gl::error(GL_OUT_OF_MEMORY);
8508 }
8509}
8510
8511const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8512{
8513 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8514
8515 try
8516 {
8517 gl::Context *context = gl::getNonLostContext();
8518
8519 if (context)
8520 {
8521 if (context->getClientVersion() < 3)
8522 {
8523 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8524 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008525
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008526 if (name != GL_EXTENSIONS)
8527 {
8528 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8529 }
8530
8531 if (index >= context->getNumExtensions())
8532 {
8533 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8534 }
8535
8536 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8537 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008538 }
8539 catch(std::bad_alloc&)
8540 {
8541 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8542 }
8543
8544 return NULL;
8545}
8546
8547void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8548{
8549 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8550 readTarget, writeTarget, readOffset, writeOffset, size);
8551
8552 try
8553 {
8554 gl::Context *context = gl::getNonLostContext();
8555
8556 if (context)
8557 {
8558 if (context->getClientVersion() < 3)
8559 {
8560 return gl::error(GL_INVALID_OPERATION);
8561 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008562
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008563 gl::Buffer *readBuffer = NULL;
8564 switch (readTarget)
8565 {
8566 case GL_ARRAY_BUFFER:
8567 readBuffer = context->getArrayBuffer();
8568 break;
8569 case GL_COPY_READ_BUFFER:
8570 readBuffer = context->getCopyReadBuffer();
8571 break;
8572 case GL_COPY_WRITE_BUFFER:
8573 readBuffer = context->getCopyWriteBuffer();
8574 break;
8575 case GL_ELEMENT_ARRAY_BUFFER:
8576 readBuffer = context->getElementArrayBuffer();
8577 break;
8578 case GL_PIXEL_PACK_BUFFER:
8579 readBuffer = context->getPixelPackBuffer();
8580 break;
8581 case GL_PIXEL_UNPACK_BUFFER:
8582 readBuffer = context->getPixelUnpackBuffer();
8583 break;
8584 case GL_TRANSFORM_FEEDBACK_BUFFER:
8585 readBuffer = context->getGenericTransformFeedbackBuffer();
8586 break;
8587 case GL_UNIFORM_BUFFER:
8588 readBuffer = context->getGenericUniformBuffer();
8589 break;
8590 default:
8591 return gl::error(GL_INVALID_ENUM);
8592 }
8593
8594 gl::Buffer *writeBuffer = NULL;
8595 switch (writeTarget)
8596 {
8597 case GL_ARRAY_BUFFER:
8598 writeBuffer = context->getArrayBuffer();
8599 break;
8600 case GL_COPY_READ_BUFFER:
8601 writeBuffer = context->getCopyReadBuffer();
8602 break;
8603 case GL_COPY_WRITE_BUFFER:
8604 writeBuffer = context->getCopyWriteBuffer();
8605 break;
8606 case GL_ELEMENT_ARRAY_BUFFER:
8607 writeBuffer = context->getElementArrayBuffer();
8608 break;
8609 case GL_PIXEL_PACK_BUFFER:
8610 writeBuffer = context->getPixelPackBuffer();
8611 break;
8612 case GL_PIXEL_UNPACK_BUFFER:
8613 writeBuffer = context->getPixelUnpackBuffer();
8614 break;
8615 case GL_TRANSFORM_FEEDBACK_BUFFER:
8616 writeBuffer = context->getGenericTransformFeedbackBuffer();
8617 break;
8618 case GL_UNIFORM_BUFFER:
8619 writeBuffer = context->getGenericUniformBuffer();
8620 break;
8621 default:
8622 return gl::error(GL_INVALID_ENUM);
8623 }
8624
8625 if (!readBuffer || !writeBuffer)
8626 {
8627 return gl::error(GL_INVALID_OPERATION);
8628 }
8629
8630 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8631 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8632 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8633 {
8634 return gl::error(GL_INVALID_VALUE);
8635 }
8636
8637 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8638 {
8639 return gl::error(GL_INVALID_VALUE);
8640 }
8641
8642 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8643
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008644 // if size is zero, the copy is a successful no-op
8645 if (size > 0)
8646 {
8647 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8648 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008649 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008650 }
8651 catch(std::bad_alloc&)
8652 {
8653 return gl::error(GL_OUT_OF_MEMORY);
8654 }
8655}
8656
8657void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8658{
8659 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8660 program, uniformCount, uniformNames, uniformIndices);
8661
8662 try
8663 {
8664 gl::Context *context = gl::getNonLostContext();
8665
8666 if (context)
8667 {
8668 if (context->getClientVersion() < 3)
8669 {
8670 return gl::error(GL_INVALID_OPERATION);
8671 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008672
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008673 if (uniformCount < 0)
8674 {
8675 return gl::error(GL_INVALID_VALUE);
8676 }
8677
8678 gl::Program *programObject = context->getProgram(program);
8679
8680 if (!programObject)
8681 {
8682 if (context->getShader(program))
8683 {
8684 return gl::error(GL_INVALID_OPERATION);
8685 }
8686 else
8687 {
8688 return gl::error(GL_INVALID_VALUE);
8689 }
8690 }
8691
8692 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8693 if (!programObject->isLinked() || !programBinary)
8694 {
8695 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8696 {
8697 uniformIndices[uniformId] = GL_INVALID_INDEX;
8698 }
8699 }
8700 else
8701 {
8702 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8703 {
8704 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8705 }
8706 }
8707 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008708 }
8709 catch(std::bad_alloc&)
8710 {
8711 return gl::error(GL_OUT_OF_MEMORY);
8712 }
8713}
8714
8715void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8716{
8717 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8718 program, uniformCount, uniformIndices, pname, params);
8719
8720 try
8721 {
8722 gl::Context *context = gl::getNonLostContext();
8723
8724 if (context)
8725 {
8726 if (context->getClientVersion() < 3)
8727 {
8728 return gl::error(GL_INVALID_OPERATION);
8729 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008730
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008731 if (uniformCount < 0)
8732 {
8733 return gl::error(GL_INVALID_VALUE);
8734 }
8735
8736 gl::Program *programObject = context->getProgram(program);
8737
8738 if (!programObject)
8739 {
8740 if (context->getShader(program))
8741 {
8742 return gl::error(GL_INVALID_OPERATION);
8743 }
8744 else
8745 {
8746 return gl::error(GL_INVALID_VALUE);
8747 }
8748 }
8749
8750 switch (pname)
8751 {
8752 case GL_UNIFORM_TYPE:
8753 case GL_UNIFORM_SIZE:
8754 case GL_UNIFORM_NAME_LENGTH:
8755 case GL_UNIFORM_BLOCK_INDEX:
8756 case GL_UNIFORM_OFFSET:
8757 case GL_UNIFORM_ARRAY_STRIDE:
8758 case GL_UNIFORM_MATRIX_STRIDE:
8759 case GL_UNIFORM_IS_ROW_MAJOR:
8760 break;
8761 default:
8762 return gl::error(GL_INVALID_ENUM);
8763 }
8764
8765 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8766
8767 if (!programBinary && uniformCount > 0)
8768 {
8769 return gl::error(GL_INVALID_VALUE);
8770 }
8771
8772 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8773 {
8774 const GLuint index = uniformIndices[uniformId];
8775
8776 if (index >= (GLuint)programBinary->getActiveUniformCount())
8777 {
8778 return gl::error(GL_INVALID_VALUE);
8779 }
8780 }
8781
8782 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8783 {
8784 const GLuint index = uniformIndices[uniformId];
8785 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8786 }
8787 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008788 }
8789 catch(std::bad_alloc&)
8790 {
8791 return gl::error(GL_OUT_OF_MEMORY);
8792 }
8793}
8794
8795GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8796{
8797 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8798
8799 try
8800 {
8801 gl::Context *context = gl::getNonLostContext();
8802
8803 if (context)
8804 {
8805 if (context->getClientVersion() < 3)
8806 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008807 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008808 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008809
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008810 gl::Program *programObject = context->getProgram(program);
8811
8812 if (!programObject)
8813 {
8814 if (context->getShader(program))
8815 {
8816 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8817 }
8818 else
8819 {
8820 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8821 }
8822 }
8823
8824 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8825 if (!programBinary)
8826 {
8827 return GL_INVALID_INDEX;
8828 }
8829
8830 return programBinary->getUniformBlockIndex(uniformBlockName);
8831 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008832 }
8833 catch(std::bad_alloc&)
8834 {
8835 return gl::error(GL_OUT_OF_MEMORY, 0);
8836 }
8837
8838 return 0;
8839}
8840
8841void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8842{
8843 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8844 program, uniformBlockIndex, pname, params);
8845
8846 try
8847 {
8848 gl::Context *context = gl::getNonLostContext();
8849
8850 if (context)
8851 {
8852 if (context->getClientVersion() < 3)
8853 {
8854 return gl::error(GL_INVALID_OPERATION);
8855 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008856 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008857
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008858 if (!programObject)
8859 {
8860 if (context->getShader(program))
8861 {
8862 return gl::error(GL_INVALID_OPERATION);
8863 }
8864 else
8865 {
8866 return gl::error(GL_INVALID_VALUE);
8867 }
8868 }
8869
8870 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8871
8872 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8873 {
8874 return gl::error(GL_INVALID_VALUE);
8875 }
8876
8877 switch (pname)
8878 {
8879 case GL_UNIFORM_BLOCK_BINDING:
8880 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8881 break;
8882
8883 case GL_UNIFORM_BLOCK_DATA_SIZE:
8884 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8885 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8886 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8887 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8888 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8889 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8890 break;
8891
8892 default:
8893 return gl::error(GL_INVALID_ENUM);
8894 }
8895 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008896 }
8897 catch(std::bad_alloc&)
8898 {
8899 return gl::error(GL_OUT_OF_MEMORY);
8900 }
8901}
8902
8903void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8904{
8905 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8906 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8907
8908 try
8909 {
8910 gl::Context *context = gl::getNonLostContext();
8911
8912 if (context)
8913 {
8914 if (context->getClientVersion() < 3)
8915 {
8916 return gl::error(GL_INVALID_OPERATION);
8917 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008918
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008919 gl::Program *programObject = context->getProgram(program);
8920
8921 if (!programObject)
8922 {
8923 if (context->getShader(program))
8924 {
8925 return gl::error(GL_INVALID_OPERATION);
8926 }
8927 else
8928 {
8929 return gl::error(GL_INVALID_VALUE);
8930 }
8931 }
8932
8933 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8934
8935 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8936 {
8937 return gl::error(GL_INVALID_VALUE);
8938 }
8939
8940 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8941 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008942 }
8943 catch(std::bad_alloc&)
8944 {
8945 return gl::error(GL_OUT_OF_MEMORY);
8946 }
8947}
8948
8949void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8950{
8951 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8952 program, uniformBlockIndex, uniformBlockBinding);
8953
8954 try
8955 {
8956 gl::Context *context = gl::getNonLostContext();
8957
8958 if (context)
8959 {
8960 if (context->getClientVersion() < 3)
8961 {
8962 return gl::error(GL_INVALID_OPERATION);
8963 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008964
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008965 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8966 {
8967 return gl::error(GL_INVALID_VALUE);
8968 }
8969
8970 gl::Program *programObject = context->getProgram(program);
8971
8972 if (!programObject)
8973 {
8974 if (context->getShader(program))
8975 {
8976 return gl::error(GL_INVALID_OPERATION);
8977 }
8978 else
8979 {
8980 return gl::error(GL_INVALID_VALUE);
8981 }
8982 }
8983
8984 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8985
8986 // if never linked, there won't be any uniform blocks
8987 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8988 {
8989 return gl::error(GL_INVALID_VALUE);
8990 }
8991
8992 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8993 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008994 }
8995 catch(std::bad_alloc&)
8996 {
8997 return gl::error(GL_OUT_OF_MEMORY);
8998 }
8999}
9000
9001void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9002{
9003 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9004 mode, first, count, instanceCount);
9005
9006 try
9007 {
9008 gl::Context *context = gl::getNonLostContext();
9009
9010 if (context)
9011 {
9012 if (context->getClientVersion() < 3)
9013 {
9014 return gl::error(GL_INVALID_OPERATION);
9015 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009016
Jamie Madill54133512013-06-21 09:33:07 -04009017 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009018 UNIMPLEMENTED();
9019 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009020 }
9021 catch(std::bad_alloc&)
9022 {
9023 return gl::error(GL_OUT_OF_MEMORY);
9024 }
9025}
9026
9027void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
9028{
9029 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
9030 mode, count, type, indices, instanceCount);
9031
9032 try
9033 {
9034 gl::Context *context = gl::getNonLostContext();
9035
9036 if (context)
9037 {
9038 if (context->getClientVersion() < 3)
9039 {
9040 return gl::error(GL_INVALID_OPERATION);
9041 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009042
Jamie Madill54133512013-06-21 09:33:07 -04009043 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009044 UNIMPLEMENTED();
9045 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009046 }
9047 catch(std::bad_alloc&)
9048 {
9049 return gl::error(GL_OUT_OF_MEMORY);
9050 }
9051}
9052
9053GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
9054{
9055 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
9056
9057 try
9058 {
9059 gl::Context *context = gl::getNonLostContext();
9060
9061 if (context)
9062 {
9063 if (context->getClientVersion() < 3)
9064 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009065 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009066 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009067
Jamie Madill5215e1a2013-07-26 11:55:19 -04009068 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
9069 {
9070 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
9071 }
9072
9073 if (flags != 0)
9074 {
9075 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
9076 }
9077
9078 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009079 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009080 }
9081 catch(std::bad_alloc&)
9082 {
9083 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9084 }
9085
9086 return NULL;
9087}
9088
9089GLboolean __stdcall glIsSync(GLsync sync)
9090{
9091 EVENT("(GLsync sync = 0x%0.8p)", sync);
9092
9093 try
9094 {
9095 gl::Context *context = gl::getNonLostContext();
9096
9097 if (context)
9098 {
9099 if (context->getClientVersion() < 3)
9100 {
9101 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9102 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009103
Jamie Madill5215e1a2013-07-26 11:55:19 -04009104 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009105 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009106 }
9107 catch(std::bad_alloc&)
9108 {
9109 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9110 }
9111
9112 return GL_FALSE;
9113}
9114
9115void __stdcall glDeleteSync(GLsync sync)
9116{
9117 EVENT("(GLsync sync = 0x%0.8p)", sync);
9118
9119 try
9120 {
9121 gl::Context *context = gl::getNonLostContext();
9122
9123 if (context)
9124 {
9125 if (context->getClientVersion() < 3)
9126 {
9127 return gl::error(GL_INVALID_OPERATION);
9128 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009129
Jamie Madill5215e1a2013-07-26 11:55:19 -04009130 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
9131 {
9132 return gl::error(GL_INVALID_VALUE);
9133 }
9134
9135 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009136 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009137 }
9138 catch(std::bad_alloc&)
9139 {
9140 return gl::error(GL_OUT_OF_MEMORY);
9141 }
9142}
9143
9144GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9145{
9146 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9147 sync, flags, timeout);
9148
9149 try
9150 {
9151 gl::Context *context = gl::getNonLostContext();
9152
9153 if (context)
9154 {
9155 if (context->getClientVersion() < 3)
9156 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009157 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009158 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009159
Jamie Madill5215e1a2013-07-26 11:55:19 -04009160 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
9161 {
9162 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9163 }
9164
9165 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9166
9167 if (!fenceSync)
9168 {
9169 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9170 }
9171
9172 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009173 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009174 }
9175 catch(std::bad_alloc&)
9176 {
9177 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9178 }
9179
9180 return GL_FALSE;
9181}
9182
9183void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9184{
9185 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9186 sync, flags, timeout);
9187
9188 try
9189 {
9190 gl::Context *context = gl::getNonLostContext();
9191
9192 if (context)
9193 {
9194 if (context->getClientVersion() < 3)
9195 {
9196 return gl::error(GL_INVALID_OPERATION);
9197 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009198
Jamie Madill5215e1a2013-07-26 11:55:19 -04009199 if (flags != 0)
9200 {
9201 return gl::error(GL_INVALID_VALUE);
9202 }
9203
9204 if (timeout != GL_TIMEOUT_IGNORED)
9205 {
9206 return gl::error(GL_INVALID_VALUE);
9207 }
9208
9209 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9210
9211 if (!fenceSync)
9212 {
9213 return gl::error(GL_INVALID_VALUE);
9214 }
9215
9216 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009217 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009218 }
9219 catch(std::bad_alloc&)
9220 {
9221 return gl::error(GL_OUT_OF_MEMORY);
9222 }
9223}
9224
9225void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9226{
9227 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9228 pname, params);
9229
9230 try
9231 {
9232 gl::Context *context = gl::getNonLostContext();
9233
9234 if (context)
9235 {
9236 if (context->getClientVersion() < 3)
9237 {
9238 return gl::error(GL_INVALID_OPERATION);
9239 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009240
Jamie Madill71fbd602013-07-19 16:36:55 -04009241 if (!(context->getInteger64v(pname, params)))
9242 {
9243 GLenum nativeType;
9244 unsigned int numParams = 0;
9245 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9246 return gl::error(GL_INVALID_ENUM);
9247
9248 if (numParams == 0)
9249 return; // it is known that the pname is valid, but that there are no parameters to return.
9250
9251 if (nativeType == GL_BOOL)
9252 {
9253 GLboolean *boolParams = NULL;
9254 boolParams = new GLboolean[numParams];
9255
9256 context->getBooleanv(pname, boolParams);
9257
9258 for (unsigned int i = 0; i < numParams; ++i)
9259 {
9260 if (boolParams[i] == GL_FALSE)
9261 params[i] = 0;
9262 else
9263 params[i] = 1;
9264 }
9265
9266 delete [] boolParams;
9267 }
9268 else if (nativeType == GL_INT)
9269 {
9270 GLint *intParams = NULL;
9271 intParams = new GLint[numParams];
9272
9273 context->getIntegerv(pname, intParams);
9274
9275 for (unsigned int i = 0; i < numParams; ++i)
9276 {
9277 params[i] = static_cast<GLint64>(intParams[i]);
9278 }
9279
9280 delete [] intParams;
9281 }
9282 else if (nativeType == GL_FLOAT)
9283 {
9284 GLfloat *floatParams = NULL;
9285 floatParams = new GLfloat[numParams];
9286
9287 context->getFloatv(pname, floatParams);
9288
9289 for (unsigned int i = 0; i < numParams; ++i)
9290 {
9291 // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
9292 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
9293 {
9294 params[i] = static_cast<GLint64>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
9295 }
9296 else
9297 {
9298 params[i] = gl::iround<GLint64>(floatParams[i]);
9299 }
9300 }
9301
9302 delete [] floatParams;
9303 }
9304 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009305 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009306 }
9307 catch(std::bad_alloc&)
9308 {
9309 return gl::error(GL_OUT_OF_MEMORY);
9310 }
9311}
9312
9313void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9314{
9315 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9316 sync, pname, bufSize, length, values);
9317
9318 try
9319 {
9320 gl::Context *context = gl::getNonLostContext();
9321
9322 if (context)
9323 {
9324 if (context->getClientVersion() < 3)
9325 {
9326 return gl::error(GL_INVALID_OPERATION);
9327 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009328
Jamie Madill5215e1a2013-07-26 11:55:19 -04009329 if (bufSize < 0)
9330 {
9331 return gl::error(GL_INVALID_VALUE);
9332 }
9333
9334 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9335
9336 if (!fenceSync)
9337 {
9338 return gl::error(GL_INVALID_VALUE);
9339 }
9340
9341 switch (pname)
9342 {
9343 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9344 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9345 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9346 case GL_SYNC_FLAGS: values[0] = 0; break;
9347
9348 default:
9349 return gl::error(GL_INVALID_ENUM);
9350 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009351 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009352 }
9353 catch(std::bad_alloc&)
9354 {
9355 return gl::error(GL_OUT_OF_MEMORY);
9356 }
9357}
9358
9359void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9360{
9361 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9362 target, index, data);
9363
9364 try
9365 {
9366 gl::Context *context = gl::getNonLostContext();
9367
9368 if (context)
9369 {
9370 if (context->getClientVersion() < 3)
9371 {
9372 return gl::error(GL_INVALID_OPERATION);
9373 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009374
Shannon Woods15934d52013-08-19 14:28:49 -04009375 switch (target)
9376 {
9377 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9378 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9379 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9380 if (index >= context->getMaxTransformFeedbackBufferBindings())
9381 return gl::error(GL_INVALID_VALUE);
9382 break;
9383 case GL_UNIFORM_BUFFER_START:
9384 case GL_UNIFORM_BUFFER_SIZE:
9385 case GL_UNIFORM_BUFFER_BINDING:
9386 if (index >= context->getMaximumCombinedUniformBufferBindings())
9387 return gl::error(GL_INVALID_VALUE);
9388 break;
9389 default:
9390 return gl::error(GL_INVALID_ENUM);
9391 }
9392
9393 if (!(context->getIndexedInteger64v(target, index, data)))
9394 {
9395 GLenum nativeType;
9396 unsigned int numParams = 0;
9397 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9398 return gl::error(GL_INVALID_ENUM);
9399
9400 if (numParams == 0)
9401 return; // it is known that pname is valid, but there are no parameters to return
9402
9403 if (nativeType == GL_INT)
9404 {
9405 GLint *intParams = new GLint[numParams];
9406
9407 context->getIndexedIntegerv(target, index, intParams);
9408
9409 for (unsigned int i = 0; i < numParams; ++i)
9410 {
9411 data[i] = static_cast<GLint64>(intParams[i]);
9412 }
9413
9414 delete [] intParams;
9415 }
9416 else
9417 {
9418 UNREACHABLE();
9419 }
9420 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009421 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009422 }
9423 catch(std::bad_alloc&)
9424 {
9425 return gl::error(GL_OUT_OF_MEMORY);
9426 }
9427}
9428
9429void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9430{
9431 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9432 target, pname, params);
9433
9434 try
9435 {
9436 gl::Context *context = gl::getNonLostContext();
9437
9438 if (context)
9439 {
9440 if (context->getClientVersion() < 3)
9441 {
9442 return gl::error(GL_INVALID_OPERATION);
9443 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009444
Jamie Madill54133512013-06-21 09:33:07 -04009445 // glGetBufferParameteri64v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009446 UNIMPLEMENTED();
9447 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009448 }
9449 catch(std::bad_alloc&)
9450 {
9451 return gl::error(GL_OUT_OF_MEMORY);
9452 }
9453}
9454
9455void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9456{
9457 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9458
9459 try
9460 {
9461 gl::Context *context = gl::getNonLostContext();
9462
9463 if (context)
9464 {
9465 if (context->getClientVersion() < 3)
9466 {
9467 return gl::error(GL_INVALID_OPERATION);
9468 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009469
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009470 if (count < 0)
9471 {
9472 return gl::error(GL_INVALID_VALUE);
9473 }
9474
9475 for (int i = 0; i < count; i++)
9476 {
9477 samplers[i] = context->createSampler();
9478 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009479 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009480 }
9481 catch(std::bad_alloc&)
9482 {
9483 return gl::error(GL_OUT_OF_MEMORY);
9484 }
9485}
9486
9487void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9488{
9489 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9490
9491 try
9492 {
9493 gl::Context *context = gl::getNonLostContext();
9494
9495 if (context)
9496 {
9497 if (context->getClientVersion() < 3)
9498 {
9499 return gl::error(GL_INVALID_OPERATION);
9500 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009501
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009502 if (count < 0)
9503 {
9504 return gl::error(GL_INVALID_VALUE);
9505 }
9506
9507 for (int i = 0; i < count; i++)
9508 {
9509 context->deleteSampler(samplers[i]);
9510 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009511 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009512 }
9513 catch(std::bad_alloc&)
9514 {
9515 return gl::error(GL_OUT_OF_MEMORY);
9516 }
9517}
9518
9519GLboolean __stdcall glIsSampler(GLuint sampler)
9520{
9521 EVENT("(GLuint sampler = %u)", sampler);
9522
9523 try
9524 {
9525 gl::Context *context = gl::getNonLostContext();
9526
9527 if (context)
9528 {
9529 if (context->getClientVersion() < 3)
9530 {
9531 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9532 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009533
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009534 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009535 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009536 }
9537 catch(std::bad_alloc&)
9538 {
9539 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9540 }
9541
9542 return GL_FALSE;
9543}
9544
9545void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9546{
9547 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9548
9549 try
9550 {
9551 gl::Context *context = gl::getNonLostContext();
9552
9553 if (context)
9554 {
9555 if (context->getClientVersion() < 3)
9556 {
9557 return gl::error(GL_INVALID_OPERATION);
9558 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009559
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009560 if (sampler != 0 && !context->isSampler(sampler))
9561 {
9562 return gl::error(GL_INVALID_OPERATION);
9563 }
9564
9565 if (unit >= context->getMaximumCombinedTextureImageUnits())
9566 {
9567 return gl::error(GL_INVALID_VALUE);
9568 }
9569
9570 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009571 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009572 }
9573 catch(std::bad_alloc&)
9574 {
9575 return gl::error(GL_OUT_OF_MEMORY);
9576 }
9577}
9578
9579void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9580{
9581 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9582
9583 try
9584 {
9585 gl::Context *context = gl::getNonLostContext();
9586
9587 if (context)
9588 {
9589 if (context->getClientVersion() < 3)
9590 {
9591 return gl::error(GL_INVALID_OPERATION);
9592 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009593
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009594 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009595 {
9596 return;
9597 }
9598
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009599 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009600 {
9601 return;
9602 }
9603
9604 if (!context->isSampler(sampler))
9605 {
9606 return gl::error(GL_INVALID_OPERATION);
9607 }
9608
9609 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009610 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009611 }
9612 catch(std::bad_alloc&)
9613 {
9614 return gl::error(GL_OUT_OF_MEMORY);
9615 }
9616}
9617
9618void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9619{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009620 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009621}
9622
9623void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9624{
9625 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9626
9627 try
9628 {
9629 gl::Context *context = gl::getNonLostContext();
9630
9631 if (context)
9632 {
9633 if (context->getClientVersion() < 3)
9634 {
9635 return gl::error(GL_INVALID_OPERATION);
9636 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009637
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009638 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009639 {
9640 return;
9641 }
9642
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009643 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009644 {
9645 return;
9646 }
9647
9648 if (!context->isSampler(sampler))
9649 {
9650 return gl::error(GL_INVALID_OPERATION);
9651 }
9652
9653 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009654 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009655 }
9656 catch(std::bad_alloc&)
9657 {
9658 return gl::error(GL_OUT_OF_MEMORY);
9659 }
9660}
9661
9662void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9663{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009664 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009665}
9666
9667void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9668{
9669 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9670
9671 try
9672 {
9673 gl::Context *context = gl::getNonLostContext();
9674
9675 if (context)
9676 {
9677 if (context->getClientVersion() < 3)
9678 {
9679 return gl::error(GL_INVALID_OPERATION);
9680 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009681
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009682 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009683 {
9684 return;
9685 }
9686
9687 if (!context->isSampler(sampler))
9688 {
9689 return gl::error(GL_INVALID_OPERATION);
9690 }
9691
9692 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009693 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009694 }
9695 catch(std::bad_alloc&)
9696 {
9697 return gl::error(GL_OUT_OF_MEMORY);
9698 }
9699}
9700
9701void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9702{
9703 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9704
9705 try
9706 {
9707 gl::Context *context = gl::getNonLostContext();
9708
9709 if (context)
9710 {
9711 if (context->getClientVersion() < 3)
9712 {
9713 return gl::error(GL_INVALID_OPERATION);
9714 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009715
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009716 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009717 {
9718 return;
9719 }
9720
9721 if (!context->isSampler(sampler))
9722 {
9723 return gl::error(GL_INVALID_OPERATION);
9724 }
9725
9726 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009727 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009728 }
9729 catch(std::bad_alloc&)
9730 {
9731 return gl::error(GL_OUT_OF_MEMORY);
9732 }
9733}
9734
9735void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9736{
9737 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9738
9739 try
9740 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009741 if (index >= gl::MAX_VERTEX_ATTRIBS)
9742 {
9743 return gl::error(GL_INVALID_VALUE);
9744 }
9745
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009746 gl::Context *context = gl::getNonLostContext();
9747
9748 if (context)
9749 {
9750 if (context->getClientVersion() < 3)
9751 {
9752 return gl::error(GL_INVALID_OPERATION);
9753 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009754
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009755 context->setVertexAttribDivisor(index, divisor);
9756 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009757 }
9758 catch(std::bad_alloc&)
9759 {
9760 return gl::error(GL_OUT_OF_MEMORY);
9761 }
9762}
9763
9764void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9765{
9766 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9767
9768 try
9769 {
9770 gl::Context *context = gl::getNonLostContext();
9771
9772 if (context)
9773 {
9774 if (context->getClientVersion() < 3)
9775 {
9776 return gl::error(GL_INVALID_OPERATION);
9777 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009778
Jamie Madill54133512013-06-21 09:33:07 -04009779 // glBindTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009780 UNIMPLEMENTED();
9781 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009782 }
9783 catch(std::bad_alloc&)
9784 {
9785 return gl::error(GL_OUT_OF_MEMORY);
9786 }
9787}
9788
9789void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9790{
9791 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9792
9793 try
9794 {
9795 gl::Context *context = gl::getNonLostContext();
9796
9797 if (context)
9798 {
9799 if (context->getClientVersion() < 3)
9800 {
9801 return gl::error(GL_INVALID_OPERATION);
9802 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009803
Jamie Madill54133512013-06-21 09:33:07 -04009804 // glDeleteTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009805 UNIMPLEMENTED();
9806 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009807 }
9808 catch(std::bad_alloc&)
9809 {
9810 return gl::error(GL_OUT_OF_MEMORY);
9811 }
9812}
9813
9814void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9815{
9816 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9817
9818 try
9819 {
9820 gl::Context *context = gl::getNonLostContext();
9821
9822 if (context)
9823 {
9824 if (context->getClientVersion() < 3)
9825 {
9826 return gl::error(GL_INVALID_OPERATION);
9827 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009828
Jamie Madill54133512013-06-21 09:33:07 -04009829 // glGenTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009830 UNIMPLEMENTED();
9831 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009832 }
9833 catch(std::bad_alloc&)
9834 {
9835 return gl::error(GL_OUT_OF_MEMORY);
9836 }
9837}
9838
9839GLboolean __stdcall glIsTransformFeedback(GLuint id)
9840{
9841 EVENT("(GLuint id = %u)", id);
9842
9843 try
9844 {
9845 gl::Context *context = gl::getNonLostContext();
9846
9847 if (context)
9848 {
9849 if (context->getClientVersion() < 3)
9850 {
9851 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9852 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009853
Jamie Madill54133512013-06-21 09:33:07 -04009854 // glIsTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009855 UNIMPLEMENTED();
9856 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009857 }
9858 catch(std::bad_alloc&)
9859 {
9860 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9861 }
9862
9863 return GL_FALSE;
9864}
9865
9866void __stdcall glPauseTransformFeedback(void)
9867{
9868 EVENT("(void)");
9869
9870 try
9871 {
9872 gl::Context *context = gl::getNonLostContext();
9873
9874 if (context)
9875 {
9876 if (context->getClientVersion() < 3)
9877 {
9878 return gl::error(GL_INVALID_OPERATION);
9879 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009880
Jamie Madill54133512013-06-21 09:33:07 -04009881 // glPauseTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009882 UNIMPLEMENTED();
9883 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009884 }
9885 catch(std::bad_alloc&)
9886 {
9887 return gl::error(GL_OUT_OF_MEMORY);
9888 }
9889}
9890
9891void __stdcall glResumeTransformFeedback(void)
9892{
9893 EVENT("(void)");
9894
9895 try
9896 {
9897 gl::Context *context = gl::getNonLostContext();
9898
9899 if (context)
9900 {
9901 if (context->getClientVersion() < 3)
9902 {
9903 return gl::error(GL_INVALID_OPERATION);
9904 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009905
Jamie Madill54133512013-06-21 09:33:07 -04009906 // glResumeTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009907 UNIMPLEMENTED();
9908 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009909 }
9910 catch(std::bad_alloc&)
9911 {
9912 return gl::error(GL_OUT_OF_MEMORY);
9913 }
9914}
9915
9916void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9917{
9918 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9919 program, bufSize, length, binaryFormat, binary);
9920
9921 try
9922 {
9923 gl::Context *context = gl::getNonLostContext();
9924
9925 if (context)
9926 {
9927 if (context->getClientVersion() < 3)
9928 {
9929 return gl::error(GL_INVALID_OPERATION);
9930 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009931
Jamie Madill54133512013-06-21 09:33:07 -04009932 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009933 UNIMPLEMENTED();
9934 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009935 }
9936 catch(std::bad_alloc&)
9937 {
9938 return gl::error(GL_OUT_OF_MEMORY);
9939 }
9940}
9941
9942void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9943{
9944 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9945 program, binaryFormat, binary, length);
9946
9947 try
9948 {
9949 gl::Context *context = gl::getNonLostContext();
9950
9951 if (context)
9952 {
9953 if (context->getClientVersion() < 3)
9954 {
9955 return gl::error(GL_INVALID_OPERATION);
9956 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009957
Jamie Madill54133512013-06-21 09:33:07 -04009958 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009959 UNIMPLEMENTED();
9960 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009961 }
9962 catch(std::bad_alloc&)
9963 {
9964 return gl::error(GL_OUT_OF_MEMORY);
9965 }
9966}
9967
9968void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9969{
9970 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9971 program, pname, value);
9972
9973 try
9974 {
9975 gl::Context *context = gl::getNonLostContext();
9976
9977 if (context)
9978 {
9979 if (context->getClientVersion() < 3)
9980 {
9981 return gl::error(GL_INVALID_OPERATION);
9982 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009983
Jamie Madill54133512013-06-21 09:33:07 -04009984 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009985 UNIMPLEMENTED();
9986 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009987 }
9988 catch(std::bad_alloc&)
9989 {
9990 return gl::error(GL_OUT_OF_MEMORY);
9991 }
9992}
9993
9994void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9995{
9996 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9997 target, numAttachments, attachments);
9998
9999 try
10000 {
10001 gl::Context *context = gl::getNonLostContext();
10002
10003 if (context)
10004 {
10005 if (context->getClientVersion() < 3)
10006 {
10007 return gl::error(GL_INVALID_OPERATION);
10008 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010009
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010010 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010011 {
10012 return;
10013 }
10014
10015 int maxDimension = context->getMaximumRenderbufferDimension();
10016 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
10017 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010018 }
10019 catch(std::bad_alloc&)
10020 {
10021 return gl::error(GL_OUT_OF_MEMORY);
10022 }
10023}
10024
10025void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10026{
10027 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10028 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10029 target, numAttachments, attachments, x, y, width, height);
10030
10031 try
10032 {
10033 gl::Context *context = gl::getNonLostContext();
10034
10035 if (context)
10036 {
10037 if (context->getClientVersion() < 3)
10038 {
10039 return gl::error(GL_INVALID_OPERATION);
10040 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010041
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010042 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010043 {
10044 return;
10045 }
10046
10047 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
10048 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010049 }
10050 catch(std::bad_alloc&)
10051 {
10052 return gl::error(GL_OUT_OF_MEMORY);
10053 }
10054}
10055
10056void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10057{
10058 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10059 target, levels, internalformat, width, height);
10060
10061 try
10062 {
10063 gl::Context *context = gl::getNonLostContext();
10064
10065 if (context)
10066 {
10067 if (context->getClientVersion() < 3)
10068 {
10069 return gl::error(GL_INVALID_OPERATION);
10070 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010071
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010072 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010073 {
10074 return;
10075 }
10076
10077 switch (target)
10078 {
10079 case GL_TEXTURE_2D:
10080 {
10081 gl::Texture2D *texture2d = context->getTexture2D();
10082 texture2d->storage(levels, internalformat, width, height);
10083 }
10084 break;
10085
10086 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
10087 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
10088 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
10089 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
10090 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
10091 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
10092 {
10093 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
10094 textureCube->storage(levels, internalformat, width);
10095 }
10096 break;
10097
10098 default:
10099 return gl::error(GL_INVALID_ENUM);
10100 }
10101 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010102 }
10103 catch(std::bad_alloc&)
10104 {
10105 return gl::error(GL_OUT_OF_MEMORY);
10106 }
10107}
10108
10109void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10110{
10111 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10112 "GLsizei height = %d, GLsizei depth = %d)",
10113 target, levels, internalformat, width, height, depth);
10114
10115 try
10116 {
10117 gl::Context *context = gl::getNonLostContext();
10118
10119 if (context)
10120 {
10121 if (context->getClientVersion() < 3)
10122 {
10123 return gl::error(GL_INVALID_OPERATION);
10124 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010125
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010126 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010127 {
10128 return;
10129 }
10130
10131 switch (target)
10132 {
10133 case GL_TEXTURE_3D:
10134 {
10135 gl::Texture3D *texture3d = context->getTexture3D();
10136 texture3d->storage(levels, internalformat, width, height, depth);
10137 }
10138 break;
10139
10140 case GL_TEXTURE_2D_ARRAY:
10141 {
10142 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
10143 texture2darray->storage(levels, internalformat, width, height, depth);
10144 }
10145 break;
10146
10147 default:
10148 return gl::error(GL_INVALID_ENUM);
10149 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010150 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010151 }
10152 catch(std::bad_alloc&)
10153 {
10154 return gl::error(GL_OUT_OF_MEMORY);
10155 }
10156}
10157
10158void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10159{
10160 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10161 "GLint* params = 0x%0.8p)",
10162 target, internalformat, pname, bufSize, params);
10163
10164 try
10165 {
10166 gl::Context *context = gl::getNonLostContext();
10167
10168 if (context)
10169 {
10170 if (context->getClientVersion() < 3)
10171 {
10172 return gl::error(GL_INVALID_OPERATION);
10173 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010174
Shannon Woods809d2502013-07-08 10:32:18 -040010175 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10176 !gl::IsDepthRenderingSupported(internalformat, context) &&
10177 !gl::IsStencilRenderingSupported(internalformat, context))
10178 {
10179 return gl::error(GL_INVALID_ENUM);
10180 }
10181
10182 if (target != GL_RENDERBUFFER)
10183 {
10184 return gl::error(GL_INVALID_ENUM);
10185 }
10186
10187 if (bufSize < 0)
10188 {
10189 return gl::error(GL_INVALID_VALUE);
10190 }
10191
10192 switch (pname)
10193 {
10194 case GL_NUM_SAMPLE_COUNTS:
10195 if (bufSize != 0)
10196 *params = context->getNumSampleCounts(internalformat);
10197 break;
10198 case GL_SAMPLES:
10199 context->getSampleCounts(internalformat, bufSize, params);
10200 break;
10201 default:
10202 return gl::error(GL_INVALID_ENUM);
10203 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010204 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010205 }
10206 catch(std::bad_alloc&)
10207 {
10208 return gl::error(GL_OUT_OF_MEMORY);
10209 }
10210}
10211
10212// Extension functions
10213
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010214void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10215 GLbitfield mask, GLenum filter)
10216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010217 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010218 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10219 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10220 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10221
10222 try
10223 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010224 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010225
10226 if (context)
10227 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010228 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010229 dstX0, dstY0, dstX1, dstY1, mask, filter,
10230 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010231 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010232 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010233 }
10234
Geoff Lang758d5b22013-06-11 11:42:50 -040010235 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10236 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010237 }
10238 }
10239 catch(std::bad_alloc&)
10240 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010241 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010242 }
10243}
10244
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010245void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10246 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010247{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010248 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010249 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010250 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010251 target, level, internalformat, width, height, depth, border, format, type, pixels);
10252
10253 try
10254 {
10255 UNIMPLEMENTED(); // FIXME
10256 }
10257 catch(std::bad_alloc&)
10258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010259 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010260 }
10261}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010262
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010263void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10264 GLenum *binaryFormat, void *binary)
10265{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010266 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 +000010267 program, bufSize, length, binaryFormat, binary);
10268
10269 try
10270 {
10271 gl::Context *context = gl::getNonLostContext();
10272
10273 if (context)
10274 {
10275 gl::Program *programObject = context->getProgram(program);
10276
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010277 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010279 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010280 }
10281
10282 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10283
10284 if (!programBinary)
10285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010286 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010287 }
10288
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010289 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010291 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010292 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010293
10294 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010295 }
10296 }
10297 catch(std::bad_alloc&)
10298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010299 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010300 }
10301}
10302
10303void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10304 const void *binary, GLint length)
10305{
10306 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10307 program, binaryFormat, binary, length);
10308
10309 try
10310 {
10311 gl::Context *context = gl::getNonLostContext();
10312
10313 if (context)
10314 {
10315 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010317 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010318 }
10319
10320 gl::Program *programObject = context->getProgram(program);
10321
10322 if (!programObject)
10323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010324 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010325 }
10326
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010327 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010328 }
10329 }
10330 catch(std::bad_alloc&)
10331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010332 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010333 }
10334}
10335
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010336void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10337{
10338 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10339
10340 try
10341 {
10342 gl::Context *context = gl::getNonLostContext();
10343
10344 if (context)
10345 {
10346 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10347 {
10348 return gl::error(GL_INVALID_VALUE);
10349 }
10350
10351 if (context->getDrawFramebufferHandle() == 0)
10352 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010353 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010354 {
10355 return gl::error(GL_INVALID_OPERATION);
10356 }
10357
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010358 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010359 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010360 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010361 }
10362 }
10363 else
10364 {
10365 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10366 {
10367 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10368 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10369 {
10370 return gl::error(GL_INVALID_OPERATION);
10371 }
10372 }
10373 }
10374
10375 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10376
10377 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10378 {
10379 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10380 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010381
10382 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10383 {
10384 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10385 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010386 }
10387 }
10388 catch (std::bad_alloc&)
10389 {
10390 return gl::error(GL_OUT_OF_MEMORY);
10391 }
10392}
10393
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010394__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10395{
10396 struct Extension
10397 {
10398 const char *name;
10399 __eglMustCastToProperFunctionPointerType address;
10400 };
10401
10402 static const Extension glExtensions[] =
10403 {
10404 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010405 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010406 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010407 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10408 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10409 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10410 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10411 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10412 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10413 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010414 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010415 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010416 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10417 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10418 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10419 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010420 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10421 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10422 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10423 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10424 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10425 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10426 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010427 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010428 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10429 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10430 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010431 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10432 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010433
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010434 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010435 {
10436 if (strcmp(procname, glExtensions[ext].name) == 0)
10437 {
10438 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10439 }
10440 }
10441
10442 return NULL;
10443}
10444
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010445// Non-public functions used by EGL
10446
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010447bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010448{
10449 EVENT("(egl::Surface* surface = 0x%0.8p)",
10450 surface);
10451
10452 try
10453 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010454 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010455
10456 if (context)
10457 {
10458 gl::Texture2D *textureObject = context->getTexture2D();
10459
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010460 if (textureObject->isImmutable())
10461 {
10462 return false;
10463 }
10464
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010465 if (textureObject)
10466 {
10467 textureObject->bindTexImage(surface);
10468 }
10469 }
10470 }
10471 catch(std::bad_alloc&)
10472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010473 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010474 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010475
10476 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010477}
10478
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010479}