blob: c7c5a77cbc6903ba4b347fa713e2962574918892 [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 Madill55856b12014-01-02 13:59:50 -050029#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040030
Jamie Madill35d15012013-10-07 10:46:37 -040031gl::Texture *GetTargetTexture(gl::Context *context, GLenum target)
Jamie Madillfb8a8302013-07-03 14:24:12 -040032{
Jamie Madill35d15012013-10-07 10:46:37 -040033 if (!ValidTextureTarget(context, target))
Jamie Madillfb8a8302013-07-03 14:24:12 -040034 {
Jamie Madill35d15012013-10-07 10:46:37 -040035 return NULL;
Jamie Madillfb8a8302013-07-03 14:24:12 -040036 }
37
38 switch (target)
39 {
40 case GL_TEXTURE_2D: return context->getTexture2D();
41 case GL_TEXTURE_CUBE_MAP: return context->getTextureCubeMap();
42 case GL_TEXTURE_3D: return context->getTexture3D();
43 case GL_TEXTURE_2D_ARRAY: return context->getTexture2DArray();
44 default: return NULL;
45 }
46}
Jamie Madill478fdb22013-07-19 16:36:59 -040047
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000048extern "C"
49{
50
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000051// OpenGL ES 2.0 functions
52
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053void __stdcall glActiveTexture(GLenum texture)
54{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000055 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000056
57 try
58 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000059 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000060
61 if (context)
62 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000063 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
64 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000065 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000066 }
67
daniel@transgaming.com428d1582010-05-04 03:35:25 +000068 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000069 }
70 }
71 catch(std::bad_alloc&)
72 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000073 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000074 }
75}
76
77void __stdcall glAttachShader(GLuint program, GLuint shader)
78{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000079 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000080
81 try
82 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000083 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000084
85 if (context)
86 {
87 gl::Program *programObject = context->getProgram(program);
88 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000089
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000090 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000091 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000092 if (context->getShader(program))
93 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000094 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000095 }
96 else
97 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000098 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000099 }
100 }
101
102 if (!shaderObject)
103 {
104 if (context->getProgram(shader))
105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000106 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000107 }
108 else
109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000110 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000111 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000112 }
113
114 if (!programObject->attachShader(shaderObject))
115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000116 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000117 }
118 }
119 }
120 catch(std::bad_alloc&)
121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000122 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000123 }
124}
125
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000126void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
127{
128 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
129
130 try
131 {
132 switch (target)
133 {
134 case GL_ANY_SAMPLES_PASSED_EXT:
135 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
136 break;
137 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000138 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000139 }
140
141 if (id == 0)
142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000143 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000144 }
145
146 gl::Context *context = gl::getNonLostContext();
147
148 if (context)
149 {
150 context->beginQuery(target, id);
151 }
152 }
153 catch(std::bad_alloc&)
154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000155 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000156 }
157}
158
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000159void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000160{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000161 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000162
163 try
164 {
165 if (index >= gl::MAX_VERTEX_ATTRIBS)
166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000167 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000168 }
169
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000170 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000171
172 if (context)
173 {
174 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000175
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000176 if (!programObject)
177 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000178 if (context->getShader(program))
179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000180 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000181 }
182 else
183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000184 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000185 }
186 }
187
188 if (strncmp(name, "gl_", 3) == 0)
189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000190 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000191 }
192
193 programObject->bindAttributeLocation(index, name);
194 }
195 }
196 catch(std::bad_alloc&)
197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000198 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000199 }
200}
201
202void __stdcall glBindBuffer(GLenum target, GLuint buffer)
203{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000204 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000205
206 try
207 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000208 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000209
210 if (context)
211 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000212 // Check ES3 specific targets
213 switch (target)
214 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000215 case GL_COPY_READ_BUFFER:
216 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000217 case GL_PIXEL_PACK_BUFFER:
218 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000219 case GL_UNIFORM_BUFFER:
220 case GL_TRANSFORM_FEEDBACK_BUFFER:
221 if (context->getClientVersion() < 3)
222 {
223 return gl::error(GL_INVALID_ENUM);
224 }
225 }
226
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000227 switch (target)
228 {
229 case GL_ARRAY_BUFFER:
230 context->bindArrayBuffer(buffer);
231 return;
232 case GL_ELEMENT_ARRAY_BUFFER:
233 context->bindElementArrayBuffer(buffer);
234 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000235 case GL_COPY_READ_BUFFER:
236 context->bindCopyReadBuffer(buffer);
237 return;
238 case GL_COPY_WRITE_BUFFER:
239 context->bindCopyWriteBuffer(buffer);
240 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000241 case GL_PIXEL_PACK_BUFFER:
242 context->bindPixelPackBuffer(buffer);
243 return;
244 case GL_PIXEL_UNPACK_BUFFER:
245 context->bindPixelUnpackBuffer(buffer);
246 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000247 case GL_UNIFORM_BUFFER:
248 context->bindGenericUniformBuffer(buffer);
249 return;
250 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000251 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000252 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000253 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000254 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000255 }
256 }
257 }
258 catch(std::bad_alloc&)
259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000260 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000261 }
262}
263
264void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
265{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000266 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000267
268 try
269 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000270 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000272 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000273 }
274
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000275 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000276
277 if (context)
278 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000279 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
280 {
281 context->bindReadFramebuffer(framebuffer);
282 }
283
284 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
285 {
286 context->bindDrawFramebuffer(framebuffer);
287 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000288 }
289 }
290 catch(std::bad_alloc&)
291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000292 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000293 }
294}
295
296void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
297{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000298 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000299
300 try
301 {
302 if (target != GL_RENDERBUFFER)
303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000304 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000305 }
306
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000307 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000308
309 if (context)
310 {
311 context->bindRenderbuffer(renderbuffer);
312 }
313 }
314 catch(std::bad_alloc&)
315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000316 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000317 }
318}
319
320void __stdcall glBindTexture(GLenum target, GLuint texture)
321{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000322 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000323
324 try
325 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000326 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000327
328 if (context)
329 {
330 gl::Texture *textureObject = context->getTexture(texture);
331
332 if (textureObject && textureObject->getTarget() != target && texture != 0)
333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000334 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000335 }
336
337 switch (target)
338 {
339 case GL_TEXTURE_2D:
340 context->bindTexture2D(texture);
341 return;
342 case GL_TEXTURE_CUBE_MAP:
343 context->bindTextureCubeMap(texture);
344 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000345 case GL_TEXTURE_3D:
346 if (context->getClientVersion() < 3)
347 {
348 return gl::error(GL_INVALID_ENUM);
349 }
350 context->bindTexture3D(texture);
351 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000352 case GL_TEXTURE_2D_ARRAY:
353 if (context->getClientVersion() < 3)
354 {
355 return gl::error(GL_INVALID_ENUM);
356 }
357 context->bindTexture2DArray(texture);
358 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000359 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000360 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000361 }
362 }
363 }
364 catch(std::bad_alloc&)
365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000367 }
368}
369
370void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
371{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000372 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000373 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000374
375 try
376 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000377 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000378
379 if (context)
380 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000381 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000382 }
383 }
384 catch(std::bad_alloc&)
385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000386 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000387 }
388}
389
390void __stdcall glBlendEquation(GLenum mode)
391{
392 glBlendEquationSeparate(mode, mode);
393}
394
395void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
396{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000397 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000398
399 try
400 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000401 gl::Context *context = gl::getNonLostContext();
402
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000403 switch (modeRGB)
404 {
405 case GL_FUNC_ADD:
406 case GL_FUNC_SUBTRACT:
407 case GL_FUNC_REVERSE_SUBTRACT:
408 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000409
410 case GL_MIN:
411 case GL_MAX:
412 if (context && context->getClientVersion() < 3)
413 {
414 return gl::error(GL_INVALID_ENUM);
415 }
416 break;
417
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000418 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000419 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000420 }
421
422 switch (modeAlpha)
423 {
424 case GL_FUNC_ADD:
425 case GL_FUNC_SUBTRACT:
426 case GL_FUNC_REVERSE_SUBTRACT:
427 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000428
429 case GL_MIN:
430 case GL_MAX:
431 if (context && context->getClientVersion() < 3)
432 {
433 return gl::error(GL_INVALID_ENUM);
434 }
435 break;
436
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000437 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000438 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000439 }
440
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000441 if (context)
442 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000443 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000444 }
445 }
446 catch(std::bad_alloc&)
447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000448 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000449 }
450}
451
452void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
453{
454 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
455}
456
457void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
458{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000459 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 +0000460 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000461
462 try
463 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000464 gl::Context *context = gl::getNonLostContext();
465
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000466 switch (srcRGB)
467 {
468 case GL_ZERO:
469 case GL_ONE:
470 case GL_SRC_COLOR:
471 case GL_ONE_MINUS_SRC_COLOR:
472 case GL_DST_COLOR:
473 case GL_ONE_MINUS_DST_COLOR:
474 case GL_SRC_ALPHA:
475 case GL_ONE_MINUS_SRC_ALPHA:
476 case GL_DST_ALPHA:
477 case GL_ONE_MINUS_DST_ALPHA:
478 case GL_CONSTANT_COLOR:
479 case GL_ONE_MINUS_CONSTANT_COLOR:
480 case GL_CONSTANT_ALPHA:
481 case GL_ONE_MINUS_CONSTANT_ALPHA:
482 case GL_SRC_ALPHA_SATURATE:
483 break;
484 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000485 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000486 }
487
488 switch (dstRGB)
489 {
490 case GL_ZERO:
491 case GL_ONE:
492 case GL_SRC_COLOR:
493 case GL_ONE_MINUS_SRC_COLOR:
494 case GL_DST_COLOR:
495 case GL_ONE_MINUS_DST_COLOR:
496 case GL_SRC_ALPHA:
497 case GL_ONE_MINUS_SRC_ALPHA:
498 case GL_DST_ALPHA:
499 case GL_ONE_MINUS_DST_ALPHA:
500 case GL_CONSTANT_COLOR:
501 case GL_ONE_MINUS_CONSTANT_COLOR:
502 case GL_CONSTANT_ALPHA:
503 case GL_ONE_MINUS_CONSTANT_ALPHA:
504 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000505
506 case GL_SRC_ALPHA_SATURATE:
507 if (!context || context->getClientVersion() < 3)
508 {
509 return gl::error(GL_INVALID_ENUM);
510 }
511 break;
512
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000513 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000514 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000515 }
516
517 switch (srcAlpha)
518 {
519 case GL_ZERO:
520 case GL_ONE:
521 case GL_SRC_COLOR:
522 case GL_ONE_MINUS_SRC_COLOR:
523 case GL_DST_COLOR:
524 case GL_ONE_MINUS_DST_COLOR:
525 case GL_SRC_ALPHA:
526 case GL_ONE_MINUS_SRC_ALPHA:
527 case GL_DST_ALPHA:
528 case GL_ONE_MINUS_DST_ALPHA:
529 case GL_CONSTANT_COLOR:
530 case GL_ONE_MINUS_CONSTANT_COLOR:
531 case GL_CONSTANT_ALPHA:
532 case GL_ONE_MINUS_CONSTANT_ALPHA:
533 case GL_SRC_ALPHA_SATURATE:
534 break;
535 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000536 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000537 }
538
539 switch (dstAlpha)
540 {
541 case GL_ZERO:
542 case GL_ONE:
543 case GL_SRC_COLOR:
544 case GL_ONE_MINUS_SRC_COLOR:
545 case GL_DST_COLOR:
546 case GL_ONE_MINUS_DST_COLOR:
547 case GL_SRC_ALPHA:
548 case GL_ONE_MINUS_SRC_ALPHA:
549 case GL_DST_ALPHA:
550 case GL_ONE_MINUS_DST_ALPHA:
551 case GL_CONSTANT_COLOR:
552 case GL_ONE_MINUS_CONSTANT_COLOR:
553 case GL_CONSTANT_ALPHA:
554 case GL_ONE_MINUS_CONSTANT_ALPHA:
555 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000556
557 case GL_SRC_ALPHA_SATURATE:
558 if (!context || context->getClientVersion() < 3)
559 {
560 return gl::error(GL_INVALID_ENUM);
561 }
562 break;
563
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000564 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000565 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000566 }
567
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000568 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
569 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
570
571 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
572 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
573
574 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000575 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000576 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 +0000577 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000578 }
579
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000580 if (context)
581 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000582 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000583 }
584 }
585 catch(std::bad_alloc&)
586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000587 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000588 }
589}
590
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000591void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000592{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000593 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 +0000594 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000595
596 try
597 {
598 if (size < 0)
599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000600 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000601 }
602
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000603 gl::Context *context = gl::getNonLostContext();
604
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000605 switch (usage)
606 {
607 case GL_STREAM_DRAW:
608 case GL_STATIC_DRAW:
609 case GL_DYNAMIC_DRAW:
610 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000611
612 case GL_STREAM_READ:
613 case GL_STREAM_COPY:
614 case GL_STATIC_READ:
615 case GL_STATIC_COPY:
616 case GL_DYNAMIC_READ:
617 case GL_DYNAMIC_COPY:
618 if (context && context->getClientVersion() < 3)
619 {
620 return gl::error(GL_INVALID_ENUM);
621 }
622 break;
623
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000624 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000625 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000626 }
627
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000628 if (context)
629 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000630 // Check ES3 specific targets
631 switch (target)
632 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000633 case GL_COPY_READ_BUFFER:
634 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000635 case GL_PIXEL_PACK_BUFFER:
636 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000637 case GL_UNIFORM_BUFFER:
638 case GL_TRANSFORM_FEEDBACK_BUFFER:
639 if (context->getClientVersion() < 3)
640 {
641 return gl::error(GL_INVALID_ENUM);
642 }
643 }
644
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000645 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000646
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000647 switch (target)
648 {
649 case GL_ARRAY_BUFFER:
650 buffer = context->getArrayBuffer();
651 break;
652 case GL_ELEMENT_ARRAY_BUFFER:
653 buffer = context->getElementArrayBuffer();
654 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000655 case GL_COPY_READ_BUFFER:
656 buffer = context->getCopyReadBuffer();
657 break;
658 case GL_COPY_WRITE_BUFFER:
659 buffer = context->getCopyWriteBuffer();
660 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000661 case GL_PIXEL_PACK_BUFFER:
662 buffer = context->getPixelPackBuffer();
663 break;
664 case GL_PIXEL_UNPACK_BUFFER:
665 buffer = context->getPixelUnpackBuffer();
666 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000667 case GL_TRANSFORM_FEEDBACK_BUFFER:
668 buffer = context->getGenericTransformFeedbackBuffer();
669 break;
670 case GL_UNIFORM_BUFFER:
671 buffer = context->getGenericUniformBuffer();
672 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000673 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000674 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000675 }
676
677 if (!buffer)
678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000679 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000680 }
681
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000682 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000683 }
684 }
685 catch(std::bad_alloc&)
686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000687 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000688 }
689}
690
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000691void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000693 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 +0000694 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000695
696 try
697 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000698 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000700 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000701 }
702
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000703 if (data == NULL)
704 {
705 return;
706 }
707
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000708 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000709
710 if (context)
711 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000712 // Check ES3 specific targets
713 switch (target)
714 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000715 case GL_COPY_READ_BUFFER:
716 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000717 case GL_PIXEL_PACK_BUFFER:
718 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000719 case GL_UNIFORM_BUFFER:
720 case GL_TRANSFORM_FEEDBACK_BUFFER:
721 if (context->getClientVersion() < 3)
722 {
723 return gl::error(GL_INVALID_ENUM);
724 }
725 }
726
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000727 gl::Buffer *buffer;
728
729 switch (target)
730 {
731 case GL_ARRAY_BUFFER:
732 buffer = context->getArrayBuffer();
733 break;
734 case GL_ELEMENT_ARRAY_BUFFER:
735 buffer = context->getElementArrayBuffer();
736 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000737 case GL_COPY_READ_BUFFER:
738 buffer = context->getCopyReadBuffer();
739 break;
740 case GL_COPY_WRITE_BUFFER:
741 buffer = context->getCopyWriteBuffer();
742 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000743 case GL_PIXEL_PACK_BUFFER:
744 buffer = context->getPixelPackBuffer();
745 break;
746 case GL_PIXEL_UNPACK_BUFFER:
747 buffer = context->getPixelUnpackBuffer();
748 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000749 case GL_TRANSFORM_FEEDBACK_BUFFER:
750 buffer = context->getGenericTransformFeedbackBuffer();
751 break;
752 case GL_UNIFORM_BUFFER:
753 buffer = context->getGenericUniformBuffer();
754 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000755 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000756 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000757 }
758
759 if (!buffer)
760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000761 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000762 }
763
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000764 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000766 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000767 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000768
769 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000770 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000771 }
772 catch(std::bad_alloc&)
773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000774 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000775 }
776}
777
778GLenum __stdcall glCheckFramebufferStatus(GLenum target)
779{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000780 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000781
782 try
783 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000784 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000786 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000787 }
788
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000789 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000790
791 if (context)
792 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000793 gl::Framebuffer *framebuffer = NULL;
794 if (target == GL_READ_FRAMEBUFFER_ANGLE)
795 {
796 framebuffer = context->getReadFramebuffer();
797 }
798 else
799 {
800 framebuffer = context->getDrawFramebuffer();
801 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000802
803 return framebuffer->completeness();
804 }
805 }
806 catch(std::bad_alloc&)
807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000808 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000809 }
810
811 return 0;
812}
813
814void __stdcall glClear(GLbitfield mask)
815{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000816 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000817
818 try
819 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000820 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000821
822 if (context)
823 {
Geoff Lang0b833232013-08-21 10:13:29 -0400824 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
825
826 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
827 {
828 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
829 }
830
831 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
832 {
833 return gl::error(GL_INVALID_VALUE);
834 }
835
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836 context->clear(mask);
837 }
838 }
839 catch(std::bad_alloc&)
840 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000841 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000842 }
843}
844
845void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
846{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000847 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000848 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000849
850 try
851 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000852 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000853
854 if (context)
855 {
856 context->setClearColor(red, green, blue, alpha);
857 }
858 }
859 catch(std::bad_alloc&)
860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000861 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000862 }
863}
864
865void __stdcall glClearDepthf(GLclampf depth)
866{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000867 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000868
869 try
870 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000871 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000872
873 if (context)
874 {
875 context->setClearDepth(depth);
876 }
877 }
878 catch(std::bad_alloc&)
879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000880 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000881 }
882}
883
884void __stdcall glClearStencil(GLint s)
885{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000886 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000887
888 try
889 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000890 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000891
892 if (context)
893 {
894 context->setClearStencil(s);
895 }
896 }
897 catch(std::bad_alloc&)
898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000899 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000900 }
901}
902
903void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
904{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000905 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000906 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000907
908 try
909 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000910 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000911
912 if (context)
913 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000914 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000915 }
916 }
917 catch(std::bad_alloc&)
918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000919 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000920 }
921}
922
923void __stdcall glCompileShader(GLuint shader)
924{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000925 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000926
927 try
928 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000929 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000930
931 if (context)
932 {
933 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000934
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000935 if (!shaderObject)
936 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000937 if (context->getProgram(shader))
938 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000939 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000940 }
941 else
942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000943 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000944 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000945 }
946
947 shaderObject->compile();
948 }
949 }
950 catch(std::bad_alloc&)
951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000952 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000953 }
954}
955
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000956void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
957 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000958{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000959 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000960 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000961 target, level, internalformat, width, height, border, imageSize, data);
962
963 try
964 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000965 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000966
967 if (context)
968 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000969 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400970 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000971 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
972 {
973 return;
974 }
975
976 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400977 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400978 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000979 {
980 return;
981 }
982
983 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000985 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000986 }
987
988 switch (target)
989 {
990 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000991 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000992 gl::Texture2D *texture = context->getTexture2D();
993 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000994 }
995 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000996
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000997 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
998 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
999 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1000 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1001 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1002 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001003 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001004 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1005 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001006 }
1007 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001008
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001009 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001010 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001011 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001012 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001013 }
1014 catch(std::bad_alloc&)
1015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001016 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001017 }
1018}
1019
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001020void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1021 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001022{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001023 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001024 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001025 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001026 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1027
1028 try
1029 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001030 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001031
1032 if (context)
1033 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001034 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001035 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001036 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
1037 {
1038 return;
1039 }
1040
1041 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001042 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04001043 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001044 {
1045 return;
1046 }
1047
1048 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001050 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001051 }
1052
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001053 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +00001054 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001055 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001056 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001057 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001058 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001059 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001060 break;
1061
1062 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1063 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1064 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1065 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1066 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1067 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001068 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001069 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001070 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001071 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001072 break;
1073
1074 default:
1075 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001076 }
1077 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001078 }
1079 catch(std::bad_alloc&)
1080 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001081 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001082 }
1083}
1084
1085void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1086{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001087 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001088 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001089 target, level, internalformat, x, y, width, height, border);
1090
1091 try
1092 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001093 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001094
1095 if (context)
1096 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001097 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001098 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001099 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001100 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001101 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001102 }
1103
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001104 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001105 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001106 0, 0, 0, x, y, width, height, border))
1107 {
1108 return;
1109 }
1110
1111 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
1112
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001113 switch (target)
1114 {
1115 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001116 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001117 gl::Texture2D *texture = context->getTexture2D();
1118 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001119 }
1120 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001121
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001122 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1123 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1124 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1125 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1126 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1127 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001128 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001129 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1130 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001131 }
1132 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001133
1134 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001135 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001136 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001137 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001138 }
1139 catch(std::bad_alloc&)
1140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001141 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001142 }
1143}
1144
1145void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1146{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001147 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001148 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001149 target, level, xoffset, yoffset, x, y, width, height);
1150
1151 try
1152 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001153 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001154
1155 if (context)
1156 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001157 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001158 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001159 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001160 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001161 return;
1162 }
1163
1164 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001165 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001166 xoffset, yoffset, 0, x, y, width, height, 0))
1167 {
1168 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001169 }
1170
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001171 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001172
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001173 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001174 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001175 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001176 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001177 gl::Texture2D *texture = context->getTexture2D();
1178 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001179 }
1180 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001181
1182 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1183 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1184 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1185 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1186 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1187 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001188 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001189 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1190 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001191 }
1192 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001193
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001194 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001195 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001196 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001197 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001198 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001199
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001200 catch(std::bad_alloc&)
1201 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001202 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001203 }
1204}
1205
1206GLuint __stdcall glCreateProgram(void)
1207{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001208 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001209
1210 try
1211 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001212 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001213
1214 if (context)
1215 {
1216 return context->createProgram();
1217 }
1218 }
1219 catch(std::bad_alloc&)
1220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001221 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001222 }
1223
1224 return 0;
1225}
1226
1227GLuint __stdcall glCreateShader(GLenum type)
1228{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001229 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001230
1231 try
1232 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001233 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001234
1235 if (context)
1236 {
1237 switch (type)
1238 {
1239 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001240 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001241 return context->createShader(type);
1242 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001243 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001244 }
1245 }
1246 }
1247 catch(std::bad_alloc&)
1248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001249 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001250 }
1251
1252 return 0;
1253}
1254
1255void __stdcall glCullFace(GLenum mode)
1256{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001257 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001258
1259 try
1260 {
1261 switch (mode)
1262 {
1263 case GL_FRONT:
1264 case GL_BACK:
1265 case GL_FRONT_AND_BACK:
1266 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001268
1269 if (context)
1270 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001271 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001272 }
1273 }
1274 break;
1275 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001276 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001277 }
1278 }
1279 catch(std::bad_alloc&)
1280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001282 }
1283}
1284
1285void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001287 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001288
1289 try
1290 {
1291 if (n < 0)
1292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001293 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001294 }
1295
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001296 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001297
1298 if (context)
1299 {
1300 for (int i = 0; i < n; i++)
1301 {
1302 context->deleteBuffer(buffers[i]);
1303 }
1304 }
1305 }
1306 catch(std::bad_alloc&)
1307 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001308 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001309 }
1310}
1311
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001312void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1313{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001314 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001315
1316 try
1317 {
1318 if (n < 0)
1319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001320 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001321 }
1322
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001323 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001324
1325 if (context)
1326 {
1327 for (int i = 0; i < n; i++)
1328 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001329 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001330 }
1331 }
1332 }
1333 catch(std::bad_alloc&)
1334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001335 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001336 }
1337}
1338
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001339void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1340{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001341 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001342
1343 try
1344 {
1345 if (n < 0)
1346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001347 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001348 }
1349
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001350 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001351
1352 if (context)
1353 {
1354 for (int i = 0; i < n; i++)
1355 {
1356 if (framebuffers[i] != 0)
1357 {
1358 context->deleteFramebuffer(framebuffers[i]);
1359 }
1360 }
1361 }
1362 }
1363 catch(std::bad_alloc&)
1364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001365 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001366 }
1367}
1368
1369void __stdcall glDeleteProgram(GLuint program)
1370{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001371 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001372
1373 try
1374 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001375 if (program == 0)
1376 {
1377 return;
1378 }
1379
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001380 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001381
1382 if (context)
1383 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001384 if (!context->getProgram(program))
1385 {
1386 if(context->getShader(program))
1387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001388 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001389 }
1390 else
1391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001392 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001393 }
1394 }
1395
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001396 context->deleteProgram(program);
1397 }
1398 }
1399 catch(std::bad_alloc&)
1400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001401 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001402 }
1403}
1404
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001405void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1406{
1407 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1408
1409 try
1410 {
1411 if (n < 0)
1412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001413 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001414 }
1415
1416 gl::Context *context = gl::getNonLostContext();
1417
1418 if (context)
1419 {
1420 for (int i = 0; i < n; i++)
1421 {
1422 context->deleteQuery(ids[i]);
1423 }
1424 }
1425 }
1426 catch(std::bad_alloc&)
1427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001428 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001429 }
1430}
1431
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001432void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1433{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001434 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001435
1436 try
1437 {
1438 if (n < 0)
1439 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001440 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001441 }
1442
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001443 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001444
1445 if (context)
1446 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001447 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001448 {
1449 context->deleteRenderbuffer(renderbuffers[i]);
1450 }
1451 }
1452 }
1453 catch(std::bad_alloc&)
1454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001455 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456 }
1457}
1458
1459void __stdcall glDeleteShader(GLuint shader)
1460{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001461 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001462
1463 try
1464 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001465 if (shader == 0)
1466 {
1467 return;
1468 }
1469
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001470 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001471
1472 if (context)
1473 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001474 if (!context->getShader(shader))
1475 {
1476 if(context->getProgram(shader))
1477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001478 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001479 }
1480 else
1481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001482 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001483 }
1484 }
1485
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001486 context->deleteShader(shader);
1487 }
1488 }
1489 catch(std::bad_alloc&)
1490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001491 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001492 }
1493}
1494
1495void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001497 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001498
1499 try
1500 {
1501 if (n < 0)
1502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001503 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001504 }
1505
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001506 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001507
1508 if (context)
1509 {
1510 for (int i = 0; i < n; i++)
1511 {
1512 if (textures[i] != 0)
1513 {
1514 context->deleteTexture(textures[i]);
1515 }
1516 }
1517 }
1518 }
1519 catch(std::bad_alloc&)
1520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001521 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001522 }
1523}
1524
1525void __stdcall glDepthFunc(GLenum func)
1526{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001527 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001528
1529 try
1530 {
1531 switch (func)
1532 {
1533 case GL_NEVER:
1534 case GL_ALWAYS:
1535 case GL_LESS:
1536 case GL_LEQUAL:
1537 case GL_EQUAL:
1538 case GL_GREATER:
1539 case GL_GEQUAL:
1540 case GL_NOTEQUAL:
1541 break;
1542 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001543 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001544 }
1545
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001546 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001547
1548 if (context)
1549 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001550 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001551 }
1552 }
1553 catch(std::bad_alloc&)
1554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001555 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001556 }
1557}
1558
1559void __stdcall glDepthMask(GLboolean flag)
1560{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001561 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001562
1563 try
1564 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001565 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001566
1567 if (context)
1568 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001569 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001570 }
1571 }
1572 catch(std::bad_alloc&)
1573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001574 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001575 }
1576}
1577
1578void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1579{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001580 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001581
1582 try
1583 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001584 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001585
1586 if (context)
1587 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001588 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001589 }
1590 }
1591 catch(std::bad_alloc&)
1592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001593 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001594 }
1595}
1596
1597void __stdcall glDetachShader(GLuint program, GLuint shader)
1598{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001599 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001600
1601 try
1602 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001603 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001604
1605 if (context)
1606 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001607
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001608 gl::Program *programObject = context->getProgram(program);
1609 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001610
1611 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001612 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001613 gl::Shader *shaderByProgramHandle;
1614 shaderByProgramHandle = context->getShader(program);
1615 if (!shaderByProgramHandle)
1616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001617 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001618 }
1619 else
1620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001621 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001622 }
1623 }
1624
1625 if (!shaderObject)
1626 {
1627 gl::Program *programByShaderHandle = context->getProgram(shader);
1628 if (!programByShaderHandle)
1629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001630 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001631 }
1632 else
1633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001634 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001635 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001636 }
1637
1638 if (!programObject->detachShader(shaderObject))
1639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001640 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001641 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001642 }
1643 }
1644 catch(std::bad_alloc&)
1645 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001646 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001647 }
1648}
1649
1650void __stdcall glDisable(GLenum cap)
1651{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001652 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001653
1654 try
1655 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001656 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001657
1658 if (context)
1659 {
1660 switch (cap)
1661 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001662 case GL_CULL_FACE: context->setCullFace(false); break;
1663 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
1664 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
1665 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
1666 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
1667 case GL_STENCIL_TEST: context->setStencilTest(false); break;
1668 case GL_DEPTH_TEST: context->setDepthTest(false); break;
1669 case GL_BLEND: context->setBlend(false); break;
1670 case GL_DITHER: context->setDither(false); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00001671
1672 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1673 case GL_RASTERIZER_DISCARD:
1674 if (context->getClientVersion() < 3)
1675 {
1676 return gl::error(GL_INVALID_ENUM);
1677 }
1678 UNIMPLEMENTED();
1679 break;
1680
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001681 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001682 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001683 }
1684 }
1685 }
1686 catch(std::bad_alloc&)
1687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001688 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001689 }
1690}
1691
1692void __stdcall glDisableVertexAttribArray(GLuint index)
1693{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001694 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001695
1696 try
1697 {
1698 if (index >= gl::MAX_VERTEX_ATTRIBS)
1699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001700 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001701 }
1702
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001703 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001704
1705 if (context)
1706 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001707 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001708 }
1709 }
1710 catch(std::bad_alloc&)
1711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001713 }
1714}
1715
1716void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001718 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001719
1720 try
1721 {
1722 if (count < 0 || first < 0)
1723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001724 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001725 }
1726
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001728
1729 if (context)
1730 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001731 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001732 }
1733 }
1734 catch(std::bad_alloc&)
1735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001736 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001737 }
1738}
1739
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001740void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1741{
1742 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1743
1744 try
1745 {
1746 if (count < 0 || first < 0 || primcount < 0)
1747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001748 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001749 }
1750
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001751 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001752 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001753 gl::Context *context = gl::getNonLostContext();
1754
1755 if (context)
1756 {
1757 context->drawArrays(mode, first, count, primcount);
1758 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001759 }
1760 }
1761 catch(std::bad_alloc&)
1762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001763 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001764 }
1765}
1766
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001767void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001768{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001769 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 +00001770 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001771
1772 try
1773 {
1774 if (count < 0)
1775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001776 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001777 }
1778
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001779 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001780
1781 if (context)
1782 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001783 switch (type)
1784 {
1785 case GL_UNSIGNED_BYTE:
1786 case GL_UNSIGNED_SHORT:
1787 break;
1788 case GL_UNSIGNED_INT:
1789 if (!context->supports32bitIndices())
1790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001791 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001792 }
1793 break;
1794 default:
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
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001798 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001799 }
1800 }
1801 catch(std::bad_alloc&)
1802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001803 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001804 }
1805}
1806
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001807void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1808{
1809 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1810 mode, count, type, indices, primcount);
1811
1812 try
1813 {
1814 if (count < 0 || primcount < 0)
1815 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001816 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001817 }
1818
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001819 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001820 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001821 gl::Context *context = gl::getNonLostContext();
1822
1823 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001824 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001825 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001826 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001827 case GL_UNSIGNED_BYTE:
1828 case GL_UNSIGNED_SHORT:
1829 break;
1830 case GL_UNSIGNED_INT:
1831 if (!context->supports32bitIndices())
1832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001833 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001834 }
1835 break;
1836 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001837 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001838 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001839
1840 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001841 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001842 }
1843 }
1844 catch(std::bad_alloc&)
1845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001846 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001847 }
1848}
1849
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001850void __stdcall glEnable(GLenum cap)
1851{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001852 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001853
1854 try
1855 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001856 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001857
1858 if (context)
1859 {
1860 switch (cap)
1861 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001862 case GL_CULL_FACE: context->setCullFace(true); break;
1863 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
1864 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
1865 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
1866 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
1867 case GL_STENCIL_TEST: context->setStencilTest(true); break;
1868 case GL_DEPTH_TEST: context->setDepthTest(true); break;
1869 case GL_BLEND: context->setBlend(true); break;
1870 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001871 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001872 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001873 }
1874 }
1875 }
1876 catch(std::bad_alloc&)
1877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001878 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001879 }
1880}
1881
1882void __stdcall glEnableVertexAttribArray(GLuint index)
1883{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001884 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001885
1886 try
1887 {
1888 if (index >= gl::MAX_VERTEX_ATTRIBS)
1889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001890 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001891 }
1892
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001893 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001894
1895 if (context)
1896 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001897 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001898 }
1899 }
1900 catch(std::bad_alloc&)
1901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001902 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001903 }
1904}
1905
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001906void __stdcall glEndQueryEXT(GLenum target)
1907{
1908 EVENT("GLenum target = 0x%X)", target);
1909
1910 try
1911 {
1912 switch (target)
1913 {
1914 case GL_ANY_SAMPLES_PASSED_EXT:
1915 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
1916 break;
1917 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001918 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001919 }
1920
1921 gl::Context *context = gl::getNonLostContext();
1922
1923 if (context)
1924 {
1925 context->endQuery(target);
1926 }
1927 }
1928 catch(std::bad_alloc&)
1929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001930 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001931 }
1932}
1933
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001934void __stdcall glFinishFenceNV(GLuint fence)
1935{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001936 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001937
1938 try
1939 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001940 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001941
1942 if (context)
1943 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001944 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001945
1946 if (fenceObject == NULL)
1947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001948 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001949 }
1950
Jamie Madillfb9a7402013-07-26 11:55:01 -04001951 if (fenceObject->isFence() != GL_TRUE)
1952 {
1953 return gl::error(GL_INVALID_OPERATION);
1954 }
1955
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001956 fenceObject->finishFence();
1957 }
1958 }
1959 catch(std::bad_alloc&)
1960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001961 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001962 }
1963}
1964
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001965void __stdcall glFinish(void)
1966{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001967 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001968
1969 try
1970 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001971 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001972
1973 if (context)
1974 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001975 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001976 }
1977 }
1978 catch(std::bad_alloc&)
1979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001980 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001981 }
1982}
1983
1984void __stdcall glFlush(void)
1985{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001986 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001987
1988 try
1989 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001990 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001991
1992 if (context)
1993 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001994 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001995 }
1996 }
1997 catch(std::bad_alloc&)
1998 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001999 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002000 }
2001}
2002
2003void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2004{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002005 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002006 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002007
2008 try
2009 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002010 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002011 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002013 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002014 }
2015
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002016 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002017
2018 if (context)
2019 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002020 gl::Framebuffer *framebuffer = NULL;
2021 GLuint framebufferHandle = 0;
2022 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2023 {
2024 framebuffer = context->getReadFramebuffer();
2025 framebufferHandle = context->getReadFramebufferHandle();
2026 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002027 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002028 {
2029 framebuffer = context->getDrawFramebuffer();
2030 framebufferHandle = context->getDrawFramebufferHandle();
2031 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002032
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002033 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002035 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002036 }
2037
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002038 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002039 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002040 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2041
2042 if (colorAttachment >= context->getMaximumRenderTargets())
2043 {
2044 return gl::error(GL_INVALID_VALUE);
2045 }
2046
Geoff Lang309c92a2013-07-25 16:23:19 -04002047 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002048 }
2049 else
2050 {
2051 switch (attachment)
2052 {
2053 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002054 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002055 break;
2056 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002057 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002058 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04002059 case GL_DEPTH_STENCIL_ATTACHMENT:
2060 if (context->getClientVersion() < 3)
2061 {
2062 return gl::error(GL_INVALID_ENUM);
2063 }
2064 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
2065 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002066 default:
2067 return gl::error(GL_INVALID_ENUM);
2068 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002069 }
2070 }
2071 }
2072 catch(std::bad_alloc&)
2073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002074 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002075 }
2076}
2077
2078void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2079{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002080 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002081 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002082
2083 try
2084 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002085 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002086 if (context)
2087 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002088 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002089 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002090 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002091 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002092 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04002093
2094 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002095 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002096 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002097 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002098 }
2099
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002100 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002101 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002102 textarget = GL_NONE;
2103 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002104
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002105 gl::Framebuffer *framebuffer = NULL;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002106 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2107 {
2108 framebuffer = context->getReadFramebuffer();
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002109 }
2110 else
2111 {
2112 framebuffer = context->getDrawFramebuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002113 }
2114
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002115 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002116 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002117 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04002118 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002119 }
2120 else
2121 {
2122 switch (attachment)
2123 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002124 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2125 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2126 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002127 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002128 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002129 }
2130 }
2131 catch(std::bad_alloc&)
2132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002133 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002134 }
2135}
2136
2137void __stdcall glFrontFace(GLenum mode)
2138{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002139 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002140
2141 try
2142 {
2143 switch (mode)
2144 {
2145 case GL_CW:
2146 case GL_CCW:
2147 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002148 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002149
2150 if (context)
2151 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002152 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002153 }
2154 }
2155 break;
2156 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002157 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002158 }
2159 }
2160 catch(std::bad_alloc&)
2161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002162 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002163 }
2164}
2165
2166void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2167{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002168 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002169
2170 try
2171 {
2172 if (n < 0)
2173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002174 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002175 }
2176
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002177 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002178
2179 if (context)
2180 {
2181 for (int i = 0; i < n; i++)
2182 {
2183 buffers[i] = context->createBuffer();
2184 }
2185 }
2186 }
2187 catch(std::bad_alloc&)
2188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002189 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002190 }
2191}
2192
2193void __stdcall glGenerateMipmap(GLenum target)
2194{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002195 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002196
2197 try
2198 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002199 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002200
2201 if (context)
2202 {
Jamie Madill35d15012013-10-07 10:46:37 -04002203 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002205 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002206 }
Geoff Langae4852a2013-06-05 15:00:34 -04002207
Jamie Madill35d15012013-10-07 10:46:37 -04002208 gl::Texture *texture = GetTargetTexture(context, target);
2209
2210 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002211 {
2212 return gl::error(GL_INVALID_OPERATION);
2213 }
2214
Geoff Lang005df412013-10-16 14:12:50 -04002215 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002216
Geoff Langae4852a2013-06-05 15:00:34 -04002217 // Internally, all texture formats are sized so checking if the format
2218 // is color renderable and filterable will not fail.
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002219 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2220 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Geoff Langae4852a2013-06-05 15:00:34 -04002221 !gl::IsColorRenderingSupported(internalFormat, context) ||
2222 !gl::IsTextureFilteringSupported(internalFormat, context))
2223 {
2224 return gl::error(GL_INVALID_OPERATION);
2225 }
2226
Jamie Madillc1f8b162013-10-07 10:46:38 -04002227 // Non-power of 2 ES2 check
2228 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2229 {
2230 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2231 return gl::error(GL_INVALID_OPERATION);
2232 }
2233
2234 // Cube completeness check
2235 if (target == GL_TEXTURE_CUBE_MAP)
2236 {
2237 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2238 if (!textureCube->isCubeComplete())
2239 {
2240 return gl::error(GL_INVALID_OPERATION);
2241 }
2242 }
2243
Geoff Langae4852a2013-06-05 15:00:34 -04002244 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002245 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002246 }
2247 catch(std::bad_alloc&)
2248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002249 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002250 }
2251}
2252
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002253void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2254{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002255 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002256
2257 try
2258 {
2259 if (n < 0)
2260 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002261 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002262 }
2263
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002264 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002265
2266 if (context)
2267 {
2268 for (int i = 0; i < n; i++)
2269 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002270 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002271 }
2272 }
2273 }
2274 catch(std::bad_alloc&)
2275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002276 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002277 }
2278}
2279
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002280void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2281{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002282 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002283
2284 try
2285 {
2286 if (n < 0)
2287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002288 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002289 }
2290
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002292
2293 if (context)
2294 {
2295 for (int i = 0; i < n; i++)
2296 {
2297 framebuffers[i] = context->createFramebuffer();
2298 }
2299 }
2300 }
2301 catch(std::bad_alloc&)
2302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002303 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002304 }
2305}
2306
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002307void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2308{
2309 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2310
2311 try
2312 {
2313 if (n < 0)
2314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002315 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002316 }
2317
2318 gl::Context *context = gl::getNonLostContext();
2319
2320 if (context)
2321 {
2322 for (int i = 0; i < n; i++)
2323 {
2324 ids[i] = context->createQuery();
2325 }
2326 }
2327 }
2328 catch(std::bad_alloc&)
2329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002330 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002331 }
2332}
2333
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002334void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2335{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002336 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002337
2338 try
2339 {
2340 if (n < 0)
2341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002342 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002343 }
2344
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002345 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002346
2347 if (context)
2348 {
2349 for (int i = 0; i < n; i++)
2350 {
2351 renderbuffers[i] = context->createRenderbuffer();
2352 }
2353 }
2354 }
2355 catch(std::bad_alloc&)
2356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002357 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002358 }
2359}
2360
2361void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2362{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002363 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002364
2365 try
2366 {
2367 if (n < 0)
2368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002369 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002370 }
2371
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002372 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002373
2374 if (context)
2375 {
2376 for (int i = 0; i < n; i++)
2377 {
2378 textures[i] = context->createTexture();
2379 }
2380 }
2381 }
2382 catch(std::bad_alloc&)
2383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002384 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002385 }
2386}
2387
daniel@transgaming.com85423182010-04-22 13:35:27 +00002388void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002389{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002390 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002391 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002392 program, index, bufsize, length, size, type, name);
2393
2394 try
2395 {
2396 if (bufsize < 0)
2397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002398 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002399 }
2400
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002401 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002402
2403 if (context)
2404 {
2405 gl::Program *programObject = context->getProgram(program);
2406
2407 if (!programObject)
2408 {
2409 if (context->getShader(program))
2410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002411 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002412 }
2413 else
2414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002415 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002416 }
2417 }
2418
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002419 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002421 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002422 }
2423
2424 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2425 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002426 }
2427 catch(std::bad_alloc&)
2428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002429 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 }
2431}
2432
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002433void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002434{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002435 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002436 "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 +00002437 program, index, bufsize, length, size, type, name);
2438
2439 try
2440 {
2441 if (bufsize < 0)
2442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002443 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002444 }
2445
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002447
2448 if (context)
2449 {
2450 gl::Program *programObject = context->getProgram(program);
2451
2452 if (!programObject)
2453 {
2454 if (context->getShader(program))
2455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002456 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002457 }
2458 else
2459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002460 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002461 }
2462 }
2463
2464 if (index >= (GLuint)programObject->getActiveUniformCount())
2465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002466 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002467 }
2468
2469 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2470 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002471 }
2472 catch(std::bad_alloc&)
2473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002474 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475 }
2476}
2477
2478void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2479{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002480 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 +00002481 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002482
2483 try
2484 {
2485 if (maxcount < 0)
2486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002487 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002488 }
2489
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002490 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002491
2492 if (context)
2493 {
2494 gl::Program *programObject = context->getProgram(program);
2495
2496 if (!programObject)
2497 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002498 if (context->getShader(program))
2499 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002500 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002501 }
2502 else
2503 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002504 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002505 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002506 }
2507
2508 return programObject->getAttachedShaders(maxcount, count, shaders);
2509 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002510 }
2511 catch(std::bad_alloc&)
2512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002513 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002514 }
2515}
2516
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002517int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002518{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002519 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002520
2521 try
2522 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002523 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002524
2525 if (context)
2526 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002527
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002528 gl::Program *programObject = context->getProgram(program);
2529
2530 if (!programObject)
2531 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002532 if (context->getShader(program))
2533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002534 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002535 }
2536 else
2537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002538 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002539 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002540 }
2541
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002542 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002543 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002545 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002546 }
2547
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002548 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002549 }
2550 }
2551 catch(std::bad_alloc&)
2552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002553 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002554 }
2555
2556 return -1;
2557}
2558
2559void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2560{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002561 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002562
2563 try
2564 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002565 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002566
2567 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002568 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002569 GLenum nativeType;
2570 unsigned int numParams = 0;
2571 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2572 return gl::error(GL_INVALID_ENUM);
2573
2574 // pname is valid, but there are no parameters to return
2575 if (numParams == 0)
2576 return;
2577
2578 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002579 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002580 context->getBooleanv(pname, params);
2581 }
Jamie Madill55856b12014-01-02 13:59:50 -05002582 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002583 {
Jamie Madill55856b12014-01-02 13:59:50 -05002584 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002585 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002586 }
2587 }
2588 catch(std::bad_alloc&)
2589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002590 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002591 }
2592}
2593
2594void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2595{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002596 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 +00002597
2598 try
2599 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002600 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002601
2602 if (context)
2603 {
2604 gl::Buffer *buffer;
2605
2606 switch (target)
2607 {
2608 case GL_ARRAY_BUFFER:
2609 buffer = context->getArrayBuffer();
2610 break;
2611 case GL_ELEMENT_ARRAY_BUFFER:
2612 buffer = context->getElementArrayBuffer();
2613 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002614 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002615 }
2616
2617 if (!buffer)
2618 {
2619 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002620 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002621 }
2622
2623 switch (pname)
2624 {
2625 case GL_BUFFER_USAGE:
2626 *params = buffer->usage();
2627 break;
2628 case GL_BUFFER_SIZE:
2629 *params = buffer->size();
2630 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002631 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002632 }
2633 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002634 }
2635 catch(std::bad_alloc&)
2636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002637 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002638 }
2639}
2640
2641GLenum __stdcall glGetError(void)
2642{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002643 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002644
2645 gl::Context *context = gl::getContext();
2646
2647 if (context)
2648 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002649 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002650 }
2651
2652 return GL_NO_ERROR;
2653}
2654
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002655void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2656{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002657 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002658
2659 try
2660 {
2661
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002662 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002663
2664 if (context)
2665 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002666 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002667
2668 if (fenceObject == NULL)
2669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002670 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002671 }
2672
Jamie Madillfb9a7402013-07-26 11:55:01 -04002673 if (fenceObject->isFence() != GL_TRUE)
2674 {
2675 return gl::error(GL_INVALID_OPERATION);
2676 }
2677
2678 switch (pname)
2679 {
2680 case GL_FENCE_STATUS_NV:
2681 case GL_FENCE_CONDITION_NV:
2682 break;
2683
2684 default: return gl::error(GL_INVALID_ENUM);
2685 }
2686
2687 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002688 }
2689 }
2690 catch(std::bad_alloc&)
2691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002692 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002693 }
2694}
2695
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002696void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2697{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002698 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002699
2700 try
2701 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002702 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002703
2704 if (context)
2705 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002706 GLenum nativeType;
2707 unsigned int numParams = 0;
2708 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2709 return gl::error(GL_INVALID_ENUM);
2710
2711 // pname is valid, but that there are no parameters to return.
2712 if (numParams == 0)
2713 return;
2714
2715 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002716 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002717 context->getFloatv(pname, params);
2718 }
Jamie Madill55856b12014-01-02 13:59:50 -05002719 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002720 {
Jamie Madill55856b12014-01-02 13:59:50 -05002721 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002722 }
2723 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002724 }
2725 catch(std::bad_alloc&)
2726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002727 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002728 }
2729}
2730
2731void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2732{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002733 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 +00002734 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002735
2736 try
2737 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002738 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002739
2740 if (context)
2741 {
Geoff Lang646559f2013-08-15 11:08:15 -04002742 META_ASSERT(GL_DRAW_FRAMEBUFFER_ANGLE == GL_DRAW_FRAMEBUFFER && GL_READ_FRAMEBUFFER_ANGLE == GL_READ_FRAMEBUFFER);
2743 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002745 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002746 }
2747
Geoff Lang646559f2013-08-15 11:08:15 -04002748 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002749 {
Geoff Lang646559f2013-08-15 11:08:15 -04002750 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2751 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2752 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2753 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2754 break;
2755 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2756 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2757 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2758 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2759 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2760 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2761 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2762 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2763 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2764 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002765 {
Geoff Lang646559f2013-08-15 11:08:15 -04002766 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002767 }
Geoff Lang646559f2013-08-15 11:08:15 -04002768 default:
2769 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002770 }
Geoff Lang646559f2013-08-15 11:08:15 -04002771
2772 // Determine if the attachment is a valid enum
2773 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002774 {
Geoff Lang646559f2013-08-15 11:08:15 -04002775 case GL_BACK:
2776 case GL_FRONT:
2777 case GL_STENCIL:
2778 case GL_DEPTH_STENCIL_ATTACHMENT:
2779 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002780 {
Geoff Lang646559f2013-08-15 11:08:15 -04002781 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002782 }
Geoff Lang646559f2013-08-15 11:08:15 -04002783 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002784
Geoff Lang646559f2013-08-15 11:08:15 -04002785 case GL_DEPTH_ATTACHMENT:
2786 case GL_STENCIL_ATTACHMENT:
2787 break;
2788
2789 default:
2790 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2791 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2792 {
2793 return gl::error(GL_INVALID_ENUM);
2794 }
2795 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002796 }
2797
Geoff Lang646559f2013-08-15 11:08:15 -04002798 GLuint framebufferHandle = (target == GL_READ_FRAMEBUFFER) ? context->getReadFramebufferHandle()
2799 : context->getDrawFramebufferHandle();
2800
2801 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2802
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002803 GLenum attachmentType;
2804 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002805 GLuint attachmentLevel;
2806 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002807 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002808
Geoff Lang646559f2013-08-15 11:08:15 -04002809 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002810 {
Geoff Lang646559f2013-08-15 11:08:15 -04002811 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002812 {
Geoff Lang646559f2013-08-15 11:08:15 -04002813 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002814 }
2815
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002816 switch (attachment)
2817 {
Geoff Lang646559f2013-08-15 11:08:15 -04002818 case GL_BACK:
2819 attachmentType = framebuffer->getColorbufferType(0);
2820 attachmentHandle = framebuffer->getColorbufferHandle(0);
2821 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2822 attachmentLayer = framebuffer->getColorbufferLayer(0);
2823 renderbuffer = framebuffer->getColorbuffer(0);
2824 break;
2825 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002826 attachmentType = framebuffer->getDepthbufferType();
2827 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002828 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2829 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002830 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002831 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002832 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002833 attachmentType = framebuffer->getStencilbufferType();
2834 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002835 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2836 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002837 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002838 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002839 default:
2840 return gl::error(GL_INVALID_OPERATION);
2841 }
2842 }
2843 else
2844 {
2845 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2846 {
2847 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2848 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2849 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2850 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2851 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2852 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2853 }
2854 else
2855 {
2856 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002857 {
Geoff Lang646559f2013-08-15 11:08:15 -04002858 case GL_DEPTH_ATTACHMENT:
2859 attachmentType = framebuffer->getDepthbufferType();
2860 attachmentHandle = framebuffer->getDepthbufferHandle();
2861 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2862 attachmentLayer = framebuffer->getDepthbufferLayer();
2863 renderbuffer = framebuffer->getDepthbuffer();
2864 break;
2865 case GL_STENCIL_ATTACHMENT:
2866 attachmentType = framebuffer->getStencilbufferType();
2867 attachmentHandle = framebuffer->getStencilbufferHandle();
2868 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2869 attachmentLayer = framebuffer->getStencilbufferLayer();
2870 renderbuffer = framebuffer->getStencilbuffer();
2871 break;
2872 case GL_DEPTH_STENCIL_ATTACHMENT:
2873 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2874 {
2875 return gl::error(GL_INVALID_OPERATION);
2876 }
2877 attachmentType = framebuffer->getDepthStencilbufferType();
2878 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2879 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2880 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2881 renderbuffer = framebuffer->getDepthStencilBuffer();
2882 break;
2883 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002884 return gl::error(GL_INVALID_OPERATION);
2885 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002886 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002887 }
2888
2889 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002890 if (framebufferHandle == 0)
2891 {
2892 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2893 }
2894 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002895 {
2896 attachmentObjectType = attachmentType;
2897 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002898 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002899 {
2900 attachmentObjectType = GL_TEXTURE;
2901 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002902 else
2903 {
2904 UNREACHABLE();
2905 return;
2906 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002907
Geoff Lang646559f2013-08-15 11:08:15 -04002908 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002909 {
Geoff Lang646559f2013-08-15 11:08:15 -04002910 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2911 // is NONE, then querying any other pname will generate INVALID_ENUM.
2912
2913 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2914 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2915 // INVALID_OPERATION for all other pnames
2916
2917 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002918 {
Geoff Lang646559f2013-08-15 11:08:15 -04002919 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2920 *params = attachmentObjectType;
2921 break;
2922
2923 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2924 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002925 {
Geoff Lang646559f2013-08-15 11:08:15 -04002926 return gl::error(GL_INVALID_ENUM);
2927 }
2928 *params = 0;
2929 break;
2930
2931 default:
2932 if (context->getClientVersion() < 3)
2933 {
2934 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002935 }
2936 else
2937 {
Geoff Lang646559f2013-08-15 11:08:15 -04002938 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002939 }
2940 }
Geoff Lang646559f2013-08-15 11:08:15 -04002941 }
2942 else
2943 {
2944 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2945 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2946 ASSERT(renderbuffer != NULL);
2947
2948 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002949 {
Geoff Lang646559f2013-08-15 11:08:15 -04002950 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2951 *params = attachmentObjectType;
2952 break;
2953
2954 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2955 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2956 {
2957 return gl::error(GL_INVALID_ENUM);
2958 }
2959 *params = attachmentHandle;
2960 break;
2961
2962 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2963 if (attachmentObjectType != GL_TEXTURE)
2964 {
2965 return gl::error(GL_INVALID_ENUM);
2966 }
2967 *params = attachmentLevel;
2968 break;
2969
2970 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2971 if (attachmentObjectType != GL_TEXTURE)
2972 {
2973 return gl::error(GL_INVALID_ENUM);
2974 }
2975 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2976 break;
2977
2978 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2979 *params = renderbuffer->getRedSize();
2980 break;
2981
2982 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2983 *params = renderbuffer->getGreenSize();
2984 break;
2985
2986 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2987 *params = renderbuffer->getBlueSize();
2988 break;
2989
2990 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2991 *params = renderbuffer->getAlphaSize();
2992 break;
2993
2994 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2995 *params = renderbuffer->getDepthSize();
2996 break;
2997
2998 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2999 *params = renderbuffer->getStencilSize();
3000 break;
3001
3002 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
3003 if (attachment == GL_DEPTH_STENCIL)
3004 {
3005 gl::error(GL_INVALID_OPERATION);
3006 }
3007 *params = renderbuffer->getComponentType();
3008 break;
3009
3010 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
3011 *params = renderbuffer->getColorEncoding();
3012 break;
3013
3014 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
3015 if (attachmentObjectType != GL_TEXTURE)
3016 {
3017 return gl::error(GL_INVALID_ENUM);
3018 }
3019 *params = attachmentLayer;
3020 break;
3021
3022 default:
3023 UNREACHABLE();
3024 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003025 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003026 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003027 }
3028 }
3029 catch(std::bad_alloc&)
3030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003031 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003032 }
3033}
3034
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003035GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3036{
3037 EVENT("()");
3038
3039 try
3040 {
3041 gl::Context *context = gl::getContext();
3042
3043 if (context)
3044 {
3045 return context->getResetStatus();
3046 }
3047
3048 return GL_NO_ERROR;
3049 }
3050 catch(std::bad_alloc&)
3051 {
3052 return GL_OUT_OF_MEMORY;
3053 }
3054}
3055
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003056void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3057{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003058 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003059
3060 try
3061 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003062 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003063
3064 if (context)
3065 {
Jamie Madill79f2f452013-12-19 11:13:02 -05003066 GLenum nativeType;
3067 unsigned int numParams = 0;
3068 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
3069 return gl::error(GL_INVALID_ENUM);
3070
3071 // pname is valid, but there are no parameters to return
3072 if (numParams == 0)
3073 return;
3074
3075 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003076 {
Jamie Madill79f2f452013-12-19 11:13:02 -05003077 context->getIntegerv(pname, params);
3078 }
Jamie Madill55856b12014-01-02 13:59:50 -05003079 else
Jamie Madill79f2f452013-12-19 11:13:02 -05003080 {
Jamie Madill55856b12014-01-02 13:59:50 -05003081 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003082 }
3083 }
3084 }
3085 catch(std::bad_alloc&)
3086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003087 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003088 }
3089}
3090
3091void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3092{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003093 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003094
3095 try
3096 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003097 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003098
3099 if (context)
3100 {
3101 gl::Program *programObject = context->getProgram(program);
3102
3103 if (!programObject)
3104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003105 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003106 }
3107
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003108 if (context->getClientVersion() < 3)
3109 {
3110 switch (pname)
3111 {
3112 case GL_ACTIVE_UNIFORM_BLOCKS:
3113 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3114 return gl::error(GL_INVALID_ENUM);
3115 }
3116 }
3117
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003118 switch (pname)
3119 {
3120 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003121 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003122 return;
3123 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003124 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003125 return;
3126 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003127 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003128 return;
3129 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003130 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003131 return;
3132 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003133 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003134 return;
3135 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003136 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003137 return;
3138 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003139 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003140 return;
3141 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003142 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003143 return;
3144 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003145 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003146 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003147 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003148 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003149 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003150 case GL_ACTIVE_UNIFORM_BLOCKS:
3151 *params = programObject->getActiveUniformBlockCount();
3152 return;
3153 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3154 *params = programObject->getActiveUniformBlockMaxLength();
3155 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003156 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003157 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003158 }
3159 }
3160 }
3161 catch(std::bad_alloc&)
3162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003163 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003164 }
3165}
3166
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003167void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003168{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003169 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 +00003170 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003171
3172 try
3173 {
3174 if (bufsize < 0)
3175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003176 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003177 }
3178
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003179 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003180
3181 if (context)
3182 {
3183 gl::Program *programObject = context->getProgram(program);
3184
3185 if (!programObject)
3186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003187 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003188 }
3189
3190 programObject->getInfoLog(bufsize, length, infolog);
3191 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003192 }
3193 catch(std::bad_alloc&)
3194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003195 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003196 }
3197}
3198
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003199void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3200{
3201 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3202
3203 try
3204 {
3205 switch (pname)
3206 {
3207 case GL_CURRENT_QUERY_EXT:
3208 break;
3209 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003210 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003211 }
3212
3213 gl::Context *context = gl::getNonLostContext();
3214
3215 if (context)
3216 {
3217 params[0] = context->getActiveQuery(target);
3218 }
3219 }
3220 catch(std::bad_alloc&)
3221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003222 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003223 }
3224}
3225
3226void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3227{
3228 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3229
3230 try
3231 {
3232 switch (pname)
3233 {
3234 case GL_QUERY_RESULT_EXT:
3235 case GL_QUERY_RESULT_AVAILABLE_EXT:
3236 break;
3237 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003238 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003239 }
3240 gl::Context *context = gl::getNonLostContext();
3241
3242 if (context)
3243 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003244 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3245
3246 if (!queryObject)
3247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003248 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003249 }
3250
3251 if (context->getActiveQuery(queryObject->getType()) == id)
3252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003253 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003254 }
3255
3256 switch(pname)
3257 {
3258 case GL_QUERY_RESULT_EXT:
3259 params[0] = queryObject->getResult();
3260 break;
3261 case GL_QUERY_RESULT_AVAILABLE_EXT:
3262 params[0] = queryObject->isResultAvailable();
3263 break;
3264 default:
3265 ASSERT(false);
3266 }
3267 }
3268 }
3269 catch(std::bad_alloc&)
3270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003271 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003272 }
3273}
3274
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003275void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3276{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003277 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 +00003278
3279 try
3280 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003281 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003282
3283 if (context)
3284 {
3285 if (target != GL_RENDERBUFFER)
3286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003287 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003288 }
3289
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003290 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003292 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003293 }
3294
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003295 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003296
3297 switch (pname)
3298 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003299 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3300 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3301 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3302 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3303 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3304 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3305 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3306 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3307 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003308 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003309 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003310 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003311 *params = renderbuffer->getSamples();
3312 }
3313 else
3314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003315 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003316 }
3317 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003318 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003319 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003320 }
3321 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003322 }
3323 catch(std::bad_alloc&)
3324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003325 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003326 }
3327}
3328
3329void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3330{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003331 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003332
3333 try
3334 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003335 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003336
3337 if (context)
3338 {
3339 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003340
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003341 if (!shaderObject)
3342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003343 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003344 }
3345
3346 switch (pname)
3347 {
3348 case GL_SHADER_TYPE:
3349 *params = shaderObject->getType();
3350 return;
3351 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003352 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003353 return;
3354 case GL_COMPILE_STATUS:
3355 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3356 return;
3357 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003358 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003359 return;
3360 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003361 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003362 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003363 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3364 *params = shaderObject->getTranslatedSourceLength();
3365 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003366 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003367 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003368 }
3369 }
3370 }
3371 catch(std::bad_alloc&)
3372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003373 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003374 }
3375}
3376
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003377void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003378{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003379 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 +00003380 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003381
3382 try
3383 {
3384 if (bufsize < 0)
3385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003386 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003387 }
3388
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003389 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003390
3391 if (context)
3392 {
3393 gl::Shader *shaderObject = context->getShader(shader);
3394
3395 if (!shaderObject)
3396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003397 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003398 }
3399
3400 shaderObject->getInfoLog(bufsize, length, infolog);
3401 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003402 }
3403 catch(std::bad_alloc&)
3404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003405 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003406 }
3407}
3408
3409void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3410{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003411 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 +00003412 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003413
3414 try
3415 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003416 switch (shadertype)
3417 {
3418 case GL_VERTEX_SHADER:
3419 case GL_FRAGMENT_SHADER:
3420 break;
3421 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003422 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003423 }
3424
3425 switch (precisiontype)
3426 {
3427 case GL_LOW_FLOAT:
3428 case GL_MEDIUM_FLOAT:
3429 case GL_HIGH_FLOAT:
3430 // Assume IEEE 754 precision
3431 range[0] = 127;
3432 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003433 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003434 break;
3435 case GL_LOW_INT:
3436 case GL_MEDIUM_INT:
3437 case GL_HIGH_INT:
3438 // Some (most) hardware only supports single-precision floating-point numbers,
3439 // which can accurately represent integers up to +/-16777216
3440 range[0] = 24;
3441 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003442 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003443 break;
3444 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003445 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003446 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003447 }
3448 catch(std::bad_alloc&)
3449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003450 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003451 }
3452}
3453
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003454void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003455{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003456 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 +00003457 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003458
3459 try
3460 {
3461 if (bufsize < 0)
3462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003463 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003464 }
3465
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003466 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003467
3468 if (context)
3469 {
3470 gl::Shader *shaderObject = context->getShader(shader);
3471
3472 if (!shaderObject)
3473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003474 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003475 }
3476
3477 shaderObject->getSource(bufsize, length, source);
3478 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003479 }
3480 catch(std::bad_alloc&)
3481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003482 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003483 }
3484}
3485
zmo@google.coma574f782011-10-03 21:45:23 +00003486void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3487{
3488 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3489 shader, bufsize, length, source);
3490
3491 try
3492 {
3493 if (bufsize < 0)
3494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003495 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003496 }
3497
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003498 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003499
3500 if (context)
3501 {
3502 gl::Shader *shaderObject = context->getShader(shader);
3503
3504 if (!shaderObject)
3505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003506 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003507 }
3508
3509 shaderObject->getTranslatedSource(bufsize, length, source);
3510 }
3511 }
3512 catch(std::bad_alloc&)
3513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003514 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003515 }
3516}
3517
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003518const GLubyte* __stdcall glGetString(GLenum name)
3519{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003520 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003521
3522 try
3523 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003524 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003525
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003526 switch (name)
3527 {
3528 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003529 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003530 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003531 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003532 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003533 if (context->getClientVersion() == 2)
3534 {
3535 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
3536 }
3537 else
3538 {
3539 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
3540 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003541 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003542 if (context->getClientVersion() == 2)
3543 {
3544 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
3545 }
3546 else
3547 {
3548 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
3549 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003550 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003551 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003552 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003553 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003554 }
3555 }
3556 catch(std::bad_alloc&)
3557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003558 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003559 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003560}
3561
3562void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3563{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003564 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 +00003565
3566 try
3567 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003568 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003569
3570 if (context)
3571 {
Jamie Madill35d15012013-10-07 10:46:37 -04003572 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003573
Jamie Madillfb8a8302013-07-03 14:24:12 -04003574 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003576 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003577 }
3578
3579 switch (pname)
3580 {
3581 case GL_TEXTURE_MAG_FILTER:
3582 *params = (GLfloat)texture->getMagFilter();
3583 break;
3584 case GL_TEXTURE_MIN_FILTER:
3585 *params = (GLfloat)texture->getMinFilter();
3586 break;
3587 case GL_TEXTURE_WRAP_S:
3588 *params = (GLfloat)texture->getWrapS();
3589 break;
3590 case GL_TEXTURE_WRAP_T:
3591 *params = (GLfloat)texture->getWrapT();
3592 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003593 case GL_TEXTURE_WRAP_R:
3594 if (context->getClientVersion() < 3)
3595 {
3596 return gl::error(GL_INVALID_ENUM);
3597 }
3598 *params = (GLfloat)texture->getWrapR();
3599 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003600 case GL_TEXTURE_IMMUTABLE_FORMAT:
3601 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003602 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3603 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003604 case GL_TEXTURE_IMMUTABLE_LEVELS:
3605 if (context->getClientVersion() < 3)
3606 {
3607 return gl::error(GL_INVALID_ENUM);
3608 }
Jamie Madill51a94372013-10-24 17:49:43 -04003609 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003610 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003611 case GL_TEXTURE_USAGE_ANGLE:
3612 *params = (GLfloat)texture->getUsage();
3613 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003614 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3615 if (!context->supportsTextureFilterAnisotropy())
3616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003617 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003618 }
3619 *params = (GLfloat)texture->getMaxAnisotropy();
3620 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003621 case GL_TEXTURE_SWIZZLE_R:
3622 if (context->getClientVersion() < 3)
3623 {
3624 return gl::error(GL_INVALID_ENUM);
3625 }
3626 *params = (GLfloat)texture->getSwizzleRed();
3627 break;
3628 case GL_TEXTURE_SWIZZLE_G:
3629 if (context->getClientVersion() < 3)
3630 {
3631 return gl::error(GL_INVALID_ENUM);
3632 }
3633 *params = (GLfloat)texture->getSwizzleGreen();
3634 break;
3635 case GL_TEXTURE_SWIZZLE_B:
3636 if (context->getClientVersion() < 3)
3637 {
3638 return gl::error(GL_INVALID_ENUM);
3639 }
3640 *params = (GLfloat)texture->getSwizzleBlue();
3641 break;
3642 case GL_TEXTURE_SWIZZLE_A:
3643 if (context->getClientVersion() < 3)
3644 {
3645 return gl::error(GL_INVALID_ENUM);
3646 }
3647 *params = (GLfloat)texture->getSwizzleAlpha();
3648 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003649 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003650 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003651 }
3652 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003653 }
3654 catch(std::bad_alloc&)
3655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003656 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003657 }
3658}
3659
3660void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3661{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003662 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 +00003663
3664 try
3665 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003666 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003667
3668 if (context)
3669 {
Jamie Madill35d15012013-10-07 10:46:37 -04003670 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003671
Jamie Madillfb8a8302013-07-03 14:24:12 -04003672 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003674 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003675 }
3676
3677 switch (pname)
3678 {
3679 case GL_TEXTURE_MAG_FILTER:
3680 *params = texture->getMagFilter();
3681 break;
3682 case GL_TEXTURE_MIN_FILTER:
3683 *params = texture->getMinFilter();
3684 break;
3685 case GL_TEXTURE_WRAP_S:
3686 *params = texture->getWrapS();
3687 break;
3688 case GL_TEXTURE_WRAP_T:
3689 *params = texture->getWrapT();
3690 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003691 case GL_TEXTURE_WRAP_R:
3692 if (context->getClientVersion() < 3)
3693 {
3694 return gl::error(GL_INVALID_ENUM);
3695 }
3696 *params = texture->getWrapR();
3697 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003698 case GL_TEXTURE_IMMUTABLE_FORMAT:
3699 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003700 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3701 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003702 case GL_TEXTURE_IMMUTABLE_LEVELS:
3703 if (context->getClientVersion() < 3)
3704 {
3705 return gl::error(GL_INVALID_ENUM);
3706 }
Jamie Madill51a94372013-10-24 17:49:43 -04003707 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003708 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003709 case GL_TEXTURE_USAGE_ANGLE:
3710 *params = texture->getUsage();
3711 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003712 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3713 if (!context->supportsTextureFilterAnisotropy())
3714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003715 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003716 }
3717 *params = (GLint)texture->getMaxAnisotropy();
3718 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003719 case GL_TEXTURE_SWIZZLE_R:
3720 if (context->getClientVersion() < 3)
3721 {
3722 return gl::error(GL_INVALID_ENUM);
3723 }
3724 *params = texture->getSwizzleRed();
3725 break;
3726 case GL_TEXTURE_SWIZZLE_G:
3727 if (context->getClientVersion() < 3)
3728 {
3729 return gl::error(GL_INVALID_ENUM);
3730 }
3731 *params = texture->getSwizzleGreen();
3732 break;
3733 case GL_TEXTURE_SWIZZLE_B:
3734 if (context->getClientVersion() < 3)
3735 {
3736 return gl::error(GL_INVALID_ENUM);
3737 }
3738 *params = texture->getSwizzleBlue();
3739 break;
3740 case GL_TEXTURE_SWIZZLE_A:
3741 if (context->getClientVersion() < 3)
3742 {
3743 return gl::error(GL_INVALID_ENUM);
3744 }
3745 *params = texture->getSwizzleAlpha();
3746 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003747
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003748 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003749 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003750 }
3751 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003752 }
3753 catch(std::bad_alloc&)
3754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003755 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003756 }
3757}
3758
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003759void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3760{
3761 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3762 program, location, bufSize, params);
3763
3764 try
3765 {
3766 if (bufSize < 0)
3767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003768 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003769 }
3770
3771 gl::Context *context = gl::getNonLostContext();
3772
3773 if (context)
3774 {
3775 if (program == 0)
3776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003777 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003778 }
3779
3780 gl::Program *programObject = context->getProgram(program);
3781
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003782 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003784 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003785 }
3786
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003787 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3788 if (!programBinary)
3789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003790 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003791 }
3792
3793 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003795 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003796 }
3797 }
3798 }
3799 catch(std::bad_alloc&)
3800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003801 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003802 }
3803}
3804
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003805void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3806{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003807 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003808
3809 try
3810 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003811 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003812
3813 if (context)
3814 {
3815 if (program == 0)
3816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003817 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003818 }
3819
3820 gl::Program *programObject = context->getProgram(program);
3821
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003822 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003824 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003825 }
3826
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003827 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3828 if (!programBinary)
3829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003830 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003831 }
3832
3833 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003835 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003836 }
3837 }
3838 }
3839 catch(std::bad_alloc&)
3840 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003841 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003842 }
3843}
3844
3845void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3846{
3847 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3848 program, location, bufSize, params);
3849
3850 try
3851 {
3852 if (bufSize < 0)
3853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003854 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003855 }
3856
3857 gl::Context *context = gl::getNonLostContext();
3858
3859 if (context)
3860 {
3861 if (program == 0)
3862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003863 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003864 }
3865
3866 gl::Program *programObject = context->getProgram(program);
3867
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003868 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003870 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003871 }
3872
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003873 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3874 if (!programBinary)
3875 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003876 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003877 }
3878
3879 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003880 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003881 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003882 }
3883 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003884 }
3885 catch(std::bad_alloc&)
3886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003887 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003888 }
3889}
3890
3891void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3892{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003893 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003894
3895 try
3896 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003897 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003898
3899 if (context)
3900 {
3901 if (program == 0)
3902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003903 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003904 }
3905
3906 gl::Program *programObject = context->getProgram(program);
3907
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003908 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003910 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003911 }
3912
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003913 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3914 if (!programBinary)
3915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003916 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003917 }
3918
3919 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003921 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003922 }
3923 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003924 }
3925 catch(std::bad_alloc&)
3926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003927 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003928 }
3929}
3930
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003931int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003932{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003933 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003934
3935 try
3936 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003937 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003938
3939 if (strstr(name, "gl_") == name)
3940 {
3941 return -1;
3942 }
3943
3944 if (context)
3945 {
3946 gl::Program *programObject = context->getProgram(program);
3947
3948 if (!programObject)
3949 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003950 if (context->getShader(program))
3951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003952 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003953 }
3954 else
3955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003956 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003957 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003958 }
3959
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003960 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003961 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003963 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003964 }
3965
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003966 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003967 }
3968 }
3969 catch(std::bad_alloc&)
3970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003971 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003972 }
3973
3974 return -1;
3975}
3976
3977void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3978{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003979 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003980
3981 try
3982 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003983 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003984
daniel@transgaming.come0078962010-04-15 20:45:08 +00003985 if (context)
3986 {
3987 if (index >= gl::MAX_VERTEX_ATTRIBS)
3988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003989 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003990 }
3991
daniel@transgaming.com83921382011-01-08 05:46:00 +00003992 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003993
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003994 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003995 {
Jamie Madillaff71502013-07-02 11:57:05 -04003996 return;
3997 }
3998
3999 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4000 {
4001 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4002 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004003 {
Jamie Madillaff71502013-07-02 11:57:05 -04004004 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004005 }
Jamie Madillaff71502013-07-02 11:57:05 -04004006 }
4007 else
4008 {
4009 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004010 }
4011 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004012 }
4013 catch(std::bad_alloc&)
4014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004015 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004016 }
4017}
4018
4019void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4020{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004021 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004022
4023 try
4024 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004025 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004026
daniel@transgaming.come0078962010-04-15 20:45:08 +00004027 if (context)
4028 {
4029 if (index >= gl::MAX_VERTEX_ATTRIBS)
4030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004031 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004032 }
4033
daniel@transgaming.com83921382011-01-08 05:46:00 +00004034 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004035
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004036 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004037 {
Jamie Madillaff71502013-07-02 11:57:05 -04004038 return;
4039 }
4040
4041 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4042 {
4043 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4044 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004045 {
Jamie Madillaff71502013-07-02 11:57:05 -04004046 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04004047 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004048 }
Jamie Madillaff71502013-07-02 11:57:05 -04004049 }
4050 else
4051 {
4052 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004053 }
4054 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004055 }
4056 catch(std::bad_alloc&)
4057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004058 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004059 }
4060}
4061
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004062void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004063{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004064 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004065
4066 try
4067 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004068 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004069
daniel@transgaming.come0078962010-04-15 20:45:08 +00004070 if (context)
4071 {
4072 if (index >= gl::MAX_VERTEX_ATTRIBS)
4073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004074 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004075 }
4076
4077 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004079 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004080 }
4081
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004082 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004083 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004084 }
4085 catch(std::bad_alloc&)
4086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004087 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004088 }
4089}
4090
4091void __stdcall glHint(GLenum target, GLenum mode)
4092{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004093 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004094
4095 try
4096 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004097 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004098 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004099 case GL_FASTEST:
4100 case GL_NICEST:
4101 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004102 break;
4103 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004104 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004105 }
4106
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004107 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004108 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004109 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004110 case GL_GENERATE_MIPMAP_HINT:
4111 if (context) context->setGenerateMipmapHint(mode);
4112 break;
4113 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4114 if (context) context->setFragmentShaderDerivativeHint(mode);
4115 break;
4116 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004117 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004118 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004119 }
4120 catch(std::bad_alloc&)
4121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004122 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004123 }
4124}
4125
4126GLboolean __stdcall glIsBuffer(GLuint buffer)
4127{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004128 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004129
4130 try
4131 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004132 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004133
4134 if (context && buffer)
4135 {
4136 gl::Buffer *bufferObject = context->getBuffer(buffer);
4137
4138 if (bufferObject)
4139 {
4140 return GL_TRUE;
4141 }
4142 }
4143 }
4144 catch(std::bad_alloc&)
4145 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004146 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004147 }
4148
4149 return GL_FALSE;
4150}
4151
4152GLboolean __stdcall glIsEnabled(GLenum cap)
4153{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004154 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004155
4156 try
4157 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004158 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004159
4160 if (context)
4161 {
4162 switch (cap)
4163 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004164 case GL_CULL_FACE: return context->isCullFaceEnabled();
4165 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4166 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4167 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4168 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4169 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4170 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4171 case GL_BLEND: return context->isBlendEnabled();
4172 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004173 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004174 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004175 }
4176 }
4177 }
4178 catch(std::bad_alloc&)
4179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004180 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004181 }
4182
4183 return false;
4184}
4185
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004186GLboolean __stdcall glIsFenceNV(GLuint fence)
4187{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004188 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004189
4190 try
4191 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004192 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004193
4194 if (context)
4195 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004196 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004197
4198 if (fenceObject == NULL)
4199 {
4200 return GL_FALSE;
4201 }
4202
4203 return fenceObject->isFence();
4204 }
4205 }
4206 catch(std::bad_alloc&)
4207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004208 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004209 }
4210
4211 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004212}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004213
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004214GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004216 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004217
4218 try
4219 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004220 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004221
4222 if (context && framebuffer)
4223 {
4224 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4225
4226 if (framebufferObject)
4227 {
4228 return GL_TRUE;
4229 }
4230 }
4231 }
4232 catch(std::bad_alloc&)
4233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004234 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004235 }
4236
4237 return GL_FALSE;
4238}
4239
4240GLboolean __stdcall glIsProgram(GLuint program)
4241{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004242 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004243
4244 try
4245 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004246 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004247
4248 if (context && program)
4249 {
4250 gl::Program *programObject = context->getProgram(program);
4251
4252 if (programObject)
4253 {
4254 return GL_TRUE;
4255 }
4256 }
4257 }
4258 catch(std::bad_alloc&)
4259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004260 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004261 }
4262
4263 return GL_FALSE;
4264}
4265
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004266GLboolean __stdcall glIsQueryEXT(GLuint id)
4267{
4268 EVENT("(GLuint id = %d)", id);
4269
4270 try
4271 {
4272 if (id == 0)
4273 {
4274 return GL_FALSE;
4275 }
4276
4277 gl::Context *context = gl::getNonLostContext();
4278
4279 if (context)
4280 {
4281 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4282
4283 if (queryObject)
4284 {
4285 return GL_TRUE;
4286 }
4287 }
4288 }
4289 catch(std::bad_alloc&)
4290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004291 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004292 }
4293
4294 return GL_FALSE;
4295}
4296
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004297GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4298{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004299 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004300
4301 try
4302 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004303 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004304
4305 if (context && renderbuffer)
4306 {
4307 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4308
4309 if (renderbufferObject)
4310 {
4311 return GL_TRUE;
4312 }
4313 }
4314 }
4315 catch(std::bad_alloc&)
4316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004317 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004318 }
4319
4320 return GL_FALSE;
4321}
4322
4323GLboolean __stdcall glIsShader(GLuint shader)
4324{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004325 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004326
4327 try
4328 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004329 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004330
4331 if (context && shader)
4332 {
4333 gl::Shader *shaderObject = context->getShader(shader);
4334
4335 if (shaderObject)
4336 {
4337 return GL_TRUE;
4338 }
4339 }
4340 }
4341 catch(std::bad_alloc&)
4342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004343 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004344 }
4345
4346 return GL_FALSE;
4347}
4348
4349GLboolean __stdcall glIsTexture(GLuint texture)
4350{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004351 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004352
4353 try
4354 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004355 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004356
4357 if (context && texture)
4358 {
4359 gl::Texture *textureObject = context->getTexture(texture);
4360
4361 if (textureObject)
4362 {
4363 return GL_TRUE;
4364 }
4365 }
4366 }
4367 catch(std::bad_alloc&)
4368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004369 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004370 }
4371
4372 return GL_FALSE;
4373}
4374
4375void __stdcall glLineWidth(GLfloat width)
4376{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004377 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004378
4379 try
4380 {
4381 if (width <= 0.0f)
4382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004383 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004384 }
4385
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004386 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004387
4388 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004389 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004390 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004391 }
4392 }
4393 catch(std::bad_alloc&)
4394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004396 }
4397}
4398
4399void __stdcall glLinkProgram(GLuint program)
4400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004401 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004402
4403 try
4404 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004405 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004406
4407 if (context)
4408 {
4409 gl::Program *programObject = context->getProgram(program);
4410
4411 if (!programObject)
4412 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004413 if (context->getShader(program))
4414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004415 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004416 }
4417 else
4418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004419 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004420 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004421 }
4422
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004423 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004424 }
4425 }
4426 catch(std::bad_alloc&)
4427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004428 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004429 }
4430}
4431
4432void __stdcall glPixelStorei(GLenum pname, GLint param)
4433{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004434 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004435
4436 try
4437 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004438 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004439
4440 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004441 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004442 switch (pname)
4443 {
4444 case GL_UNPACK_ALIGNMENT:
4445 if (param != 1 && param != 2 && param != 4 && param != 8)
4446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004447 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004448 }
4449
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004450 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004451 break;
4452
4453 case GL_PACK_ALIGNMENT:
4454 if (param != 1 && param != 2 && param != 4 && param != 8)
4455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004456 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004457 }
4458
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004459 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004460 break;
4461
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004462 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4463 context->setPackReverseRowOrder(param != 0);
4464 break;
4465
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004466 case GL_UNPACK_IMAGE_HEIGHT:
4467 case GL_UNPACK_SKIP_IMAGES:
4468 case GL_UNPACK_ROW_LENGTH:
4469 case GL_UNPACK_SKIP_ROWS:
4470 case GL_UNPACK_SKIP_PIXELS:
4471 case GL_PACK_ROW_LENGTH:
4472 case GL_PACK_SKIP_ROWS:
4473 case GL_PACK_SKIP_PIXELS:
4474 if (context->getClientVersion() < 3)
4475 {
4476 return gl::error(GL_INVALID_ENUM);
4477 }
4478 UNIMPLEMENTED();
4479 break;
4480
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004481 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004482 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004483 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004484 }
4485 }
4486 catch(std::bad_alloc&)
4487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004488 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489 }
4490}
4491
4492void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4493{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004494 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004495
4496 try
4497 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004498 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004499
4500 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004501 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004502 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004503 }
4504 }
4505 catch(std::bad_alloc&)
4506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004507 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004508 }
4509}
4510
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004511void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4512 GLenum format, GLenum type, GLsizei bufSize,
4513 GLvoid *data)
4514{
4515 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4516 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4517 x, y, width, height, format, type, bufSize, data);
4518
4519 try
4520 {
4521 if (width < 0 || height < 0 || bufSize < 0)
4522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004523 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004524 }
4525
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004526 gl::Context *context = gl::getNonLostContext();
4527
4528 if (context)
4529 {
Geoff Lang005df412013-10-16 14:12:50 -04004530 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004531
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004532 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4533 // and attempting to read back if that's the case is an error. The error will be registered
4534 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004535 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004536 return;
4537
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004538 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4539 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004540
4541 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004543 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004544 }
4545
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004546 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4547 }
4548 }
4549 catch(std::bad_alloc&)
4550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004551 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004552 }
4553}
4554
4555void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4556 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004557{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004558 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004559 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004560 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004561
4562 try
4563 {
4564 if (width < 0 || height < 0)
4565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004566 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004567 }
4568
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004569 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004570
4571 if (context)
4572 {
Geoff Lang005df412013-10-16 14:12:50 -04004573 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004574
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004575 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4576 // and attempting to read back if that's the case is an error. The error will be registered
4577 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004578 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004579 return;
4580
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004581 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4582 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004583
4584 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004586 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004587 }
4588
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004589 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004590 }
4591 }
4592 catch(std::bad_alloc&)
4593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004594 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004595 }
4596}
4597
4598void __stdcall glReleaseShaderCompiler(void)
4599{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004600 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004601
4602 try
4603 {
4604 gl::Shader::releaseCompiler();
4605 }
4606 catch(std::bad_alloc&)
4607 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004608 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004609 }
4610}
4611
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004612void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004613{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004614 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 +00004615 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004616
4617 try
4618 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004619 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004620
4621 if (context)
4622 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004623 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004624 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004625 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004626 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004627 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004628
4629 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004630 }
4631 }
4632 catch(std::bad_alloc&)
4633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004634 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004635 }
4636}
4637
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004638void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4639{
4640 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4641}
4642
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004643void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4644{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004645 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004646
4647 try
4648 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004649 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004650
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004651 if (context)
4652 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004653 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004654 }
4655 }
4656 catch(std::bad_alloc&)
4657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004658 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004659 }
4660}
4661
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004662void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4663{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004664 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004665
4666 try
4667 {
4668 if (condition != GL_ALL_COMPLETED_NV)
4669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004670 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004671 }
4672
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004673 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004674
4675 if (context)
4676 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004677 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004678
4679 if (fenceObject == NULL)
4680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004681 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004682 }
4683
4684 fenceObject->setFence(condition);
4685 }
4686 }
4687 catch(std::bad_alloc&)
4688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004689 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004690 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004691}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004692
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004693void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4694{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004695 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 +00004696
4697 try
4698 {
4699 if (width < 0 || height < 0)
4700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004701 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004702 }
4703
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004704 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004705
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004706 if (context)
4707 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004708 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004709 }
4710 }
4711 catch(std::bad_alloc&)
4712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004713 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004714 }
4715}
4716
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004717void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004718{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004719 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004720 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004721 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004722
4723 try
4724 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004725 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004726 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004727 }
4728 catch(std::bad_alloc&)
4729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004730 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004731 }
4732}
4733
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004734void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004735{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004736 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 +00004737 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004738
4739 try
4740 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004741 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004743 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004744 }
4745
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004746 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004747
4748 if (context)
4749 {
4750 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004751
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004752 if (!shaderObject)
4753 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004754 if (context->getProgram(shader))
4755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004756 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004757 }
4758 else
4759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004760 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004761 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004762 }
4763
4764 shaderObject->setSource(count, string, length);
4765 }
4766 }
4767 catch(std::bad_alloc&)
4768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004769 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004770 }
4771}
4772
4773void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4774{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004775 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004776}
4777
4778void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4779{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004780 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 +00004781
4782 try
4783 {
4784 switch (face)
4785 {
4786 case GL_FRONT:
4787 case GL_BACK:
4788 case GL_FRONT_AND_BACK:
4789 break;
4790 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004791 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004792 }
4793
4794 switch (func)
4795 {
4796 case GL_NEVER:
4797 case GL_ALWAYS:
4798 case GL_LESS:
4799 case GL_LEQUAL:
4800 case GL_EQUAL:
4801 case GL_GEQUAL:
4802 case GL_GREATER:
4803 case GL_NOTEQUAL:
4804 break;
4805 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004806 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004807 }
4808
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004809 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004810
4811 if (context)
4812 {
4813 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4814 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004815 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004816 }
4817
4818 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4819 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004820 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004821 }
4822 }
4823 }
4824 catch(std::bad_alloc&)
4825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004826 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004827 }
4828}
4829
4830void __stdcall glStencilMask(GLuint mask)
4831{
4832 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4833}
4834
4835void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4836{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004837 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004838
4839 try
4840 {
4841 switch (face)
4842 {
4843 case GL_FRONT:
4844 case GL_BACK:
4845 case GL_FRONT_AND_BACK:
4846 break;
4847 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004848 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004849 }
4850
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004851 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004852
4853 if (context)
4854 {
4855 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4856 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004857 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004858 }
4859
4860 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4861 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004862 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004863 }
4864 }
4865 }
4866 catch(std::bad_alloc&)
4867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004868 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004869 }
4870}
4871
4872void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4873{
4874 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4875}
4876
4877void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4878{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004879 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 +00004880 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004881
4882 try
4883 {
4884 switch (face)
4885 {
4886 case GL_FRONT:
4887 case GL_BACK:
4888 case GL_FRONT_AND_BACK:
4889 break;
4890 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004891 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004892 }
4893
4894 switch (fail)
4895 {
4896 case GL_ZERO:
4897 case GL_KEEP:
4898 case GL_REPLACE:
4899 case GL_INCR:
4900 case GL_DECR:
4901 case GL_INVERT:
4902 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004903 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004904 break;
4905 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004906 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004907 }
4908
4909 switch (zfail)
4910 {
4911 case GL_ZERO:
4912 case GL_KEEP:
4913 case GL_REPLACE:
4914 case GL_INCR:
4915 case GL_DECR:
4916 case GL_INVERT:
4917 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004918 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004919 break;
4920 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004921 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004922 }
4923
4924 switch (zpass)
4925 {
4926 case GL_ZERO:
4927 case GL_KEEP:
4928 case GL_REPLACE:
4929 case GL_INCR:
4930 case GL_DECR:
4931 case GL_INVERT:
4932 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004933 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004934 break;
4935 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004936 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004937 }
4938
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004939 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004940
4941 if (context)
4942 {
4943 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4944 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004945 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004946 }
4947
4948 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4949 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004950 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004951 }
4952 }
4953 }
4954 catch(std::bad_alloc&)
4955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004956 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004957 }
4958}
4959
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004960GLboolean __stdcall glTestFenceNV(GLuint fence)
4961{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004962 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004963
4964 try
4965 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004966 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004967
4968 if (context)
4969 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004970 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004971
4972 if (fenceObject == NULL)
4973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004974 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004975 }
4976
Jamie Madillfb9a7402013-07-26 11:55:01 -04004977 if (fenceObject->isFence() != GL_TRUE)
4978 {
4979 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4980 }
4981
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004982 return fenceObject->testFence();
4983 }
4984 }
4985 catch(std::bad_alloc&)
4986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004987 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004988 }
4989
4990 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004991}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004992
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004993void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4994 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004995{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004996 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 +00004997 "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 +00004998 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004999
5000 try
5001 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005002 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005003
5004 if (context)
5005 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005006 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005007 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005008 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005009 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005010 return;
5011 }
5012
5013 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005014 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005015 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005016 {
5017 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005018 }
5019
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005020 switch (target)
5021 {
5022 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005023 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005024 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005025 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005026 }
5027 break;
5028 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005029 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005030 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005031 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005032 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005033 break;
5034 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5035 {
5036 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005037 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005038 }
5039 break;
5040 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5041 {
5042 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005043 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005044 }
5045 break;
5046 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5047 {
5048 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005049 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005050 }
5051 break;
5052 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5053 {
5054 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005055 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005056 }
5057 break;
5058 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5059 {
5060 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005061 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005062 }
5063 break;
5064 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005065 }
5066 }
5067 }
5068 catch(std::bad_alloc&)
5069 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005070 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005071 }
5072}
5073
5074void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5075{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005076 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5077
5078 try
5079 {
5080 gl::Context *context = gl::getNonLostContext();
5081
5082 if (context)
5083 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005084 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04005085 {
5086 return;
5087 }
5088
Jamie Madill35d15012013-10-07 10:46:37 -04005089 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005090
Jamie Madillfb8a8302013-07-03 14:24:12 -04005091 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005093 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005094 }
5095
5096 switch (pname)
5097 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005098 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5099 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5100 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5101 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5102 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5103 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
5104 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
5105 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5106 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005107 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
5108 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
5109 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
5110 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005111
Jamie Madill478fdb22013-07-19 16:36:59 -04005112 case GL_TEXTURE_BASE_LEVEL:
5113 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005114 case GL_TEXTURE_MIN_LOD:
5115 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005116 UNIMPLEMENTED();
5117 break;
5118
Jamie Madill478fdb22013-07-19 16:36:59 -04005119 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005120 }
5121 }
5122 }
5123 catch(std::bad_alloc&)
5124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005125 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005126 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005127}
5128
5129void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5130{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005131 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005132}
5133
5134void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005136 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005137
5138 try
5139 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005140 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005141
5142 if (context)
5143 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005144 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005145 {
5146 return;
5147 }
5148
Jamie Madill35d15012013-10-07 10:46:37 -04005149 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005150
Jamie Madillfb8a8302013-07-03 14:24:12 -04005151 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005153 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005154 }
5155
5156 switch (pname)
5157 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005158 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5159 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5160 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5161 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5162 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5163 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5164 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5165 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5166 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005167 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5168 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5169 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5170 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005171
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005172 case GL_TEXTURE_BASE_LEVEL:
5173 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005174 case GL_TEXTURE_MIN_LOD:
5175 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005176 UNIMPLEMENTED();
5177 break;
5178
Jamie Madill478fdb22013-07-19 16:36:59 -04005179 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005180 }
5181 }
5182 }
5183 catch(std::bad_alloc&)
5184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005185 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005186 }
5187}
5188
5189void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5190{
5191 glTexParameteri(target, pname, *params);
5192}
5193
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005194void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5195{
5196 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5197 target, levels, internalformat, width, height);
5198
5199 try
5200 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005201 gl::Context *context = gl::getNonLostContext();
5202
5203 if (context)
5204 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005205 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005206 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005207 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005208 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005209 }
5210
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005211 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005212 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005213 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005214 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005215 }
5216
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005217 switch (target)
5218 {
5219 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005220 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005221 gl::Texture2D *texture2d = context->getTexture2D();
5222 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005223 }
5224 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005225
Geoff Lang01c21d22013-09-24 11:52:16 -04005226 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005227 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005228 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5229 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005230 }
5231 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005232
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005233 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005234 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005235 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005236 }
5237 }
5238 catch(std::bad_alloc&)
5239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005240 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005241 }
5242}
5243
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005244void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5245 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005246{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005247 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005248 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005249 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005250 target, level, xoffset, yoffset, width, height, format, type, pixels);
5251
5252 try
5253 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005254 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005255
5256 if (context)
5257 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005258 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005259 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005260 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005261 {
5262 return;
5263 }
5264
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005265 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005266 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005267 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005268 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005269 return;
5270 }
5271
5272 switch (target)
5273 {
5274 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005275 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005276 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005277 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005278 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005279 break;
5280
5281 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5282 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5283 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5284 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5285 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5286 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005287 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005288 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005289 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005290 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005291 break;
5292
5293 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005294 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005295 }
5296 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005297 }
5298 catch(std::bad_alloc&)
5299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005300 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005301 }
5302}
5303
5304void __stdcall glUniform1f(GLint location, GLfloat x)
5305{
5306 glUniform1fv(location, 1, &x);
5307}
5308
5309void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5310{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005311 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005312
5313 try
5314 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005315 if (count < 0)
5316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005317 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005318 }
5319
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005320 if (location == -1)
5321 {
5322 return;
5323 }
5324
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005325 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005326
5327 if (context)
5328 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005329 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005330 if (!programBinary)
5331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005332 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005333 }
5334
5335 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005337 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005338 }
5339 }
5340 }
5341 catch(std::bad_alloc&)
5342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005343 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005344 }
5345}
5346
5347void __stdcall glUniform1i(GLint location, GLint x)
5348{
5349 glUniform1iv(location, 1, &x);
5350}
5351
5352void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5353{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005354 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005355
5356 try
5357 {
5358 if (count < 0)
5359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005360 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005361 }
5362
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005363 if (location == -1)
5364 {
5365 return;
5366 }
5367
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005368 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005369
5370 if (context)
5371 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005372 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005373 if (!programBinary)
5374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005375 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005376 }
5377
5378 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005380 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005381 }
5382 }
5383 }
5384 catch(std::bad_alloc&)
5385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005386 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005387 }
5388}
5389
5390void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5391{
5392 GLfloat xy[2] = {x, y};
5393
5394 glUniform2fv(location, 1, (GLfloat*)&xy);
5395}
5396
5397void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5398{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005399 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005400
5401 try
5402 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005403 if (count < 0)
5404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005405 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005406 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005407
5408 if (location == -1)
5409 {
5410 return;
5411 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005412
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005413 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005414
5415 if (context)
5416 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005417 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005418 if (!programBinary)
5419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005420 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005421 }
5422
5423 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005425 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005426 }
5427 }
5428 }
5429 catch(std::bad_alloc&)
5430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005431 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005432 }
5433}
5434
5435void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5436{
5437 GLint xy[4] = {x, y};
5438
5439 glUniform2iv(location, 1, (GLint*)&xy);
5440}
5441
5442void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5443{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005444 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005445
5446 try
5447 {
5448 if (count < 0)
5449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005450 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005451 }
5452
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005453 if (location == -1)
5454 {
5455 return;
5456 }
5457
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005458 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005459
5460 if (context)
5461 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005462 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005463 if (!programBinary)
5464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005465 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005466 }
5467
5468 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005470 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005471 }
5472 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005473 }
5474 catch(std::bad_alloc&)
5475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005476 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005477 }
5478}
5479
5480void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5481{
5482 GLfloat xyz[3] = {x, y, z};
5483
5484 glUniform3fv(location, 1, (GLfloat*)&xyz);
5485}
5486
5487void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5488{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005489 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005490
5491 try
5492 {
5493 if (count < 0)
5494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005495 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005496 }
5497
5498 if (location == -1)
5499 {
5500 return;
5501 }
5502
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005503 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005504
5505 if (context)
5506 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005507 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005508 if (!programBinary)
5509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005510 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005511 }
5512
5513 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005516 }
5517 }
5518 }
5519 catch(std::bad_alloc&)
5520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005521 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005522 }
5523}
5524
5525void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5526{
5527 GLint xyz[3] = {x, y, z};
5528
5529 glUniform3iv(location, 1, (GLint*)&xyz);
5530}
5531
5532void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5533{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005534 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005535
5536 try
5537 {
5538 if (count < 0)
5539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005540 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005541 }
5542
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005543 if (location == -1)
5544 {
5545 return;
5546 }
5547
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005548 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005549
5550 if (context)
5551 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005552 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005553 if (!programBinary)
5554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005555 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005556 }
5557
5558 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005560 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005561 }
5562 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005563 }
5564 catch(std::bad_alloc&)
5565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005566 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005567 }
5568}
5569
5570void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5571{
5572 GLfloat xyzw[4] = {x, y, z, w};
5573
5574 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5575}
5576
5577void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5578{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005579 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005580
5581 try
5582 {
5583 if (count < 0)
5584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005585 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005586 }
5587
5588 if (location == -1)
5589 {
5590 return;
5591 }
5592
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005593 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005594
5595 if (context)
5596 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005597 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005598 if (!programBinary)
5599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005600 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005601 }
5602
5603 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005605 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005606 }
5607 }
5608 }
5609 catch(std::bad_alloc&)
5610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005611 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005612 }
5613}
5614
5615void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5616{
5617 GLint xyzw[4] = {x, y, z, w};
5618
5619 glUniform4iv(location, 1, (GLint*)&xyzw);
5620}
5621
5622void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5623{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005624 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005625
5626 try
5627 {
5628 if (count < 0)
5629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005630 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005631 }
5632
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005633 if (location == -1)
5634 {
5635 return;
5636 }
5637
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005638 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005639
5640 if (context)
5641 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005642 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005643 if (!programBinary)
5644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005645 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005646 }
5647
5648 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005650 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005651 }
5652 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005653 }
5654 catch(std::bad_alloc&)
5655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005656 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005657 }
5658}
5659
5660void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5661{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005662 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005663 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005664
5665 try
5666 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005667 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005669 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005670 }
5671
5672 if (location == -1)
5673 {
5674 return;
5675 }
5676
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005677 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005678
5679 if (context)
5680 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005681 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5682 {
5683 return gl::error(GL_INVALID_VALUE);
5684 }
5685
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005686 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005687 if (!programBinary)
5688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005689 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005690 }
5691
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005692 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005694 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005695 }
5696 }
5697 }
5698 catch(std::bad_alloc&)
5699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005700 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005701 }
5702}
5703
5704void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5705{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005706 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005707 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005708
5709 try
5710 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005711 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005713 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005714 }
5715
5716 if (location == -1)
5717 {
5718 return;
5719 }
5720
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005721 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005722
5723 if (context)
5724 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005725 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5726 {
5727 return gl::error(GL_INVALID_VALUE);
5728 }
5729
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005730 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005731 if (!programBinary)
5732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005733 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005734 }
5735
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005736 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005738 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005739 }
5740 }
5741 }
5742 catch(std::bad_alloc&)
5743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005744 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005745 }
5746}
5747
5748void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5749{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005750 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005751 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005752
5753 try
5754 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005755 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005757 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005758 }
5759
5760 if (location == -1)
5761 {
5762 return;
5763 }
5764
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005765 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005766
5767 if (context)
5768 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005769 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5770 {
5771 return gl::error(GL_INVALID_VALUE);
5772 }
5773
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005774 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005775 if (!programBinary)
5776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005777 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005778 }
5779
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005780 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005781 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005782 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005783 }
5784 }
5785 }
5786 catch(std::bad_alloc&)
5787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005788 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005789 }
5790}
5791
5792void __stdcall glUseProgram(GLuint program)
5793{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005794 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005795
5796 try
5797 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005798 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005799
5800 if (context)
5801 {
5802 gl::Program *programObject = context->getProgram(program);
5803
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005804 if (!programObject && program != 0)
5805 {
5806 if (context->getShader(program))
5807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005808 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005809 }
5810 else
5811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005812 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005813 }
5814 }
5815
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005816 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005818 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005819 }
5820
5821 context->useProgram(program);
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 glValidateProgram(GLuint program)
5831{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005832 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005833
5834 try
5835 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005836 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005837
5838 if (context)
5839 {
5840 gl::Program *programObject = context->getProgram(program);
5841
5842 if (!programObject)
5843 {
5844 if (context->getShader(program))
5845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005846 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005847 }
5848 else
5849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005850 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005851 }
5852 }
5853
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005854 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005855 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005856 }
5857 catch(std::bad_alloc&)
5858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005859 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005860 }
5861}
5862
5863void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5864{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005865 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005866
5867 try
5868 {
5869 if (index >= gl::MAX_VERTEX_ATTRIBS)
5870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005871 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005872 }
5873
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005874 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005875
5876 if (context)
5877 {
5878 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005879 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005880 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005881 }
5882 catch(std::bad_alloc&)
5883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005884 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005885 }
5886}
5887
5888void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5889{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005890 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005891
5892 try
5893 {
5894 if (index >= gl::MAX_VERTEX_ATTRIBS)
5895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005896 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005897 }
5898
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005899 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005900
5901 if (context)
5902 {
5903 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005904 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005905 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005906 }
5907 catch(std::bad_alloc&)
5908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005909 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005910 }
5911}
5912
5913void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5914{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005915 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005916
5917 try
5918 {
5919 if (index >= gl::MAX_VERTEX_ATTRIBS)
5920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005921 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005922 }
5923
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005924 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005925
5926 if (context)
5927 {
5928 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005929 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005930 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005931 }
5932 catch(std::bad_alloc&)
5933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005934 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005935 }
5936}
5937
5938void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5939{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005940 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005941
5942 try
5943 {
5944 if (index >= gl::MAX_VERTEX_ATTRIBS)
5945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005946 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005947 }
5948
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005949 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005950
5951 if (context)
5952 {
5953 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005954 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005955 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005956 }
5957 catch(std::bad_alloc&)
5958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005959 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005960 }
5961}
5962
5963void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5964{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005965 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 +00005966
5967 try
5968 {
5969 if (index >= gl::MAX_VERTEX_ATTRIBS)
5970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005971 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005972 }
5973
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005974 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005975
5976 if (context)
5977 {
5978 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005979 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005980 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005981 }
5982 catch(std::bad_alloc&)
5983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005984 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005985 }
5986}
5987
5988void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5989{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005990 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005991
5992 try
5993 {
5994 if (index >= gl::MAX_VERTEX_ATTRIBS)
5995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005996 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005997 }
5998
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005999 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006000
6001 if (context)
6002 {
6003 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006004 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006005 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006006 }
6007 catch(std::bad_alloc&)
6008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006009 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006010 }
6011}
6012
6013void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6014{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006015 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 +00006016
6017 try
6018 {
6019 if (index >= gl::MAX_VERTEX_ATTRIBS)
6020 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006021 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006022 }
6023
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006024 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006025
6026 if (context)
6027 {
6028 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006029 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006030 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006031 }
6032 catch(std::bad_alloc&)
6033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006034 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006035 }
6036}
6037
6038void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6039{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006040 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006041
6042 try
6043 {
6044 if (index >= gl::MAX_VERTEX_ATTRIBS)
6045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006046 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006047 }
6048
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006049 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006050
6051 if (context)
6052 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006053 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006054 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006055 }
6056 catch(std::bad_alloc&)
6057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006058 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006059 }
6060}
6061
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006062void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6063{
6064 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6065
6066 try
6067 {
6068 if (index >= gl::MAX_VERTEX_ATTRIBS)
6069 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006070 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006071 }
6072
6073 gl::Context *context = gl::getNonLostContext();
6074
6075 if (context)
6076 {
6077 context->setVertexAttribDivisor(index, divisor);
6078 }
6079 }
6080 catch(std::bad_alloc&)
6081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006082 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006083 }
6084}
6085
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006086void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006087{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006088 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006089 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006090 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006091
6092 try
6093 {
6094 if (index >= gl::MAX_VERTEX_ATTRIBS)
6095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006096 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006097 }
6098
6099 if (size < 1 || size > 4)
6100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006101 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006102 }
6103
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006104 gl::Context *context = gl::getNonLostContext();
6105
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006106 switch (type)
6107 {
6108 case GL_BYTE:
6109 case GL_UNSIGNED_BYTE:
6110 case GL_SHORT:
6111 case GL_UNSIGNED_SHORT:
6112 case GL_FIXED:
6113 case GL_FLOAT:
6114 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006115 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006116 case GL_INT:
6117 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006118 case GL_INT_2_10_10_10_REV:
6119 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006120 if (context && context->getClientVersion() < 3)
6121 {
6122 return gl::error(GL_INVALID_ENUM);
6123 }
6124 else
6125 {
6126 break;
6127 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006128 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006129 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006130 }
6131
6132 if (stride < 0)
6133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006134 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006135 }
6136
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006137 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6138 {
6139 return gl::error(GL_INVALID_OPERATION);
6140 }
6141
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006142 if (context)
6143 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006144 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6145 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6146 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6147 // and the pointer argument is not NULL.
6148 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6149 {
6150 return gl::error(GL_INVALID_OPERATION);
6151 }
6152
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006153 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6154 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006155 }
6156 }
6157 catch(std::bad_alloc&)
6158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006159 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006160 }
6161}
6162
6163void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6164{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006165 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 +00006166
6167 try
6168 {
6169 if (width < 0 || height < 0)
6170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006171 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006172 }
6173
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006174 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006175
6176 if (context)
6177 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006178 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006179 }
6180 }
6181 catch(std::bad_alloc&)
6182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006183 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006184 }
6185}
6186
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006187// OpenGL ES 3.0 functions
6188
6189void __stdcall glReadBuffer(GLenum mode)
6190{
6191 EVENT("(GLenum mode = 0x%X)", mode);
6192
6193 try
6194 {
6195 gl::Context *context = gl::getNonLostContext();
6196
6197 if (context)
6198 {
6199 if (context->getClientVersion() < 3)
6200 {
6201 return gl::error(GL_INVALID_OPERATION);
6202 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006203
Jamie Madill54133512013-06-21 09:33:07 -04006204 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006205 UNIMPLEMENTED();
6206 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006207 }
6208 catch(std::bad_alloc&)
6209 {
6210 return gl::error(GL_OUT_OF_MEMORY);
6211 }
6212}
6213
6214void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6215{
6216 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6217 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6218
6219 try
6220 {
6221 gl::Context *context = gl::getNonLostContext();
6222
6223 if (context)
6224 {
6225 if (context->getClientVersion() < 3)
6226 {
6227 return gl::error(GL_INVALID_OPERATION);
6228 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006229
Jamie Madill54133512013-06-21 09:33:07 -04006230 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006231 UNIMPLEMENTED();
6232 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006233 }
6234 catch(std::bad_alloc&)
6235 {
6236 return gl::error(GL_OUT_OF_MEMORY);
6237 }
6238}
6239
6240void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6241{
6242 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6243 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6244 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6245 target, level, internalformat, width, height, depth, border, format, type, pixels);
6246
6247 try
6248 {
6249 gl::Context *context = gl::getNonLostContext();
6250
6251 if (context)
6252 {
6253 if (context->getClientVersion() < 3)
6254 {
6255 return gl::error(GL_INVALID_OPERATION);
6256 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006257
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006258 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006259 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006260 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006261 {
6262 return;
6263 }
6264
6265 switch(target)
6266 {
6267 case GL_TEXTURE_3D:
6268 {
6269 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006270 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006271 }
6272 break;
6273
6274 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006275 {
6276 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006277 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006278 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006279 break;
6280
6281 default:
6282 return gl::error(GL_INVALID_ENUM);
6283 }
6284 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006285 }
6286 catch(std::bad_alloc&)
6287 {
6288 return gl::error(GL_OUT_OF_MEMORY);
6289 }
6290}
6291
6292void __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)
6293{
6294 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6295 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6296 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6297 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6298
6299 try
6300 {
6301 gl::Context *context = gl::getNonLostContext();
6302
6303 if (context)
6304 {
6305 if (context->getClientVersion() < 3)
6306 {
6307 return gl::error(GL_INVALID_OPERATION);
6308 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006309
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006310 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006311 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006312 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006313 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006314 {
6315 return;
6316 }
6317
6318 switch(target)
6319 {
6320 case GL_TEXTURE_3D:
6321 {
6322 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006323 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 +00006324 }
6325 break;
6326
6327 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006328 {
6329 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006330 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 +00006331 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006332 break;
6333
6334 default:
6335 return gl::error(GL_INVALID_ENUM);
6336 }
6337 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006338 }
6339 catch(std::bad_alloc&)
6340 {
6341 return gl::error(GL_OUT_OF_MEMORY);
6342 }
6343}
6344
6345void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6346{
6347 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6348 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6349 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6350
6351 try
6352 {
6353 gl::Context *context = gl::getNonLostContext();
6354
6355 if (context)
6356 {
6357 if (context->getClientVersion() < 3)
6358 {
6359 return gl::error(GL_INVALID_OPERATION);
6360 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006361
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006362 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006363 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006364 {
6365 return;
6366 }
6367
6368 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6369 gl::Texture *texture = NULL;
6370 switch (target)
6371 {
6372 case GL_TEXTURE_3D:
6373 texture = context->getTexture3D();
6374 break;
6375
6376 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006377 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006378 break;
6379
6380 default:
6381 return gl::error(GL_INVALID_ENUM);
6382 }
6383
6384 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6385 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006386 }
6387 catch(std::bad_alloc&)
6388 {
6389 return gl::error(GL_OUT_OF_MEMORY);
6390 }
6391}
6392
6393void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6394{
Geoff Langeef52cc2013-10-16 15:07:39 -04006395 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006396 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6397 "const GLvoid* data = 0x%0.8p)",
6398 target, level, internalformat, width, height, depth, border, imageSize, data);
6399
6400 try
6401 {
6402 gl::Context *context = gl::getNonLostContext();
6403
6404 if (context)
6405 {
6406 if (context->getClientVersion() < 3)
6407 {
6408 return gl::error(GL_INVALID_OPERATION);
6409 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006410
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006411 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 +00006412 {
6413 return gl::error(GL_INVALID_VALUE);
6414 }
6415
6416 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006417 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006418 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006419 {
6420 return;
6421 }
6422
6423 switch(target)
6424 {
6425 case GL_TEXTURE_3D:
6426 {
6427 gl::Texture3D *texture = context->getTexture3D();
6428 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6429 }
6430 break;
6431
6432 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006433 {
6434 gl::Texture2DArray *texture = context->getTexture2DArray();
6435 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6436 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006437 break;
6438
6439 default:
6440 return gl::error(GL_INVALID_ENUM);
6441 }
6442 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006443 }
6444 catch(std::bad_alloc&)
6445 {
6446 return gl::error(GL_OUT_OF_MEMORY);
6447 }
6448}
6449
6450void __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)
6451{
6452 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6453 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6454 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6455 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6456
6457 try
6458 {
6459 gl::Context *context = gl::getNonLostContext();
6460
6461 if (context)
6462 {
6463 if (context->getClientVersion() < 3)
6464 {
6465 return gl::error(GL_INVALID_OPERATION);
6466 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006467
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006468 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 +00006469 {
6470 return gl::error(GL_INVALID_VALUE);
6471 }
6472
6473 if (!data)
6474 {
6475 return gl::error(GL_INVALID_VALUE);
6476 }
6477
6478 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006479 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006480 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006481 {
6482 return;
6483 }
6484
6485 switch(target)
6486 {
6487 case GL_TEXTURE_3D:
6488 {
6489 gl::Texture3D *texture = context->getTexture3D();
6490 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6491 format, imageSize, data);
6492 }
6493 break;
6494
6495 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006496 {
6497 gl::Texture2DArray *texture = context->getTexture2DArray();
6498 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6499 format, imageSize, data);
6500 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006501 break;
6502
6503 default:
6504 return gl::error(GL_INVALID_ENUM);
6505 }
6506 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006507 }
6508 catch(std::bad_alloc&)
6509 {
6510 return gl::error(GL_OUT_OF_MEMORY);
6511 }
6512}
6513
6514void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6515{
6516 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6517
6518 try
6519 {
6520 gl::Context *context = gl::getNonLostContext();
6521
6522 if (context)
6523 {
6524 if (context->getClientVersion() < 3)
6525 {
6526 return gl::error(GL_INVALID_OPERATION);
6527 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006528
Jamie Madill3641b4b2013-07-26 12:54:59 -04006529 glGenQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006530 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006531 }
6532 catch(std::bad_alloc&)
6533 {
6534 return gl::error(GL_OUT_OF_MEMORY);
6535 }
6536}
6537
6538void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6539{
6540 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6541
6542 try
6543 {
6544 gl::Context *context = gl::getNonLostContext();
6545
6546 if (context)
6547 {
6548 if (context->getClientVersion() < 3)
6549 {
6550 return gl::error(GL_INVALID_OPERATION);
6551 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006552
Jamie Madill3641b4b2013-07-26 12:54:59 -04006553 glDeleteQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006554 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006555 }
6556 catch(std::bad_alloc&)
6557 {
6558 return gl::error(GL_OUT_OF_MEMORY);
6559 }
6560}
6561
6562GLboolean __stdcall glIsQuery(GLuint id)
6563{
6564 EVENT("(GLuint id = %u)", id);
6565
6566 try
6567 {
6568 gl::Context *context = gl::getNonLostContext();
6569
6570 if (context)
6571 {
6572 if (context->getClientVersion() < 3)
6573 {
6574 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6575 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006576
Jamie Madill3641b4b2013-07-26 12:54:59 -04006577 // TODO: XFB queries
6578 return glIsQueryEXT(id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006580 }
6581 catch(std::bad_alloc&)
6582 {
6583 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6584 }
6585
6586 return GL_FALSE;
6587}
6588
6589void __stdcall glBeginQuery(GLenum target, GLuint id)
6590{
6591 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6592
6593 try
6594 {
6595 gl::Context *context = gl::getNonLostContext();
6596
6597 if (context)
6598 {
6599 if (context->getClientVersion() < 3)
6600 {
6601 return gl::error(GL_INVALID_OPERATION);
6602 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006603
Jamie Madill3641b4b2013-07-26 12:54:59 -04006604 switch (target)
6605 {
6606 case GL_ANY_SAMPLES_PASSED:
6607 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
6608 case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
6609 break;
6610 default:
6611 return gl::error(GL_INVALID_ENUM);
6612 }
6613
6614 if (id == 0)
6615 {
6616 return gl::error(GL_INVALID_OPERATION);
6617 }
6618
6619 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6620 {
6621 // TODO: XFB queries
6622 UNIMPLEMENTED();
6623 }
6624 else
6625 {
6626 context->beginQuery(target, id);
6627 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006628 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006629 }
6630 catch(std::bad_alloc&)
6631 {
6632 return gl::error(GL_OUT_OF_MEMORY);
6633 }
6634}
6635
6636void __stdcall glEndQuery(GLenum target)
6637{
6638 EVENT("(GLenum target = 0x%X)", target);
6639
6640 try
6641 {
6642 gl::Context *context = gl::getNonLostContext();
6643
6644 if (context)
6645 {
6646 if (context->getClientVersion() < 3)
6647 {
6648 return gl::error(GL_INVALID_OPERATION);
6649 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006650
Jamie Madill3641b4b2013-07-26 12:54:59 -04006651 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6652 {
6653 // TODO: XFB queries
6654 UNIMPLEMENTED();
6655 }
6656 else
6657 {
6658 glEndQueryEXT(target);
6659 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006660 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006661 }
6662 catch(std::bad_alloc&)
6663 {
6664 return gl::error(GL_OUT_OF_MEMORY);
6665 }
6666}
6667
6668void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6669{
6670 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6671
6672 try
6673 {
6674 gl::Context *context = gl::getNonLostContext();
6675
6676 if (context)
6677 {
6678 if (context->getClientVersion() < 3)
6679 {
6680 return gl::error(GL_INVALID_OPERATION);
6681 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006682
Jamie Madill3641b4b2013-07-26 12:54:59 -04006683 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6684 {
6685 // TODO: XFB queries
6686 UNIMPLEMENTED();
6687 }
6688 else
6689 {
6690 glGetQueryivEXT(target, pname, params);
6691 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006692 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006693 }
6694 catch(std::bad_alloc&)
6695 {
6696 return gl::error(GL_OUT_OF_MEMORY);
6697 }
6698}
6699
6700void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6701{
6702 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6703
6704 try
6705 {
6706 gl::Context *context = gl::getNonLostContext();
6707
6708 if (context)
6709 {
6710 if (context->getClientVersion() < 3)
6711 {
6712 return gl::error(GL_INVALID_OPERATION);
6713 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006714
Jamie Madill3641b4b2013-07-26 12:54:59 -04006715 // TODO: XFB queries
6716 glGetQueryObjectuivEXT(id, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006717 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006718 }
6719 catch(std::bad_alloc&)
6720 {
6721 return gl::error(GL_OUT_OF_MEMORY);
6722 }
6723}
6724
6725GLboolean __stdcall glUnmapBuffer(GLenum target)
6726{
6727 EVENT("(GLenum target = 0x%X)", target);
6728
6729 try
6730 {
6731 gl::Context *context = gl::getNonLostContext();
6732
6733 if (context)
6734 {
6735 if (context->getClientVersion() < 3)
6736 {
6737 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6738 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006739
Jamie Madill54133512013-06-21 09:33:07 -04006740 // glUnmapBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006741 UNIMPLEMENTED();
6742 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006743 }
6744 catch(std::bad_alloc&)
6745 {
6746 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6747 }
6748
6749 return GL_FALSE;
6750}
6751
6752void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6753{
6754 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6755
6756 try
6757 {
6758 gl::Context *context = gl::getNonLostContext();
6759
6760 if (context)
6761 {
6762 if (context->getClientVersion() < 3)
6763 {
6764 return gl::error(GL_INVALID_OPERATION);
6765 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006766
Jamie Madill54133512013-06-21 09:33:07 -04006767 // glGetBufferPointerv
shannonwoods@chromium.org2d2190a2013-05-30 00:17:35 +00006768 UNIMPLEMENTED();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006769 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006770 }
6771 catch(std::bad_alloc&)
6772 {
6773 return gl::error(GL_OUT_OF_MEMORY);
6774 }
6775}
6776
6777void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6778{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006779 try
6780 {
6781 gl::Context *context = gl::getNonLostContext();
6782
6783 if (context)
6784 {
6785 if (context->getClientVersion() < 3)
6786 {
6787 return gl::error(GL_INVALID_OPERATION);
6788 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006789
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006790 glDrawBuffersEXT(n, bufs);
6791 }
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 glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6800{
6801 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6802 location, count, transpose, value);
6803
6804 try
6805 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006806 if (count < 0)
6807 {
6808 return gl::error(GL_INVALID_VALUE);
6809 }
6810
6811 if (location == -1)
6812 {
6813 return;
6814 }
6815
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006816 gl::Context *context = gl::getNonLostContext();
6817
6818 if (context)
6819 {
6820 if (context->getClientVersion() < 3)
6821 {
6822 return gl::error(GL_INVALID_OPERATION);
6823 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006824
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006825 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6826 if (!programBinary)
6827 {
6828 return gl::error(GL_INVALID_OPERATION);
6829 }
6830
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006831 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006832 {
6833 return gl::error(GL_INVALID_OPERATION);
6834 }
6835 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006836 }
6837 catch(std::bad_alloc&)
6838 {
6839 return gl::error(GL_OUT_OF_MEMORY);
6840 }
6841}
6842
6843void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6844{
6845 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6846 location, count, transpose, value);
6847
6848 try
6849 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006850 if (count < 0)
6851 {
6852 return gl::error(GL_INVALID_VALUE);
6853 }
6854
6855 if (location == -1)
6856 {
6857 return;
6858 }
6859
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006860 gl::Context *context = gl::getNonLostContext();
6861
6862 if (context)
6863 {
6864 if (context->getClientVersion() < 3)
6865 {
6866 return gl::error(GL_INVALID_OPERATION);
6867 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006868
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006869 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6870 if (!programBinary)
6871 {
6872 return gl::error(GL_INVALID_OPERATION);
6873 }
6874
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006875 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006876 {
6877 return gl::error(GL_INVALID_OPERATION);
6878 }
6879 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006880 }
6881 catch(std::bad_alloc&)
6882 {
6883 return gl::error(GL_OUT_OF_MEMORY);
6884 }
6885}
6886
6887void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6888{
6889 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6890 location, count, transpose, value);
6891
6892 try
6893 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006894 if (count < 0)
6895 {
6896 return gl::error(GL_INVALID_VALUE);
6897 }
6898
6899 if (location == -1)
6900 {
6901 return;
6902 }
6903
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006904 gl::Context *context = gl::getNonLostContext();
6905
6906 if (context)
6907 {
6908 if (context->getClientVersion() < 3)
6909 {
6910 return gl::error(GL_INVALID_OPERATION);
6911 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006912
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006913 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6914 if (!programBinary)
6915 {
6916 return gl::error(GL_INVALID_OPERATION);
6917 }
6918
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006919 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006920 {
6921 return gl::error(GL_INVALID_OPERATION);
6922 }
6923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006924 }
6925 catch(std::bad_alloc&)
6926 {
6927 return gl::error(GL_OUT_OF_MEMORY);
6928 }
6929}
6930
6931void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6932{
6933 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6934 location, count, transpose, value);
6935
6936 try
6937 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006938 if (count < 0)
6939 {
6940 return gl::error(GL_INVALID_VALUE);
6941 }
6942
6943 if (location == -1)
6944 {
6945 return;
6946 }
6947
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006948 gl::Context *context = gl::getNonLostContext();
6949
6950 if (context)
6951 {
6952 if (context->getClientVersion() < 3)
6953 {
6954 return gl::error(GL_INVALID_OPERATION);
6955 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006956
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006957 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6958 if (!programBinary)
6959 {
6960 return gl::error(GL_INVALID_OPERATION);
6961 }
6962
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006963 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006964 {
6965 return gl::error(GL_INVALID_OPERATION);
6966 }
6967 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006968 }
6969 catch(std::bad_alloc&)
6970 {
6971 return gl::error(GL_OUT_OF_MEMORY);
6972 }
6973}
6974
6975void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6976{
6977 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6978 location, count, transpose, value);
6979
6980 try
6981 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006982 if (count < 0)
6983 {
6984 return gl::error(GL_INVALID_VALUE);
6985 }
6986
6987 if (location == -1)
6988 {
6989 return;
6990 }
6991
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006992 gl::Context *context = gl::getNonLostContext();
6993
6994 if (context)
6995 {
6996 if (context->getClientVersion() < 3)
6997 {
6998 return gl::error(GL_INVALID_OPERATION);
6999 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007000
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007001 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7002 if (!programBinary)
7003 {
7004 return gl::error(GL_INVALID_OPERATION);
7005 }
7006
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007007 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007008 {
7009 return gl::error(GL_INVALID_OPERATION);
7010 }
7011 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007012 }
7013 catch(std::bad_alloc&)
7014 {
7015 return gl::error(GL_OUT_OF_MEMORY);
7016 }
7017}
7018
7019void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7020{
7021 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7022 location, count, transpose, value);
7023
7024 try
7025 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007026 if (count < 0)
7027 {
7028 return gl::error(GL_INVALID_VALUE);
7029 }
7030
7031 if (location == -1)
7032 {
7033 return;
7034 }
7035
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007036 gl::Context *context = gl::getNonLostContext();
7037
7038 if (context)
7039 {
7040 if (context->getClientVersion() < 3)
7041 {
7042 return gl::error(GL_INVALID_OPERATION);
7043 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007044
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007045 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7046 if (!programBinary)
7047 {
7048 return gl::error(GL_INVALID_OPERATION);
7049 }
7050
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007051 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007052 {
7053 return gl::error(GL_INVALID_OPERATION);
7054 }
7055 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007056 }
7057 catch(std::bad_alloc&)
7058 {
7059 return gl::error(GL_OUT_OF_MEMORY);
7060 }
7061}
7062
7063void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7064{
7065 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7066 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7067 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7068
7069 try
7070 {
7071 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007072 if (context)
7073 {
7074 if (context->getClientVersion() < 3)
7075 {
7076 return gl::error(GL_INVALID_OPERATION);
7077 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007078
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007079 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04007080 dstX0, dstY0, dstX1, dstY1, mask, filter,
7081 false))
7082 {
7083 return;
7084 }
7085
7086 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7087 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007088 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007089 }
7090 catch(std::bad_alloc&)
7091 {
7092 return gl::error(GL_OUT_OF_MEMORY);
7093 }
7094}
7095
7096void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7097{
7098 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7099 target, samples, internalformat, width, height);
7100
7101 try
7102 {
7103 gl::Context *context = gl::getNonLostContext();
7104
7105 if (context)
7106 {
7107 if (context->getClientVersion() < 3)
7108 {
7109 return gl::error(GL_INVALID_OPERATION);
7110 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007111
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007112 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007113 width, height, false))
7114 {
7115 return;
7116 }
7117
7118 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007119 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007120 }
7121 catch(std::bad_alloc&)
7122 {
7123 return gl::error(GL_OUT_OF_MEMORY);
7124 }
7125}
7126
7127void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7128{
7129 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7130 target, attachment, texture, level, layer);
7131
7132 try
7133 {
7134 gl::Context *context = gl::getNonLostContext();
7135
7136 if (context)
7137 {
7138 if (context->getClientVersion() < 3)
7139 {
7140 return gl::error(GL_INVALID_OPERATION);
7141 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007142
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007143 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007144 {
7145 return;
7146 }
7147
7148 gl::Framebuffer *framebuffer = NULL;
7149 if (target == GL_READ_FRAMEBUFFER)
7150 {
7151 framebuffer = context->getReadFramebuffer();
7152 }
7153 else
7154 {
7155 framebuffer = context->getDrawFramebuffer();
7156 }
7157
7158 gl::Texture *textureObject = context->getTexture(texture);
7159 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7160
7161 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7162 {
7163 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7164 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7165 }
7166 else
7167 {
7168 switch (attachment)
7169 {
7170 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7171 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7172 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7173 }
7174 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007175 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007176 }
7177 catch(std::bad_alloc&)
7178 {
7179 return gl::error(GL_OUT_OF_MEMORY);
7180 }
7181}
7182
7183GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7184{
7185 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7186 target, offset, length, access);
7187
7188 try
7189 {
7190 gl::Context *context = gl::getNonLostContext();
7191
7192 if (context)
7193 {
7194 if (context->getClientVersion() < 3)
7195 {
7196 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7197 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007198
Jamie Madill54133512013-06-21 09:33:07 -04007199 // glMapBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007200 UNIMPLEMENTED();
7201 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007202 }
7203 catch(std::bad_alloc&)
7204 {
7205 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7206 }
7207
7208 return NULL;
7209}
7210
7211void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7212{
7213 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7214
7215 try
7216 {
7217 gl::Context *context = gl::getNonLostContext();
7218
7219 if (context)
7220 {
7221 if (context->getClientVersion() < 3)
7222 {
7223 return gl::error(GL_INVALID_OPERATION);
7224 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007225
Jamie Madill54133512013-06-21 09:33:07 -04007226 // glFlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007227 UNIMPLEMENTED();
7228 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007229 }
7230 catch(std::bad_alloc&)
7231 {
7232 return gl::error(GL_OUT_OF_MEMORY);
7233 }
7234}
7235
7236void __stdcall glBindVertexArray(GLuint array)
7237{
7238 EVENT("(GLuint array = %u)", array);
7239
7240 try
7241 {
7242 gl::Context *context = gl::getNonLostContext();
7243
7244 if (context)
7245 {
7246 if (context->getClientVersion() < 3)
7247 {
7248 return gl::error(GL_INVALID_OPERATION);
7249 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007250
Jamie Madilld1028542013-07-02 11:57:04 -04007251 gl::VertexArray *vao = context->getVertexArray(array);
7252
7253 if (!vao)
7254 {
7255 // The default VAO should always exist
7256 ASSERT(array != 0);
7257 return gl::error(GL_INVALID_OPERATION);
7258 }
7259
7260 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007261 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007262 }
7263 catch(std::bad_alloc&)
7264 {
7265 return gl::error(GL_OUT_OF_MEMORY);
7266 }
7267}
7268
7269void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7270{
7271 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7272
7273 try
7274 {
7275 gl::Context *context = gl::getNonLostContext();
7276
7277 if (context)
7278 {
7279 if (context->getClientVersion() < 3)
7280 {
7281 return gl::error(GL_INVALID_OPERATION);
7282 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007283
Jamie Madilld1028542013-07-02 11:57:04 -04007284 if (n < 0)
7285 {
7286 return gl::error(GL_INVALID_VALUE);
7287 }
7288
7289 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7290 {
7291 if (arrays[arrayIndex] != 0)
7292 {
7293 context->deleteVertexArray(arrays[arrayIndex]);
7294 }
7295 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007296 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007297 }
7298 catch(std::bad_alloc&)
7299 {
7300 return gl::error(GL_OUT_OF_MEMORY);
7301 }
7302}
7303
7304void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7305{
7306 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7307
7308 try
7309 {
7310 gl::Context *context = gl::getNonLostContext();
7311
7312 if (context)
7313 {
7314 if (context->getClientVersion() < 3)
7315 {
7316 return gl::error(GL_INVALID_OPERATION);
7317 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007318
Jamie Madilld1028542013-07-02 11:57:04 -04007319 if (n < 0)
7320 {
7321 return gl::error(GL_INVALID_VALUE);
7322 }
7323
7324 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7325 {
7326 arrays[arrayIndex] = context->createVertexArray();
7327 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007328 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007329 }
7330 catch(std::bad_alloc&)
7331 {
7332 return gl::error(GL_OUT_OF_MEMORY);
7333 }
7334}
7335
7336GLboolean __stdcall glIsVertexArray(GLuint array)
7337{
7338 EVENT("(GLuint array = %u)", array);
7339
7340 try
7341 {
7342 gl::Context *context = gl::getNonLostContext();
7343
7344 if (context)
7345 {
7346 if (context->getClientVersion() < 3)
7347 {
7348 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7349 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007350
Jamie Madilld1028542013-07-02 11:57:04 -04007351 if (array == 0)
7352 {
7353 return GL_FALSE;
7354 }
7355
7356 gl::VertexArray *vao = context->getVertexArray(array);
7357
7358 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007359 }
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, GL_FALSE);
7364 }
7365
7366 return GL_FALSE;
7367}
7368
7369void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7370{
7371 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7372 target, index, data);
7373
7374 try
7375 {
7376 gl::Context *context = gl::getNonLostContext();
7377
7378 if (context)
7379 {
7380 if (context->getClientVersion() < 3)
7381 {
7382 return gl::error(GL_INVALID_OPERATION);
7383 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007384
Shannon Woods15934d52013-08-19 14:28:49 -04007385 switch (target)
7386 {
7387 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7388 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7389 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7390 if (index >= context->getMaxTransformFeedbackBufferBindings())
7391 return gl::error(GL_INVALID_VALUE);
7392 break;
7393 case GL_UNIFORM_BUFFER_START:
7394 case GL_UNIFORM_BUFFER_SIZE:
7395 case GL_UNIFORM_BUFFER_BINDING:
7396 if (index >= context->getMaximumCombinedUniformBufferBindings())
7397 return gl::error(GL_INVALID_VALUE);
7398 break;
7399 default:
7400 return gl::error(GL_INVALID_ENUM);
7401 }
7402
7403 if (!(context->getIndexedIntegerv(target, index, data)))
7404 {
7405 GLenum nativeType;
7406 unsigned int numParams = 0;
7407 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7408 return gl::error(GL_INVALID_ENUM);
7409
7410 if (numParams == 0)
7411 return; // it is known that pname is valid, but there are no parameters to return
7412
7413 if (nativeType == GL_INT_64_ANGLEX)
7414 {
7415 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7416 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7417 GLint64 *int64Params = new GLint64[numParams];
7418
7419 context->getIndexedInteger64v(target, index, int64Params);
7420
7421 for (unsigned int i = 0; i < numParams; ++i)
7422 {
7423 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7424 data[i] = static_cast<GLint>(clampedValue);
7425 }
7426
7427 delete [] int64Params;
7428 }
7429 else
7430 {
7431 UNREACHABLE();
7432 }
7433 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007434 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007435 }
7436 catch(std::bad_alloc&)
7437 {
7438 return gl::error(GL_OUT_OF_MEMORY);
7439 }
7440}
7441
7442void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7443{
7444 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7445
7446 try
7447 {
7448 gl::Context *context = gl::getNonLostContext();
7449
7450 if (context)
7451 {
7452 if (context->getClientVersion() < 3)
7453 {
7454 return gl::error(GL_INVALID_OPERATION);
7455 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007456
Jamie Madill54133512013-06-21 09:33:07 -04007457 // glBeginTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007458 UNIMPLEMENTED();
7459 }
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
7467void __stdcall glEndTransformFeedback(void)
7468{
7469 EVENT("(void)");
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);
7480 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007481
Jamie Madill54133512013-06-21 09:33:07 -04007482 // glEndTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007483 UNIMPLEMENTED();
7484 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007485 }
7486 catch(std::bad_alloc&)
7487 {
7488 return gl::error(GL_OUT_OF_MEMORY);
7489 }
7490}
7491
7492void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7493{
7494 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7495 target, index, buffer, offset, size);
7496
7497 try
7498 {
7499 gl::Context *context = gl::getNonLostContext();
7500
7501 if (context)
7502 {
7503 if (context->getClientVersion() < 3)
7504 {
7505 return gl::error(GL_INVALID_OPERATION);
7506 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007507
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007508 switch (target)
7509 {
7510 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007511 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007512 {
7513 return gl::error(GL_INVALID_VALUE);
7514 }
7515 break;
7516
7517 case GL_UNIFORM_BUFFER:
7518 if (index >= context->getMaximumCombinedUniformBufferBindings())
7519 {
7520 return gl::error(GL_INVALID_VALUE);
7521 }
7522 break;
7523
7524 default:
7525 return gl::error(GL_INVALID_ENUM);
7526 }
7527
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007528 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007529 {
7530 return gl::error(GL_INVALID_VALUE);
7531 }
7532
7533 switch (target)
7534 {
7535 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007536
7537 // size and offset must be a multiple of 4
7538 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7539 {
7540 return gl::error(GL_INVALID_VALUE);
7541 }
7542
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007543 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7544 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007545 break;
7546
7547 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007548
7549 // it is an error to bind an offset not a multiple of the alignment
7550 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7551 {
7552 return gl::error(GL_INVALID_VALUE);
7553 }
7554
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007555 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7556 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007557 break;
7558
7559 default:
7560 UNREACHABLE();
7561 }
7562 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007563 }
7564 catch(std::bad_alloc&)
7565 {
7566 return gl::error(GL_OUT_OF_MEMORY);
7567 }
7568}
7569
7570void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7571{
7572 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7573 target, index, buffer);
7574
7575 try
7576 {
7577 gl::Context *context = gl::getNonLostContext();
7578
7579 if (context)
7580 {
7581 if (context->getClientVersion() < 3)
7582 {
7583 return gl::error(GL_INVALID_OPERATION);
7584 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007585
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007586 switch (target)
7587 {
7588 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007589 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007590 {
7591 return gl::error(GL_INVALID_VALUE);
7592 }
7593 break;
7594
7595 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007596 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007597 {
7598 return gl::error(GL_INVALID_VALUE);
7599 }
7600 break;
7601
7602 default:
7603 return gl::error(GL_INVALID_ENUM);
7604 }
7605
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007606 switch (target)
7607 {
7608 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007609 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007610 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007611 break;
7612
7613 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007614 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007615 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007616 break;
7617
7618 default:
7619 UNREACHABLE();
7620 }
7621 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007622 }
7623 catch(std::bad_alloc&)
7624 {
7625 return gl::error(GL_OUT_OF_MEMORY);
7626 }
7627}
7628
7629void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7630{
7631 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7632 program, count, varyings, bufferMode);
7633
7634 try
7635 {
7636 gl::Context *context = gl::getNonLostContext();
7637
7638 if (context)
7639 {
7640 if (context->getClientVersion() < 3)
7641 {
7642 return gl::error(GL_INVALID_OPERATION);
7643 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007644
Jamie Madill54133512013-06-21 09:33:07 -04007645 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007646 UNIMPLEMENTED();
7647 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007648 }
7649 catch(std::bad_alloc&)
7650 {
7651 return gl::error(GL_OUT_OF_MEMORY);
7652 }
7653}
7654
7655void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7656{
7657 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7658 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7659 program, index, bufSize, length, size, type, name);
7660
7661 try
7662 {
7663 gl::Context *context = gl::getNonLostContext();
7664
7665 if (context)
7666 {
7667 if (context->getClientVersion() < 3)
7668 {
7669 return gl::error(GL_INVALID_OPERATION);
7670 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007671
Jamie Madill54133512013-06-21 09:33:07 -04007672 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007673 UNIMPLEMENTED();
7674 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007675 }
7676 catch(std::bad_alloc&)
7677 {
7678 return gl::error(GL_OUT_OF_MEMORY);
7679 }
7680}
7681
7682void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7683{
7684 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7685 index, size, type, stride, pointer);
7686
7687 try
7688 {
7689 gl::Context *context = gl::getNonLostContext();
7690
7691 if (context)
7692 {
7693 if (context->getClientVersion() < 3)
7694 {
7695 return gl::error(GL_INVALID_OPERATION);
7696 }
7697 }
7698
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007699 if (index >= gl::MAX_VERTEX_ATTRIBS)
7700 {
7701 return gl::error(GL_INVALID_VALUE);
7702 }
7703
7704 if (size < 1 || size > 4)
7705 {
7706 return gl::error(GL_INVALID_VALUE);
7707 }
7708
7709 switch (type)
7710 {
7711 case GL_BYTE:
7712 case GL_UNSIGNED_BYTE:
7713 case GL_SHORT:
7714 case GL_UNSIGNED_SHORT:
7715 case GL_INT:
7716 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007717 case GL_INT_2_10_10_10_REV:
7718 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007719 break;
7720 default:
7721 return gl::error(GL_INVALID_ENUM);
7722 }
7723
7724 if (stride < 0)
7725 {
7726 return gl::error(GL_INVALID_VALUE);
7727 }
7728
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007729 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7730 {
7731 return gl::error(GL_INVALID_OPERATION);
7732 }
7733
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007734 if (context)
7735 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007736 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7737 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7738 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7739 // and the pointer argument is not NULL.
7740 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7741 {
7742 return gl::error(GL_INVALID_OPERATION);
7743 }
7744
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007745 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7746 stride, pointer);
7747 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007748 }
7749 catch(std::bad_alloc&)
7750 {
7751 return gl::error(GL_OUT_OF_MEMORY);
7752 }
7753}
7754
7755void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7756{
7757 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7758 index, pname, params);
7759
7760 try
7761 {
7762 gl::Context *context = gl::getNonLostContext();
7763
7764 if (context)
7765 {
7766 if (context->getClientVersion() < 3)
7767 {
7768 return gl::error(GL_INVALID_OPERATION);
7769 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007770
Jamie Madilla7d05862013-07-02 11:57:06 -04007771 if (index >= gl::MAX_VERTEX_ATTRIBS)
7772 {
7773 return gl::error(GL_INVALID_VALUE);
7774 }
7775
7776 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7777
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007778 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007779 {
7780 return;
7781 }
7782
7783 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7784 {
7785 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7786 for (int i = 0; i < 4; ++i)
7787 {
7788 params[i] = currentValueData.IntValues[i];
7789 }
7790 }
7791 else
7792 {
7793 *params = attribState.querySingleParameter<GLint>(pname);
7794 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007795 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007796 }
7797 catch(std::bad_alloc&)
7798 {
7799 return gl::error(GL_OUT_OF_MEMORY);
7800 }
7801}
7802
7803void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7804{
7805 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7806 index, pname, params);
7807
7808 try
7809 {
7810 gl::Context *context = gl::getNonLostContext();
7811
7812 if (context)
7813 {
7814 if (context->getClientVersion() < 3)
7815 {
7816 return gl::error(GL_INVALID_OPERATION);
7817 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007818
Jamie Madilla7d05862013-07-02 11:57:06 -04007819 if (index >= gl::MAX_VERTEX_ATTRIBS)
7820 {
7821 return gl::error(GL_INVALID_VALUE);
7822 }
7823
7824 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7825
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007826 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007827 {
7828 return;
7829 }
7830
7831 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7832 {
7833 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7834 for (int i = 0; i < 4; ++i)
7835 {
7836 params[i] = currentValueData.UnsignedIntValues[i];
7837 }
7838 }
7839 else
7840 {
7841 *params = attribState.querySingleParameter<GLuint>(pname);
7842 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007843 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007844 }
7845 catch(std::bad_alloc&)
7846 {
7847 return gl::error(GL_OUT_OF_MEMORY);
7848 }
7849}
7850
7851void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7852{
7853 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7854 index, x, y, z, w);
7855
7856 try
7857 {
7858 gl::Context *context = gl::getNonLostContext();
7859
7860 if (context)
7861 {
7862 if (context->getClientVersion() < 3)
7863 {
7864 return gl::error(GL_INVALID_OPERATION);
7865 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007866
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007867 if (index >= gl::MAX_VERTEX_ATTRIBS)
7868 {
7869 return gl::error(GL_INVALID_VALUE);
7870 }
7871
7872 GLint vals[4] = { x, y, z, w };
7873 context->setVertexAttribi(index, vals);
7874 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007875 }
7876 catch(std::bad_alloc&)
7877 {
7878 return gl::error(GL_OUT_OF_MEMORY);
7879 }
7880}
7881
7882void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7883{
7884 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7885 index, x, y, z, w);
7886
7887 try
7888 {
7889 gl::Context *context = gl::getNonLostContext();
7890
7891 if (context)
7892 {
7893 if (context->getClientVersion() < 3)
7894 {
7895 return gl::error(GL_INVALID_OPERATION);
7896 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007897
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007898 if (index >= gl::MAX_VERTEX_ATTRIBS)
7899 {
7900 return gl::error(GL_INVALID_VALUE);
7901 }
7902
7903 GLuint vals[4] = { x, y, z, w };
7904 context->setVertexAttribu(index, vals);
7905 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007906 }
7907 catch(std::bad_alloc&)
7908 {
7909 return gl::error(GL_OUT_OF_MEMORY);
7910 }
7911}
7912
7913void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7914{
7915 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7916
7917 try
7918 {
7919 gl::Context *context = gl::getNonLostContext();
7920
7921 if (context)
7922 {
7923 if (context->getClientVersion() < 3)
7924 {
7925 return gl::error(GL_INVALID_OPERATION);
7926 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007927
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007928 if (index >= gl::MAX_VERTEX_ATTRIBS)
7929 {
7930 return gl::error(GL_INVALID_VALUE);
7931 }
7932
7933 context->setVertexAttribi(index, v);
7934 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007935 }
7936 catch(std::bad_alloc&)
7937 {
7938 return gl::error(GL_OUT_OF_MEMORY);
7939 }
7940}
7941
7942void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7943{
7944 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7945
7946 try
7947 {
7948 gl::Context *context = gl::getNonLostContext();
7949
7950 if (context)
7951 {
7952 if (context->getClientVersion() < 3)
7953 {
7954 return gl::error(GL_INVALID_OPERATION);
7955 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007956
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007957 if (index >= gl::MAX_VERTEX_ATTRIBS)
7958 {
7959 return gl::error(GL_INVALID_VALUE);
7960 }
7961
7962 context->setVertexAttribu(index, v);
7963 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007964 }
7965 catch(std::bad_alloc&)
7966 {
7967 return gl::error(GL_OUT_OF_MEMORY);
7968 }
7969}
7970
7971void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7972{
7973 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7974 program, location, params);
7975
7976 try
7977 {
7978 gl::Context *context = gl::getNonLostContext();
7979
7980 if (context)
7981 {
7982 if (context->getClientVersion() < 3)
7983 {
7984 return gl::error(GL_INVALID_OPERATION);
7985 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007986
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007987 if (program == 0)
7988 {
7989 return gl::error(GL_INVALID_VALUE);
7990 }
7991
7992 gl::Program *programObject = context->getProgram(program);
7993
7994 if (!programObject || !programObject->isLinked())
7995 {
7996 return gl::error(GL_INVALID_OPERATION);
7997 }
7998
7999 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8000 if (!programBinary)
8001 {
8002 return gl::error(GL_INVALID_OPERATION);
8003 }
8004
8005 if (!programBinary->getUniformuiv(location, NULL, params))
8006 {
8007 return gl::error(GL_INVALID_OPERATION);
8008 }
8009 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008010 }
8011 catch(std::bad_alloc&)
8012 {
8013 return gl::error(GL_OUT_OF_MEMORY);
8014 }
8015}
8016
8017GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8018{
8019 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8020 program, name);
8021
8022 try
8023 {
8024 gl::Context *context = gl::getNonLostContext();
8025
8026 if (context)
8027 {
8028 if (context->getClientVersion() < 3)
8029 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008030 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008031 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008032
Jamie Madilld1e78c92013-06-20 11:55:50 -04008033 if (program == 0)
8034 {
8035 return gl::error(GL_INVALID_VALUE, -1);
8036 }
8037
8038 gl::Program *programObject = context->getProgram(program);
8039
8040 if (!programObject || !programObject->isLinked())
8041 {
8042 return gl::error(GL_INVALID_OPERATION, -1);
8043 }
8044
8045 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8046 if (!programBinary)
8047 {
8048 return gl::error(GL_INVALID_OPERATION, -1);
8049 }
8050
8051 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008052 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008053 }
8054 catch(std::bad_alloc&)
8055 {
8056 return gl::error(GL_OUT_OF_MEMORY, 0);
8057 }
8058
8059 return 0;
8060}
8061
8062void __stdcall glUniform1ui(GLint location, GLuint v0)
8063{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008064 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008065}
8066
8067void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8068{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008069 const GLuint xy[] = { v0, v1 };
8070 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008071}
8072
8073void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8074{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008075 const GLuint xyz[] = { v0, v1, v2 };
8076 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008077}
8078
8079void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8080{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008081 const GLuint xyzw[] = { v0, v1, v2, v3 };
8082 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008083}
8084
8085void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8086{
8087 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8088 location, count, value);
8089
8090 try
8091 {
8092 gl::Context *context = gl::getNonLostContext();
8093
8094 if (context)
8095 {
8096 if (context->getClientVersion() < 3)
8097 {
8098 return gl::error(GL_INVALID_OPERATION);
8099 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008100
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008101 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8102 if (!programBinary)
8103 {
8104 return gl::error(GL_INVALID_OPERATION);
8105 }
8106
8107 if (!programBinary->setUniform1uiv(location, count, value))
8108 {
8109 return gl::error(GL_INVALID_OPERATION);
8110 }
8111 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008112 }
8113 catch(std::bad_alloc&)
8114 {
8115 return gl::error(GL_OUT_OF_MEMORY);
8116 }
8117}
8118
8119void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8120{
8121 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8122 location, count, value);
8123
8124 try
8125 {
8126 gl::Context *context = gl::getNonLostContext();
8127
8128 if (context)
8129 {
8130 if (context->getClientVersion() < 3)
8131 {
8132 return gl::error(GL_INVALID_OPERATION);
8133 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008134
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008135 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8136 if (!programBinary)
8137 {
8138 return gl::error(GL_INVALID_OPERATION);
8139 }
8140
8141 if (!programBinary->setUniform2uiv(location, count, value))
8142 {
8143 return gl::error(GL_INVALID_OPERATION);
8144 }
8145 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008146 }
8147 catch(std::bad_alloc&)
8148 {
8149 return gl::error(GL_OUT_OF_MEMORY);
8150 }
8151}
8152
8153void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8154{
8155 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8156 location, count, value);
8157
8158 try
8159 {
8160 gl::Context *context = gl::getNonLostContext();
8161
8162 if (context)
8163 {
8164 if (context->getClientVersion() < 3)
8165 {
8166 return gl::error(GL_INVALID_OPERATION);
8167 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008168
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008169 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8170 if (!programBinary)
8171 {
8172 return gl::error(GL_INVALID_OPERATION);
8173 }
8174
8175 if (!programBinary->setUniform3uiv(location, count, value))
8176 {
8177 return gl::error(GL_INVALID_OPERATION);
8178 }
8179 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008180 }
8181 catch(std::bad_alloc&)
8182 {
8183 return gl::error(GL_OUT_OF_MEMORY);
8184 }
8185}
8186
8187void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8188{
8189 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8190 location, count, value);
8191
8192 try
8193 {
8194 gl::Context *context = gl::getNonLostContext();
8195
8196 if (context)
8197 {
8198 if (context->getClientVersion() < 3)
8199 {
8200 return gl::error(GL_INVALID_OPERATION);
8201 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008202
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008203 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8204 if (!programBinary)
8205 {
8206 return gl::error(GL_INVALID_OPERATION);
8207 }
8208
8209 if (!programBinary->setUniform4uiv(location, count, value))
8210 {
8211 return gl::error(GL_INVALID_OPERATION);
8212 }
8213 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008214 }
8215 catch(std::bad_alloc&)
8216 {
8217 return gl::error(GL_OUT_OF_MEMORY);
8218 }
8219}
8220
8221void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8222{
8223 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8224 buffer, drawbuffer, value);
8225
8226 try
8227 {
8228 gl::Context *context = gl::getNonLostContext();
8229
8230 if (context)
8231 {
8232 if (context->getClientVersion() < 3)
8233 {
8234 return gl::error(GL_INVALID_OPERATION);
8235 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008236
Geoff Lang42359ca2013-08-21 13:25:17 -04008237 switch (buffer)
8238 {
8239 case GL_COLOR:
8240 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8241 {
8242 return gl::error(GL_INVALID_VALUE);
8243 }
8244 break;
8245 case GL_STENCIL:
8246 if (drawbuffer != 0)
8247 {
8248 return gl::error(GL_INVALID_VALUE);
8249 }
8250 default:
8251 return gl::error(GL_INVALID_ENUM);
8252 }
8253
8254 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008255 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008256 }
8257 catch(std::bad_alloc&)
8258 {
8259 return gl::error(GL_OUT_OF_MEMORY);
8260 }
8261}
8262
8263void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8264{
8265 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8266 buffer, drawbuffer, value);
8267
8268 try
8269 {
8270 gl::Context *context = gl::getNonLostContext();
8271
8272 if (context)
8273 {
8274 if (context->getClientVersion() < 3)
8275 {
8276 return gl::error(GL_INVALID_OPERATION);
8277 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008278
Geoff Lang42359ca2013-08-21 13:25:17 -04008279 switch (buffer)
8280 {
8281 case GL_COLOR:
8282 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8283 {
8284 return gl::error(GL_INVALID_VALUE);
8285 }
8286 break;
8287 default:
8288 return gl::error(GL_INVALID_ENUM);
8289 }
8290
8291 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008292 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008293 }
8294 catch(std::bad_alloc&)
8295 {
8296 return gl::error(GL_OUT_OF_MEMORY);
8297 }
8298}
8299
8300void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8301{
8302 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8303 buffer, drawbuffer, value);
8304
8305 try
8306 {
8307 gl::Context *context = gl::getNonLostContext();
8308
8309 if (context)
8310 {
8311 if (context->getClientVersion() < 3)
8312 {
8313 return gl::error(GL_INVALID_OPERATION);
8314 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008315
Geoff Lang42359ca2013-08-21 13:25:17 -04008316 switch (buffer)
8317 {
8318 case GL_COLOR:
8319 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8320 {
8321 return gl::error(GL_INVALID_VALUE);
8322 }
8323 break;
8324 case GL_DEPTH:
8325 if (drawbuffer != 0)
8326 {
8327 return gl::error(GL_INVALID_VALUE);
8328 }
8329 break;
8330 default:
8331 return gl::error(GL_INVALID_ENUM);
8332 }
8333
8334 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008335 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008336 }
8337 catch(std::bad_alloc&)
8338 {
8339 return gl::error(GL_OUT_OF_MEMORY);
8340 }
8341}
8342
8343void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8344{
8345 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8346 buffer, drawbuffer, depth, stencil);
8347
8348 try
8349 {
8350 gl::Context *context = gl::getNonLostContext();
8351
8352 if (context)
8353 {
8354 if (context->getClientVersion() < 3)
8355 {
8356 return gl::error(GL_INVALID_OPERATION);
8357 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008358
Geoff Lang42359ca2013-08-21 13:25:17 -04008359 switch (buffer)
8360 {
8361 case GL_DEPTH_STENCIL:
8362 if (drawbuffer != 0)
8363 {
8364 return gl::error(GL_INVALID_VALUE);
8365 }
8366 break;
8367 default:
8368 return gl::error(GL_INVALID_ENUM);
8369 }
8370
8371 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008372 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008373 }
8374 catch(std::bad_alloc&)
8375 {
8376 return gl::error(GL_OUT_OF_MEMORY);
8377 }
8378}
8379
8380const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8381{
8382 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8383
8384 try
8385 {
8386 gl::Context *context = gl::getNonLostContext();
8387
8388 if (context)
8389 {
8390 if (context->getClientVersion() < 3)
8391 {
8392 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8393 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008394
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008395 if (name != GL_EXTENSIONS)
8396 {
8397 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8398 }
8399
8400 if (index >= context->getNumExtensions())
8401 {
8402 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8403 }
8404
8405 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8406 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008407 }
8408 catch(std::bad_alloc&)
8409 {
8410 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8411 }
8412
8413 return NULL;
8414}
8415
8416void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8417{
8418 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8419 readTarget, writeTarget, readOffset, writeOffset, size);
8420
8421 try
8422 {
8423 gl::Context *context = gl::getNonLostContext();
8424
8425 if (context)
8426 {
8427 if (context->getClientVersion() < 3)
8428 {
8429 return gl::error(GL_INVALID_OPERATION);
8430 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008431
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008432 gl::Buffer *readBuffer = NULL;
8433 switch (readTarget)
8434 {
8435 case GL_ARRAY_BUFFER:
8436 readBuffer = context->getArrayBuffer();
8437 break;
8438 case GL_COPY_READ_BUFFER:
8439 readBuffer = context->getCopyReadBuffer();
8440 break;
8441 case GL_COPY_WRITE_BUFFER:
8442 readBuffer = context->getCopyWriteBuffer();
8443 break;
8444 case GL_ELEMENT_ARRAY_BUFFER:
8445 readBuffer = context->getElementArrayBuffer();
8446 break;
8447 case GL_PIXEL_PACK_BUFFER:
8448 readBuffer = context->getPixelPackBuffer();
8449 break;
8450 case GL_PIXEL_UNPACK_BUFFER:
8451 readBuffer = context->getPixelUnpackBuffer();
8452 break;
8453 case GL_TRANSFORM_FEEDBACK_BUFFER:
8454 readBuffer = context->getGenericTransformFeedbackBuffer();
8455 break;
8456 case GL_UNIFORM_BUFFER:
8457 readBuffer = context->getGenericUniformBuffer();
8458 break;
8459 default:
8460 return gl::error(GL_INVALID_ENUM);
8461 }
8462
8463 gl::Buffer *writeBuffer = NULL;
8464 switch (writeTarget)
8465 {
8466 case GL_ARRAY_BUFFER:
8467 writeBuffer = context->getArrayBuffer();
8468 break;
8469 case GL_COPY_READ_BUFFER:
8470 writeBuffer = context->getCopyReadBuffer();
8471 break;
8472 case GL_COPY_WRITE_BUFFER:
8473 writeBuffer = context->getCopyWriteBuffer();
8474 break;
8475 case GL_ELEMENT_ARRAY_BUFFER:
8476 writeBuffer = context->getElementArrayBuffer();
8477 break;
8478 case GL_PIXEL_PACK_BUFFER:
8479 writeBuffer = context->getPixelPackBuffer();
8480 break;
8481 case GL_PIXEL_UNPACK_BUFFER:
8482 writeBuffer = context->getPixelUnpackBuffer();
8483 break;
8484 case GL_TRANSFORM_FEEDBACK_BUFFER:
8485 writeBuffer = context->getGenericTransformFeedbackBuffer();
8486 break;
8487 case GL_UNIFORM_BUFFER:
8488 writeBuffer = context->getGenericUniformBuffer();
8489 break;
8490 default:
8491 return gl::error(GL_INVALID_ENUM);
8492 }
8493
8494 if (!readBuffer || !writeBuffer)
8495 {
8496 return gl::error(GL_INVALID_OPERATION);
8497 }
8498
8499 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8500 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8501 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8502 {
8503 return gl::error(GL_INVALID_VALUE);
8504 }
8505
8506 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8507 {
8508 return gl::error(GL_INVALID_VALUE);
8509 }
8510
8511 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8512
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008513 // if size is zero, the copy is a successful no-op
8514 if (size > 0)
8515 {
8516 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8517 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008518 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008519 }
8520 catch(std::bad_alloc&)
8521 {
8522 return gl::error(GL_OUT_OF_MEMORY);
8523 }
8524}
8525
8526void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8527{
8528 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8529 program, uniformCount, uniformNames, uniformIndices);
8530
8531 try
8532 {
8533 gl::Context *context = gl::getNonLostContext();
8534
8535 if (context)
8536 {
8537 if (context->getClientVersion() < 3)
8538 {
8539 return gl::error(GL_INVALID_OPERATION);
8540 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008541
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008542 if (uniformCount < 0)
8543 {
8544 return gl::error(GL_INVALID_VALUE);
8545 }
8546
8547 gl::Program *programObject = context->getProgram(program);
8548
8549 if (!programObject)
8550 {
8551 if (context->getShader(program))
8552 {
8553 return gl::error(GL_INVALID_OPERATION);
8554 }
8555 else
8556 {
8557 return gl::error(GL_INVALID_VALUE);
8558 }
8559 }
8560
8561 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8562 if (!programObject->isLinked() || !programBinary)
8563 {
8564 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8565 {
8566 uniformIndices[uniformId] = GL_INVALID_INDEX;
8567 }
8568 }
8569 else
8570 {
8571 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8572 {
8573 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8574 }
8575 }
8576 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008577 }
8578 catch(std::bad_alloc&)
8579 {
8580 return gl::error(GL_OUT_OF_MEMORY);
8581 }
8582}
8583
8584void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8585{
8586 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8587 program, uniformCount, uniformIndices, pname, params);
8588
8589 try
8590 {
8591 gl::Context *context = gl::getNonLostContext();
8592
8593 if (context)
8594 {
8595 if (context->getClientVersion() < 3)
8596 {
8597 return gl::error(GL_INVALID_OPERATION);
8598 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008599
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008600 if (uniformCount < 0)
8601 {
8602 return gl::error(GL_INVALID_VALUE);
8603 }
8604
8605 gl::Program *programObject = context->getProgram(program);
8606
8607 if (!programObject)
8608 {
8609 if (context->getShader(program))
8610 {
8611 return gl::error(GL_INVALID_OPERATION);
8612 }
8613 else
8614 {
8615 return gl::error(GL_INVALID_VALUE);
8616 }
8617 }
8618
8619 switch (pname)
8620 {
8621 case GL_UNIFORM_TYPE:
8622 case GL_UNIFORM_SIZE:
8623 case GL_UNIFORM_NAME_LENGTH:
8624 case GL_UNIFORM_BLOCK_INDEX:
8625 case GL_UNIFORM_OFFSET:
8626 case GL_UNIFORM_ARRAY_STRIDE:
8627 case GL_UNIFORM_MATRIX_STRIDE:
8628 case GL_UNIFORM_IS_ROW_MAJOR:
8629 break;
8630 default:
8631 return gl::error(GL_INVALID_ENUM);
8632 }
8633
8634 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8635
8636 if (!programBinary && uniformCount > 0)
8637 {
8638 return gl::error(GL_INVALID_VALUE);
8639 }
8640
8641 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8642 {
8643 const GLuint index = uniformIndices[uniformId];
8644
8645 if (index >= (GLuint)programBinary->getActiveUniformCount())
8646 {
8647 return gl::error(GL_INVALID_VALUE);
8648 }
8649 }
8650
8651 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8652 {
8653 const GLuint index = uniformIndices[uniformId];
8654 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8655 }
8656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008657 }
8658 catch(std::bad_alloc&)
8659 {
8660 return gl::error(GL_OUT_OF_MEMORY);
8661 }
8662}
8663
8664GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8665{
8666 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8667
8668 try
8669 {
8670 gl::Context *context = gl::getNonLostContext();
8671
8672 if (context)
8673 {
8674 if (context->getClientVersion() < 3)
8675 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008676 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008677 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008678
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008679 gl::Program *programObject = context->getProgram(program);
8680
8681 if (!programObject)
8682 {
8683 if (context->getShader(program))
8684 {
8685 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8686 }
8687 else
8688 {
8689 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8690 }
8691 }
8692
8693 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8694 if (!programBinary)
8695 {
8696 return GL_INVALID_INDEX;
8697 }
8698
8699 return programBinary->getUniformBlockIndex(uniformBlockName);
8700 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008701 }
8702 catch(std::bad_alloc&)
8703 {
8704 return gl::error(GL_OUT_OF_MEMORY, 0);
8705 }
8706
8707 return 0;
8708}
8709
8710void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8711{
8712 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8713 program, uniformBlockIndex, pname, params);
8714
8715 try
8716 {
8717 gl::Context *context = gl::getNonLostContext();
8718
8719 if (context)
8720 {
8721 if (context->getClientVersion() < 3)
8722 {
8723 return gl::error(GL_INVALID_OPERATION);
8724 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008725 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008726
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008727 if (!programObject)
8728 {
8729 if (context->getShader(program))
8730 {
8731 return gl::error(GL_INVALID_OPERATION);
8732 }
8733 else
8734 {
8735 return gl::error(GL_INVALID_VALUE);
8736 }
8737 }
8738
8739 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8740
8741 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8742 {
8743 return gl::error(GL_INVALID_VALUE);
8744 }
8745
8746 switch (pname)
8747 {
8748 case GL_UNIFORM_BLOCK_BINDING:
8749 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8750 break;
8751
8752 case GL_UNIFORM_BLOCK_DATA_SIZE:
8753 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8754 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8755 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8756 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8757 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8758 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8759 break;
8760
8761 default:
8762 return gl::error(GL_INVALID_ENUM);
8763 }
8764 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008765 }
8766 catch(std::bad_alloc&)
8767 {
8768 return gl::error(GL_OUT_OF_MEMORY);
8769 }
8770}
8771
8772void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8773{
8774 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8775 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8776
8777 try
8778 {
8779 gl::Context *context = gl::getNonLostContext();
8780
8781 if (context)
8782 {
8783 if (context->getClientVersion() < 3)
8784 {
8785 return gl::error(GL_INVALID_OPERATION);
8786 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008787
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008788 gl::Program *programObject = context->getProgram(program);
8789
8790 if (!programObject)
8791 {
8792 if (context->getShader(program))
8793 {
8794 return gl::error(GL_INVALID_OPERATION);
8795 }
8796 else
8797 {
8798 return gl::error(GL_INVALID_VALUE);
8799 }
8800 }
8801
8802 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8803
8804 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8805 {
8806 return gl::error(GL_INVALID_VALUE);
8807 }
8808
8809 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8810 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008811 }
8812 catch(std::bad_alloc&)
8813 {
8814 return gl::error(GL_OUT_OF_MEMORY);
8815 }
8816}
8817
8818void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8819{
8820 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8821 program, uniformBlockIndex, uniformBlockBinding);
8822
8823 try
8824 {
8825 gl::Context *context = gl::getNonLostContext();
8826
8827 if (context)
8828 {
8829 if (context->getClientVersion() < 3)
8830 {
8831 return gl::error(GL_INVALID_OPERATION);
8832 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008833
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008834 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8835 {
8836 return gl::error(GL_INVALID_VALUE);
8837 }
8838
8839 gl::Program *programObject = context->getProgram(program);
8840
8841 if (!programObject)
8842 {
8843 if (context->getShader(program))
8844 {
8845 return gl::error(GL_INVALID_OPERATION);
8846 }
8847 else
8848 {
8849 return gl::error(GL_INVALID_VALUE);
8850 }
8851 }
8852
8853 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8854
8855 // if never linked, there won't be any uniform blocks
8856 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8857 {
8858 return gl::error(GL_INVALID_VALUE);
8859 }
8860
8861 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8862 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008863 }
8864 catch(std::bad_alloc&)
8865 {
8866 return gl::error(GL_OUT_OF_MEMORY);
8867 }
8868}
8869
8870void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8871{
8872 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8873 mode, first, count, instanceCount);
8874
8875 try
8876 {
8877 gl::Context *context = gl::getNonLostContext();
8878
8879 if (context)
8880 {
8881 if (context->getClientVersion() < 3)
8882 {
8883 return gl::error(GL_INVALID_OPERATION);
8884 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008885
Jamie Madill54133512013-06-21 09:33:07 -04008886 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008887 UNIMPLEMENTED();
8888 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008889 }
8890 catch(std::bad_alloc&)
8891 {
8892 return gl::error(GL_OUT_OF_MEMORY);
8893 }
8894}
8895
8896void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8897{
8898 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8899 mode, count, type, indices, instanceCount);
8900
8901 try
8902 {
8903 gl::Context *context = gl::getNonLostContext();
8904
8905 if (context)
8906 {
8907 if (context->getClientVersion() < 3)
8908 {
8909 return gl::error(GL_INVALID_OPERATION);
8910 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008911
Jamie Madill54133512013-06-21 09:33:07 -04008912 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008913 UNIMPLEMENTED();
8914 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008915 }
8916 catch(std::bad_alloc&)
8917 {
8918 return gl::error(GL_OUT_OF_MEMORY);
8919 }
8920}
8921
8922GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8923{
8924 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8925
8926 try
8927 {
8928 gl::Context *context = gl::getNonLostContext();
8929
8930 if (context)
8931 {
8932 if (context->getClientVersion() < 3)
8933 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008934 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008935 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008936
Jamie Madill5215e1a2013-07-26 11:55:19 -04008937 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8938 {
8939 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8940 }
8941
8942 if (flags != 0)
8943 {
8944 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8945 }
8946
8947 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008948 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008949 }
8950 catch(std::bad_alloc&)
8951 {
8952 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8953 }
8954
8955 return NULL;
8956}
8957
8958GLboolean __stdcall glIsSync(GLsync sync)
8959{
8960 EVENT("(GLsync sync = 0x%0.8p)", sync);
8961
8962 try
8963 {
8964 gl::Context *context = gl::getNonLostContext();
8965
8966 if (context)
8967 {
8968 if (context->getClientVersion() < 3)
8969 {
8970 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8971 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008972
Jamie Madill5215e1a2013-07-26 11:55:19 -04008973 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008974 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008975 }
8976 catch(std::bad_alloc&)
8977 {
8978 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8979 }
8980
8981 return GL_FALSE;
8982}
8983
8984void __stdcall glDeleteSync(GLsync sync)
8985{
8986 EVENT("(GLsync sync = 0x%0.8p)", sync);
8987
8988 try
8989 {
8990 gl::Context *context = gl::getNonLostContext();
8991
8992 if (context)
8993 {
8994 if (context->getClientVersion() < 3)
8995 {
8996 return gl::error(GL_INVALID_OPERATION);
8997 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008998
Jamie Madill5215e1a2013-07-26 11:55:19 -04008999 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
9000 {
9001 return gl::error(GL_INVALID_VALUE);
9002 }
9003
9004 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009005 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009006 }
9007 catch(std::bad_alloc&)
9008 {
9009 return gl::error(GL_OUT_OF_MEMORY);
9010 }
9011}
9012
9013GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9014{
9015 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9016 sync, flags, timeout);
9017
9018 try
9019 {
9020 gl::Context *context = gl::getNonLostContext();
9021
9022 if (context)
9023 {
9024 if (context->getClientVersion() < 3)
9025 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009026 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009027 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009028
Jamie Madill5215e1a2013-07-26 11:55:19 -04009029 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
9030 {
9031 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9032 }
9033
9034 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9035
9036 if (!fenceSync)
9037 {
9038 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9039 }
9040
9041 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009042 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009043 }
9044 catch(std::bad_alloc&)
9045 {
9046 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9047 }
9048
9049 return GL_FALSE;
9050}
9051
9052void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9053{
9054 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9055 sync, flags, timeout);
9056
9057 try
9058 {
9059 gl::Context *context = gl::getNonLostContext();
9060
9061 if (context)
9062 {
9063 if (context->getClientVersion() < 3)
9064 {
9065 return gl::error(GL_INVALID_OPERATION);
9066 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009067
Jamie Madill5215e1a2013-07-26 11:55:19 -04009068 if (flags != 0)
9069 {
9070 return gl::error(GL_INVALID_VALUE);
9071 }
9072
9073 if (timeout != GL_TIMEOUT_IGNORED)
9074 {
9075 return gl::error(GL_INVALID_VALUE);
9076 }
9077
9078 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9079
9080 if (!fenceSync)
9081 {
9082 return gl::error(GL_INVALID_VALUE);
9083 }
9084
9085 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009086 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009087 }
9088 catch(std::bad_alloc&)
9089 {
9090 return gl::error(GL_OUT_OF_MEMORY);
9091 }
9092}
9093
9094void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9095{
9096 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9097 pname, params);
9098
9099 try
9100 {
9101 gl::Context *context = gl::getNonLostContext();
9102
9103 if (context)
9104 {
9105 if (context->getClientVersion() < 3)
9106 {
9107 return gl::error(GL_INVALID_OPERATION);
9108 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009109
Jamie Madill79f2f452013-12-19 11:13:02 -05009110 GLenum nativeType;
9111 unsigned int numParams = 0;
9112 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9113 return gl::error(GL_INVALID_ENUM);
9114
9115 // pname is valid, but that there are no parameters to return.
9116 if (numParams == 0)
9117 return;
9118
9119 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009120 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009121 context->getInteger64v(pname, params);
9122 }
Jamie Madill55856b12014-01-02 13:59:50 -05009123 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009124 {
Jamie Madill55856b12014-01-02 13:59:50 -05009125 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009126 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009127 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009128 }
9129 catch(std::bad_alloc&)
9130 {
9131 return gl::error(GL_OUT_OF_MEMORY);
9132 }
9133}
9134
9135void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9136{
9137 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9138 sync, pname, bufSize, length, values);
9139
9140 try
9141 {
9142 gl::Context *context = gl::getNonLostContext();
9143
9144 if (context)
9145 {
9146 if (context->getClientVersion() < 3)
9147 {
9148 return gl::error(GL_INVALID_OPERATION);
9149 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009150
Jamie Madill5215e1a2013-07-26 11:55:19 -04009151 if (bufSize < 0)
9152 {
9153 return gl::error(GL_INVALID_VALUE);
9154 }
9155
9156 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9157
9158 if (!fenceSync)
9159 {
9160 return gl::error(GL_INVALID_VALUE);
9161 }
9162
9163 switch (pname)
9164 {
9165 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9166 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9167 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9168 case GL_SYNC_FLAGS: values[0] = 0; break;
9169
9170 default:
9171 return gl::error(GL_INVALID_ENUM);
9172 }
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);
9178 }
9179}
9180
9181void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9182{
9183 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9184 target, index, data);
9185
9186 try
9187 {
9188 gl::Context *context = gl::getNonLostContext();
9189
9190 if (context)
9191 {
9192 if (context->getClientVersion() < 3)
9193 {
9194 return gl::error(GL_INVALID_OPERATION);
9195 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009196
Shannon Woods15934d52013-08-19 14:28:49 -04009197 switch (target)
9198 {
9199 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9200 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9201 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9202 if (index >= context->getMaxTransformFeedbackBufferBindings())
9203 return gl::error(GL_INVALID_VALUE);
9204 break;
9205 case GL_UNIFORM_BUFFER_START:
9206 case GL_UNIFORM_BUFFER_SIZE:
9207 case GL_UNIFORM_BUFFER_BINDING:
9208 if (index >= context->getMaximumCombinedUniformBufferBindings())
9209 return gl::error(GL_INVALID_VALUE);
9210 break;
9211 default:
9212 return gl::error(GL_INVALID_ENUM);
9213 }
9214
9215 if (!(context->getIndexedInteger64v(target, index, data)))
9216 {
9217 GLenum nativeType;
9218 unsigned int numParams = 0;
9219 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9220 return gl::error(GL_INVALID_ENUM);
9221
9222 if (numParams == 0)
9223 return; // it is known that pname is valid, but there are no parameters to return
9224
9225 if (nativeType == GL_INT)
9226 {
9227 GLint *intParams = new GLint[numParams];
9228
9229 context->getIndexedIntegerv(target, index, intParams);
9230
9231 for (unsigned int i = 0; i < numParams; ++i)
9232 {
9233 data[i] = static_cast<GLint64>(intParams[i]);
9234 }
9235
9236 delete [] intParams;
9237 }
9238 else
9239 {
9240 UNREACHABLE();
9241 }
9242 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009243 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009244 }
9245 catch(std::bad_alloc&)
9246 {
9247 return gl::error(GL_OUT_OF_MEMORY);
9248 }
9249}
9250
9251void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9252{
9253 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9254 target, pname, params);
9255
9256 try
9257 {
9258 gl::Context *context = gl::getNonLostContext();
9259
9260 if (context)
9261 {
9262 if (context->getClientVersion() < 3)
9263 {
9264 return gl::error(GL_INVALID_OPERATION);
9265 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009266
Jamie Madill54133512013-06-21 09:33:07 -04009267 // glGetBufferParameteri64v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009268 UNIMPLEMENTED();
9269 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009270 }
9271 catch(std::bad_alloc&)
9272 {
9273 return gl::error(GL_OUT_OF_MEMORY);
9274 }
9275}
9276
9277void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9278{
9279 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9280
9281 try
9282 {
9283 gl::Context *context = gl::getNonLostContext();
9284
9285 if (context)
9286 {
9287 if (context->getClientVersion() < 3)
9288 {
9289 return gl::error(GL_INVALID_OPERATION);
9290 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009291
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009292 if (count < 0)
9293 {
9294 return gl::error(GL_INVALID_VALUE);
9295 }
9296
9297 for (int i = 0; i < count; i++)
9298 {
9299 samplers[i] = context->createSampler();
9300 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009301 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009302 }
9303 catch(std::bad_alloc&)
9304 {
9305 return gl::error(GL_OUT_OF_MEMORY);
9306 }
9307}
9308
9309void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9310{
9311 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9312
9313 try
9314 {
9315 gl::Context *context = gl::getNonLostContext();
9316
9317 if (context)
9318 {
9319 if (context->getClientVersion() < 3)
9320 {
9321 return gl::error(GL_INVALID_OPERATION);
9322 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009323
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009324 if (count < 0)
9325 {
9326 return gl::error(GL_INVALID_VALUE);
9327 }
9328
9329 for (int i = 0; i < count; i++)
9330 {
9331 context->deleteSampler(samplers[i]);
9332 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009333 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009334 }
9335 catch(std::bad_alloc&)
9336 {
9337 return gl::error(GL_OUT_OF_MEMORY);
9338 }
9339}
9340
9341GLboolean __stdcall glIsSampler(GLuint sampler)
9342{
9343 EVENT("(GLuint sampler = %u)", sampler);
9344
9345 try
9346 {
9347 gl::Context *context = gl::getNonLostContext();
9348
9349 if (context)
9350 {
9351 if (context->getClientVersion() < 3)
9352 {
9353 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9354 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009355
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009356 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009357 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009358 }
9359 catch(std::bad_alloc&)
9360 {
9361 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9362 }
9363
9364 return GL_FALSE;
9365}
9366
9367void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9368{
9369 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9370
9371 try
9372 {
9373 gl::Context *context = gl::getNonLostContext();
9374
9375 if (context)
9376 {
9377 if (context->getClientVersion() < 3)
9378 {
9379 return gl::error(GL_INVALID_OPERATION);
9380 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009381
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009382 if (sampler != 0 && !context->isSampler(sampler))
9383 {
9384 return gl::error(GL_INVALID_OPERATION);
9385 }
9386
9387 if (unit >= context->getMaximumCombinedTextureImageUnits())
9388 {
9389 return gl::error(GL_INVALID_VALUE);
9390 }
9391
9392 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009393 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009394 }
9395 catch(std::bad_alloc&)
9396 {
9397 return gl::error(GL_OUT_OF_MEMORY);
9398 }
9399}
9400
9401void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9402{
9403 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9404
9405 try
9406 {
9407 gl::Context *context = gl::getNonLostContext();
9408
9409 if (context)
9410 {
9411 if (context->getClientVersion() < 3)
9412 {
9413 return gl::error(GL_INVALID_OPERATION);
9414 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009415
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009416 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009417 {
9418 return;
9419 }
9420
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009421 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009422 {
9423 return;
9424 }
9425
9426 if (!context->isSampler(sampler))
9427 {
9428 return gl::error(GL_INVALID_OPERATION);
9429 }
9430
9431 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009432 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009433 }
9434 catch(std::bad_alloc&)
9435 {
9436 return gl::error(GL_OUT_OF_MEMORY);
9437 }
9438}
9439
9440void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9441{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009442 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009443}
9444
9445void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9446{
9447 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9448
9449 try
9450 {
9451 gl::Context *context = gl::getNonLostContext();
9452
9453 if (context)
9454 {
9455 if (context->getClientVersion() < 3)
9456 {
9457 return gl::error(GL_INVALID_OPERATION);
9458 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009459
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009460 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009461 {
9462 return;
9463 }
9464
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009465 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009466 {
9467 return;
9468 }
9469
9470 if (!context->isSampler(sampler))
9471 {
9472 return gl::error(GL_INVALID_OPERATION);
9473 }
9474
9475 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009476 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009477 }
9478 catch(std::bad_alloc&)
9479 {
9480 return gl::error(GL_OUT_OF_MEMORY);
9481 }
9482}
9483
9484void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9485{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009486 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009487}
9488
9489void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9490{
9491 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9492
9493 try
9494 {
9495 gl::Context *context = gl::getNonLostContext();
9496
9497 if (context)
9498 {
9499 if (context->getClientVersion() < 3)
9500 {
9501 return gl::error(GL_INVALID_OPERATION);
9502 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009503
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009504 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009505 {
9506 return;
9507 }
9508
9509 if (!context->isSampler(sampler))
9510 {
9511 return gl::error(GL_INVALID_OPERATION);
9512 }
9513
9514 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009515 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009516 }
9517 catch(std::bad_alloc&)
9518 {
9519 return gl::error(GL_OUT_OF_MEMORY);
9520 }
9521}
9522
9523void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9524{
9525 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9526
9527 try
9528 {
9529 gl::Context *context = gl::getNonLostContext();
9530
9531 if (context)
9532 {
9533 if (context->getClientVersion() < 3)
9534 {
9535 return gl::error(GL_INVALID_OPERATION);
9536 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009537
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009538 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009539 {
9540 return;
9541 }
9542
9543 if (!context->isSampler(sampler))
9544 {
9545 return gl::error(GL_INVALID_OPERATION);
9546 }
9547
9548 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009549 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009550 }
9551 catch(std::bad_alloc&)
9552 {
9553 return gl::error(GL_OUT_OF_MEMORY);
9554 }
9555}
9556
9557void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9558{
9559 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9560
9561 try
9562 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009563 if (index >= gl::MAX_VERTEX_ATTRIBS)
9564 {
9565 return gl::error(GL_INVALID_VALUE);
9566 }
9567
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009568 gl::Context *context = gl::getNonLostContext();
9569
9570 if (context)
9571 {
9572 if (context->getClientVersion() < 3)
9573 {
9574 return gl::error(GL_INVALID_OPERATION);
9575 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009576
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009577 context->setVertexAttribDivisor(index, divisor);
9578 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009579 }
9580 catch(std::bad_alloc&)
9581 {
9582 return gl::error(GL_OUT_OF_MEMORY);
9583 }
9584}
9585
9586void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9587{
9588 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9589
9590 try
9591 {
9592 gl::Context *context = gl::getNonLostContext();
9593
9594 if (context)
9595 {
9596 if (context->getClientVersion() < 3)
9597 {
9598 return gl::error(GL_INVALID_OPERATION);
9599 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009600
Jamie Madill54133512013-06-21 09:33:07 -04009601 // glBindTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009602 UNIMPLEMENTED();
9603 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009604 }
9605 catch(std::bad_alloc&)
9606 {
9607 return gl::error(GL_OUT_OF_MEMORY);
9608 }
9609}
9610
9611void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9612{
9613 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9614
9615 try
9616 {
9617 gl::Context *context = gl::getNonLostContext();
9618
9619 if (context)
9620 {
9621 if (context->getClientVersion() < 3)
9622 {
9623 return gl::error(GL_INVALID_OPERATION);
9624 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009625
Jamie Madill54133512013-06-21 09:33:07 -04009626 // glDeleteTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009627 UNIMPLEMENTED();
9628 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009629 }
9630 catch(std::bad_alloc&)
9631 {
9632 return gl::error(GL_OUT_OF_MEMORY);
9633 }
9634}
9635
9636void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9637{
9638 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9639
9640 try
9641 {
9642 gl::Context *context = gl::getNonLostContext();
9643
9644 if (context)
9645 {
9646 if (context->getClientVersion() < 3)
9647 {
9648 return gl::error(GL_INVALID_OPERATION);
9649 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009650
Jamie Madill54133512013-06-21 09:33:07 -04009651 // glGenTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009652 UNIMPLEMENTED();
9653 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009654 }
9655 catch(std::bad_alloc&)
9656 {
9657 return gl::error(GL_OUT_OF_MEMORY);
9658 }
9659}
9660
9661GLboolean __stdcall glIsTransformFeedback(GLuint id)
9662{
9663 EVENT("(GLuint id = %u)", id);
9664
9665 try
9666 {
9667 gl::Context *context = gl::getNonLostContext();
9668
9669 if (context)
9670 {
9671 if (context->getClientVersion() < 3)
9672 {
9673 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9674 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009675
Jamie Madill54133512013-06-21 09:33:07 -04009676 // glIsTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009677 UNIMPLEMENTED();
9678 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009679 }
9680 catch(std::bad_alloc&)
9681 {
9682 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9683 }
9684
9685 return GL_FALSE;
9686}
9687
9688void __stdcall glPauseTransformFeedback(void)
9689{
9690 EVENT("(void)");
9691
9692 try
9693 {
9694 gl::Context *context = gl::getNonLostContext();
9695
9696 if (context)
9697 {
9698 if (context->getClientVersion() < 3)
9699 {
9700 return gl::error(GL_INVALID_OPERATION);
9701 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009702
Jamie Madill54133512013-06-21 09:33:07 -04009703 // glPauseTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009704 UNIMPLEMENTED();
9705 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009706 }
9707 catch(std::bad_alloc&)
9708 {
9709 return gl::error(GL_OUT_OF_MEMORY);
9710 }
9711}
9712
9713void __stdcall glResumeTransformFeedback(void)
9714{
9715 EVENT("(void)");
9716
9717 try
9718 {
9719 gl::Context *context = gl::getNonLostContext();
9720
9721 if (context)
9722 {
9723 if (context->getClientVersion() < 3)
9724 {
9725 return gl::error(GL_INVALID_OPERATION);
9726 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009727
Jamie Madill54133512013-06-21 09:33:07 -04009728 // glResumeTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009729 UNIMPLEMENTED();
9730 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009731 }
9732 catch(std::bad_alloc&)
9733 {
9734 return gl::error(GL_OUT_OF_MEMORY);
9735 }
9736}
9737
9738void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9739{
9740 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9741 program, bufSize, length, binaryFormat, binary);
9742
9743 try
9744 {
9745 gl::Context *context = gl::getNonLostContext();
9746
9747 if (context)
9748 {
9749 if (context->getClientVersion() < 3)
9750 {
9751 return gl::error(GL_INVALID_OPERATION);
9752 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009753
Jamie Madill54133512013-06-21 09:33:07 -04009754 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009755 UNIMPLEMENTED();
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 glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9765{
9766 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9767 program, binaryFormat, binary, length);
9768
9769 try
9770 {
9771 gl::Context *context = gl::getNonLostContext();
9772
9773 if (context)
9774 {
9775 if (context->getClientVersion() < 3)
9776 {
9777 return gl::error(GL_INVALID_OPERATION);
9778 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009779
Jamie Madill54133512013-06-21 09:33:07 -04009780 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009781 UNIMPLEMENTED();
9782 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009783 }
9784 catch(std::bad_alloc&)
9785 {
9786 return gl::error(GL_OUT_OF_MEMORY);
9787 }
9788}
9789
9790void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9791{
9792 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9793 program, pname, value);
9794
9795 try
9796 {
9797 gl::Context *context = gl::getNonLostContext();
9798
9799 if (context)
9800 {
9801 if (context->getClientVersion() < 3)
9802 {
9803 return gl::error(GL_INVALID_OPERATION);
9804 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009805
Jamie Madill54133512013-06-21 09:33:07 -04009806 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009807 UNIMPLEMENTED();
9808 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009809 }
9810 catch(std::bad_alloc&)
9811 {
9812 return gl::error(GL_OUT_OF_MEMORY);
9813 }
9814}
9815
9816void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9817{
9818 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9819 target, numAttachments, attachments);
9820
9821 try
9822 {
9823 gl::Context *context = gl::getNonLostContext();
9824
9825 if (context)
9826 {
9827 if (context->getClientVersion() < 3)
9828 {
9829 return gl::error(GL_INVALID_OPERATION);
9830 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009831
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009832 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009833 {
9834 return;
9835 }
9836
9837 int maxDimension = context->getMaximumRenderbufferDimension();
9838 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9839 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009840 }
9841 catch(std::bad_alloc&)
9842 {
9843 return gl::error(GL_OUT_OF_MEMORY);
9844 }
9845}
9846
9847void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9848{
9849 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9850 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9851 target, numAttachments, attachments, x, y, width, height);
9852
9853 try
9854 {
9855 gl::Context *context = gl::getNonLostContext();
9856
9857 if (context)
9858 {
9859 if (context->getClientVersion() < 3)
9860 {
9861 return gl::error(GL_INVALID_OPERATION);
9862 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009863
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009864 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009865 {
9866 return;
9867 }
9868
9869 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9870 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009871 }
9872 catch(std::bad_alloc&)
9873 {
9874 return gl::error(GL_OUT_OF_MEMORY);
9875 }
9876}
9877
9878void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9879{
9880 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9881 target, levels, internalformat, width, height);
9882
9883 try
9884 {
9885 gl::Context *context = gl::getNonLostContext();
9886
9887 if (context)
9888 {
9889 if (context->getClientVersion() < 3)
9890 {
9891 return gl::error(GL_INVALID_OPERATION);
9892 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009893
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009894 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009895 {
9896 return;
9897 }
9898
9899 switch (target)
9900 {
9901 case GL_TEXTURE_2D:
9902 {
9903 gl::Texture2D *texture2d = context->getTexture2D();
9904 texture2d->storage(levels, internalformat, width, height);
9905 }
9906 break;
9907
Geoff Lang01c21d22013-09-24 11:52:16 -04009908 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009909 {
9910 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9911 textureCube->storage(levels, internalformat, width);
9912 }
9913 break;
9914
9915 default:
9916 return gl::error(GL_INVALID_ENUM);
9917 }
9918 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009919 }
9920 catch(std::bad_alloc&)
9921 {
9922 return gl::error(GL_OUT_OF_MEMORY);
9923 }
9924}
9925
9926void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9927{
9928 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9929 "GLsizei height = %d, GLsizei depth = %d)",
9930 target, levels, internalformat, width, height, depth);
9931
9932 try
9933 {
9934 gl::Context *context = gl::getNonLostContext();
9935
9936 if (context)
9937 {
9938 if (context->getClientVersion() < 3)
9939 {
9940 return gl::error(GL_INVALID_OPERATION);
9941 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009942
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009943 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009944 {
9945 return;
9946 }
9947
9948 switch (target)
9949 {
9950 case GL_TEXTURE_3D:
9951 {
9952 gl::Texture3D *texture3d = context->getTexture3D();
9953 texture3d->storage(levels, internalformat, width, height, depth);
9954 }
9955 break;
9956
9957 case GL_TEXTURE_2D_ARRAY:
9958 {
9959 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9960 texture2darray->storage(levels, internalformat, width, height, depth);
9961 }
9962 break;
9963
9964 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009965 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009966 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009967 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009968 }
9969 catch(std::bad_alloc&)
9970 {
9971 return gl::error(GL_OUT_OF_MEMORY);
9972 }
9973}
9974
9975void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9976{
9977 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9978 "GLint* params = 0x%0.8p)",
9979 target, internalformat, pname, bufSize, params);
9980
9981 try
9982 {
9983 gl::Context *context = gl::getNonLostContext();
9984
9985 if (context)
9986 {
9987 if (context->getClientVersion() < 3)
9988 {
9989 return gl::error(GL_INVALID_OPERATION);
9990 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009991
Shannon Woods809d2502013-07-08 10:32:18 -04009992 if (!gl::IsColorRenderingSupported(internalformat, context) &&
9993 !gl::IsDepthRenderingSupported(internalformat, context) &&
9994 !gl::IsStencilRenderingSupported(internalformat, context))
9995 {
9996 return gl::error(GL_INVALID_ENUM);
9997 }
9998
9999 if (target != GL_RENDERBUFFER)
10000 {
10001 return gl::error(GL_INVALID_ENUM);
10002 }
10003
10004 if (bufSize < 0)
10005 {
10006 return gl::error(GL_INVALID_VALUE);
10007 }
10008
10009 switch (pname)
10010 {
10011 case GL_NUM_SAMPLE_COUNTS:
10012 if (bufSize != 0)
10013 *params = context->getNumSampleCounts(internalformat);
10014 break;
10015 case GL_SAMPLES:
10016 context->getSampleCounts(internalformat, bufSize, params);
10017 break;
10018 default:
10019 return gl::error(GL_INVALID_ENUM);
10020 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010021 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010022 }
10023 catch(std::bad_alloc&)
10024 {
10025 return gl::error(GL_OUT_OF_MEMORY);
10026 }
10027}
10028
10029// Extension functions
10030
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010031void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10032 GLbitfield mask, GLenum filter)
10033{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010034 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010035 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10036 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10037 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10038
10039 try
10040 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010041 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010042
10043 if (context)
10044 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010045 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010046 dstX0, dstY0, dstX1, dstY1, mask, filter,
10047 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010048 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010049 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010050 }
10051
Geoff Lang758d5b22013-06-11 11:42:50 -040010052 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10053 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010054 }
10055 }
10056 catch(std::bad_alloc&)
10057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010058 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010059 }
10060}
10061
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010062void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10063 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010064{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010065 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010066 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010067 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010068 target, level, internalformat, width, height, depth, border, format, type, pixels);
10069
10070 try
10071 {
10072 UNIMPLEMENTED(); // FIXME
10073 }
10074 catch(std::bad_alloc&)
10075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010076 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010077 }
10078}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010079
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010080void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10081 GLenum *binaryFormat, void *binary)
10082{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010083 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 +000010084 program, bufSize, length, binaryFormat, binary);
10085
10086 try
10087 {
10088 gl::Context *context = gl::getNonLostContext();
10089
10090 if (context)
10091 {
10092 gl::Program *programObject = context->getProgram(program);
10093
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010094 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010096 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010097 }
10098
10099 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10100
10101 if (!programBinary)
10102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010103 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010104 }
10105
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010106 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010108 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010109 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010110
10111 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010112 }
10113 }
10114 catch(std::bad_alloc&)
10115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010116 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010117 }
10118}
10119
10120void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10121 const void *binary, GLint length)
10122{
10123 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10124 program, binaryFormat, binary, length);
10125
10126 try
10127 {
10128 gl::Context *context = gl::getNonLostContext();
10129
10130 if (context)
10131 {
10132 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010134 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010135 }
10136
10137 gl::Program *programObject = context->getProgram(program);
10138
10139 if (!programObject)
10140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010141 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010142 }
10143
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010144 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010145 }
10146 }
10147 catch(std::bad_alloc&)
10148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010149 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010150 }
10151}
10152
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010153void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10154{
10155 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10156
10157 try
10158 {
10159 gl::Context *context = gl::getNonLostContext();
10160
10161 if (context)
10162 {
10163 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10164 {
10165 return gl::error(GL_INVALID_VALUE);
10166 }
10167
10168 if (context->getDrawFramebufferHandle() == 0)
10169 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010170 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010171 {
10172 return gl::error(GL_INVALID_OPERATION);
10173 }
10174
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010175 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010176 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010177 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010178 }
10179 }
10180 else
10181 {
10182 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10183 {
10184 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10185 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10186 {
10187 return gl::error(GL_INVALID_OPERATION);
10188 }
10189 }
10190 }
10191
10192 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10193
10194 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10195 {
10196 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10197 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010198
10199 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10200 {
10201 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10202 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010203 }
10204 }
10205 catch (std::bad_alloc&)
10206 {
10207 return gl::error(GL_OUT_OF_MEMORY);
10208 }
10209}
10210
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010211__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10212{
10213 struct Extension
10214 {
10215 const char *name;
10216 __eglMustCastToProperFunctionPointerType address;
10217 };
10218
10219 static const Extension glExtensions[] =
10220 {
10221 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010222 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010223 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010224 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10225 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10226 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10227 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10228 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10229 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10230 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010231 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010232 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010233 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10234 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10235 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10236 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010237 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10238 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10239 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10240 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10241 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10242 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10243 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010244 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010245 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10246 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10247 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010248 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10249 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010250
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010251 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010252 {
10253 if (strcmp(procname, glExtensions[ext].name) == 0)
10254 {
10255 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10256 }
10257 }
10258
10259 return NULL;
10260}
10261
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010262// Non-public functions used by EGL
10263
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010264bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010265{
10266 EVENT("(egl::Surface* surface = 0x%0.8p)",
10267 surface);
10268
10269 try
10270 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010271 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010272
10273 if (context)
10274 {
10275 gl::Texture2D *textureObject = context->getTexture2D();
10276
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010277 if (textureObject->isImmutable())
10278 {
10279 return false;
10280 }
10281
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010282 if (textureObject)
10283 {
10284 textureObject->bindTexImage(surface);
10285 }
10286 }
10287 }
10288 catch(std::bad_alloc&)
10289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010290 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010291 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010292
10293 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010294}
10295
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010296}