blob: 0364d3db196f97faf939310dfe4c2ecd8387c769 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00003// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040024#include "libGLESv2/VertexArray.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000025
Geoff Lange8ebe7f2013-08-05 15:03:13 -040026#include "libGLESv2/validationES.h"
27#include "libGLESv2/validationES2.h"
28#include "libGLESv2/validationES3.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040029
Jamie Madill35d15012013-10-07 10:46:37 -040030gl::Texture *GetTargetTexture(gl::Context *context, GLenum target)
Jamie Madillfb8a8302013-07-03 14:24:12 -040031{
Jamie Madill35d15012013-10-07 10:46:37 -040032 if (!ValidTextureTarget(context, target))
Jamie Madillfb8a8302013-07-03 14:24:12 -040033 {
Jamie Madill35d15012013-10-07 10:46:37 -040034 return NULL;
Jamie Madillfb8a8302013-07-03 14:24:12 -040035 }
36
37 switch (target)
38 {
39 case GL_TEXTURE_2D: return context->getTexture2D();
40 case GL_TEXTURE_CUBE_MAP: return context->getTextureCubeMap();
41 case GL_TEXTURE_3D: return context->getTexture3D();
42 case GL_TEXTURE_2D_ARRAY: return context->getTexture2DArray();
43 default: return NULL;
44 }
45}
Jamie Madill478fdb22013-07-19 16:36:59 -040046
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000047extern "C"
48{
49
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000050// OpenGL ES 2.0 functions
51
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000052void __stdcall glActiveTexture(GLenum texture)
53{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000054 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000055
56 try
57 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000058 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000059
60 if (context)
61 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000062 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
63 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000064 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000065 }
66
daniel@transgaming.com428d1582010-05-04 03:35:25 +000067 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068 }
69 }
70 catch(std::bad_alloc&)
71 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000072 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000073 }
74}
75
76void __stdcall glAttachShader(GLuint program, GLuint shader)
77{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000078 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000079
80 try
81 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000082 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000083
84 if (context)
85 {
86 gl::Program *programObject = context->getProgram(program);
87 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000088
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000089 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000090 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000091 if (context->getShader(program))
92 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000093 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000094 }
95 else
96 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000097 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000098 }
99 }
100
101 if (!shaderObject)
102 {
103 if (context->getProgram(shader))
104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000105 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000106 }
107 else
108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000109 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000110 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000111 }
112
113 if (!programObject->attachShader(shaderObject))
114 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000115 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000116 }
117 }
118 }
119 catch(std::bad_alloc&)
120 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000121 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000122 }
123}
124
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000125void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
126{
127 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
128
129 try
130 {
131 switch (target)
132 {
133 case GL_ANY_SAMPLES_PASSED_EXT:
134 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
135 break;
136 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000137 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000138 }
139
140 if (id == 0)
141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000142 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000143 }
144
145 gl::Context *context = gl::getNonLostContext();
146
147 if (context)
148 {
149 context->beginQuery(target, id);
150 }
151 }
152 catch(std::bad_alloc&)
153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000154 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000155 }
156}
157
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000158void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000159{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000160 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000161
162 try
163 {
164 if (index >= gl::MAX_VERTEX_ATTRIBS)
165 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000166 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000167 }
168
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000169 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000170
171 if (context)
172 {
173 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000174
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000175 if (!programObject)
176 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000177 if (context->getShader(program))
178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000179 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000180 }
181 else
182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000183 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000184 }
185 }
186
187 if (strncmp(name, "gl_", 3) == 0)
188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000189 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000190 }
191
192 programObject->bindAttributeLocation(index, name);
193 }
194 }
195 catch(std::bad_alloc&)
196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000197 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000198 }
199}
200
201void __stdcall glBindBuffer(GLenum target, GLuint buffer)
202{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000203 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000204
205 try
206 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000207 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000208
209 if (context)
210 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000211 // Check ES3 specific targets
212 switch (target)
213 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000214 case GL_COPY_READ_BUFFER:
215 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000216 case GL_PIXEL_PACK_BUFFER:
217 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000218 case GL_UNIFORM_BUFFER:
219 case GL_TRANSFORM_FEEDBACK_BUFFER:
220 if (context->getClientVersion() < 3)
221 {
222 return gl::error(GL_INVALID_ENUM);
223 }
224 }
225
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000226 switch (target)
227 {
228 case GL_ARRAY_BUFFER:
229 context->bindArrayBuffer(buffer);
230 return;
231 case GL_ELEMENT_ARRAY_BUFFER:
232 context->bindElementArrayBuffer(buffer);
233 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000234 case GL_COPY_READ_BUFFER:
235 context->bindCopyReadBuffer(buffer);
236 return;
237 case GL_COPY_WRITE_BUFFER:
238 context->bindCopyWriteBuffer(buffer);
239 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000240 case GL_PIXEL_PACK_BUFFER:
241 context->bindPixelPackBuffer(buffer);
242 return;
243 case GL_PIXEL_UNPACK_BUFFER:
244 context->bindPixelUnpackBuffer(buffer);
245 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000246 case GL_UNIFORM_BUFFER:
247 context->bindGenericUniformBuffer(buffer);
248 return;
249 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000250 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000251 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000252 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000253 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000254 }
255 }
256 }
257 catch(std::bad_alloc&)
258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000259 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000260 }
261}
262
263void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
264{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000265 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000266
267 try
268 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000269 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000271 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000272 }
273
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275
276 if (context)
277 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000278 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
279 {
280 context->bindReadFramebuffer(framebuffer);
281 }
282
283 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
284 {
285 context->bindDrawFramebuffer(framebuffer);
286 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000287 }
288 }
289 catch(std::bad_alloc&)
290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000291 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292 }
293}
294
295void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
296{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000297 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000298
299 try
300 {
301 if (target != GL_RENDERBUFFER)
302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000303 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000304 }
305
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000306 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000307
308 if (context)
309 {
310 context->bindRenderbuffer(renderbuffer);
311 }
312 }
313 catch(std::bad_alloc&)
314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000315 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000316 }
317}
318
319void __stdcall glBindTexture(GLenum target, GLuint texture)
320{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000321 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000322
323 try
324 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000325 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000326
327 if (context)
328 {
329 gl::Texture *textureObject = context->getTexture(texture);
330
331 if (textureObject && textureObject->getTarget() != target && texture != 0)
332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000333 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000334 }
335
336 switch (target)
337 {
338 case GL_TEXTURE_2D:
339 context->bindTexture2D(texture);
340 return;
341 case GL_TEXTURE_CUBE_MAP:
342 context->bindTextureCubeMap(texture);
343 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000344 case GL_TEXTURE_3D:
345 if (context->getClientVersion() < 3)
346 {
347 return gl::error(GL_INVALID_ENUM);
348 }
349 context->bindTexture3D(texture);
350 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000351 case GL_TEXTURE_2D_ARRAY:
352 if (context->getClientVersion() < 3)
353 {
354 return gl::error(GL_INVALID_ENUM);
355 }
356 context->bindTexture2DArray(texture);
357 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000358 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000359 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000360 }
361 }
362 }
363 catch(std::bad_alloc&)
364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000365 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000366 }
367}
368
369void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
370{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000371 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000372 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000373
374 try
375 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000376 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000377
378 if (context)
379 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000380 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000381 }
382 }
383 catch(std::bad_alloc&)
384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000385 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000386 }
387}
388
389void __stdcall glBlendEquation(GLenum mode)
390{
391 glBlendEquationSeparate(mode, mode);
392}
393
394void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
395{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000396 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000397
398 try
399 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000400 gl::Context *context = gl::getNonLostContext();
401
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402 switch (modeRGB)
403 {
404 case GL_FUNC_ADD:
405 case GL_FUNC_SUBTRACT:
406 case GL_FUNC_REVERSE_SUBTRACT:
407 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000408
409 case GL_MIN:
410 case GL_MAX:
411 if (context && context->getClientVersion() < 3)
412 {
413 return gl::error(GL_INVALID_ENUM);
414 }
415 break;
416
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000417 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000418 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000419 }
420
421 switch (modeAlpha)
422 {
423 case GL_FUNC_ADD:
424 case GL_FUNC_SUBTRACT:
425 case GL_FUNC_REVERSE_SUBTRACT:
426 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000427
428 case GL_MIN:
429 case GL_MAX:
430 if (context && context->getClientVersion() < 3)
431 {
432 return gl::error(GL_INVALID_ENUM);
433 }
434 break;
435
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000436 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000437 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000438 }
439
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000440 if (context)
441 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000442 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000443 }
444 }
445 catch(std::bad_alloc&)
446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000447 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000448 }
449}
450
451void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
452{
453 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
454}
455
456void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000458 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 +0000459 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000460
461 try
462 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000463 gl::Context *context = gl::getNonLostContext();
464
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000465 switch (srcRGB)
466 {
467 case GL_ZERO:
468 case GL_ONE:
469 case GL_SRC_COLOR:
470 case GL_ONE_MINUS_SRC_COLOR:
471 case GL_DST_COLOR:
472 case GL_ONE_MINUS_DST_COLOR:
473 case GL_SRC_ALPHA:
474 case GL_ONE_MINUS_SRC_ALPHA:
475 case GL_DST_ALPHA:
476 case GL_ONE_MINUS_DST_ALPHA:
477 case GL_CONSTANT_COLOR:
478 case GL_ONE_MINUS_CONSTANT_COLOR:
479 case GL_CONSTANT_ALPHA:
480 case GL_ONE_MINUS_CONSTANT_ALPHA:
481 case GL_SRC_ALPHA_SATURATE:
482 break;
483 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000484 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000485 }
486
487 switch (dstRGB)
488 {
489 case GL_ZERO:
490 case GL_ONE:
491 case GL_SRC_COLOR:
492 case GL_ONE_MINUS_SRC_COLOR:
493 case GL_DST_COLOR:
494 case GL_ONE_MINUS_DST_COLOR:
495 case GL_SRC_ALPHA:
496 case GL_ONE_MINUS_SRC_ALPHA:
497 case GL_DST_ALPHA:
498 case GL_ONE_MINUS_DST_ALPHA:
499 case GL_CONSTANT_COLOR:
500 case GL_ONE_MINUS_CONSTANT_COLOR:
501 case GL_CONSTANT_ALPHA:
502 case GL_ONE_MINUS_CONSTANT_ALPHA:
503 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000504
505 case GL_SRC_ALPHA_SATURATE:
506 if (!context || context->getClientVersion() < 3)
507 {
508 return gl::error(GL_INVALID_ENUM);
509 }
510 break;
511
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000512 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000513 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000514 }
515
516 switch (srcAlpha)
517 {
518 case GL_ZERO:
519 case GL_ONE:
520 case GL_SRC_COLOR:
521 case GL_ONE_MINUS_SRC_COLOR:
522 case GL_DST_COLOR:
523 case GL_ONE_MINUS_DST_COLOR:
524 case GL_SRC_ALPHA:
525 case GL_ONE_MINUS_SRC_ALPHA:
526 case GL_DST_ALPHA:
527 case GL_ONE_MINUS_DST_ALPHA:
528 case GL_CONSTANT_COLOR:
529 case GL_ONE_MINUS_CONSTANT_COLOR:
530 case GL_CONSTANT_ALPHA:
531 case GL_ONE_MINUS_CONSTANT_ALPHA:
532 case GL_SRC_ALPHA_SATURATE:
533 break;
534 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000535 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000536 }
537
538 switch (dstAlpha)
539 {
540 case GL_ZERO:
541 case GL_ONE:
542 case GL_SRC_COLOR:
543 case GL_ONE_MINUS_SRC_COLOR:
544 case GL_DST_COLOR:
545 case GL_ONE_MINUS_DST_COLOR:
546 case GL_SRC_ALPHA:
547 case GL_ONE_MINUS_SRC_ALPHA:
548 case GL_DST_ALPHA:
549 case GL_ONE_MINUS_DST_ALPHA:
550 case GL_CONSTANT_COLOR:
551 case GL_ONE_MINUS_CONSTANT_COLOR:
552 case GL_CONSTANT_ALPHA:
553 case GL_ONE_MINUS_CONSTANT_ALPHA:
554 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000555
556 case GL_SRC_ALPHA_SATURATE:
557 if (!context || context->getClientVersion() < 3)
558 {
559 return gl::error(GL_INVALID_ENUM);
560 }
561 break;
562
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000563 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000564 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000565 }
566
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000567 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
568 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
569
570 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
571 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
572
573 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000574 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000575 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 +0000576 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000577 }
578
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579 if (context)
580 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000581 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000582 }
583 }
584 catch(std::bad_alloc&)
585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000586 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000587 }
588}
589
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000590void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000591{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000592 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 +0000593 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000594
595 try
596 {
597 if (size < 0)
598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000599 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000600 }
601
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000602 gl::Context *context = gl::getNonLostContext();
603
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000604 switch (usage)
605 {
606 case GL_STREAM_DRAW:
607 case GL_STATIC_DRAW:
608 case GL_DYNAMIC_DRAW:
609 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000610
611 case GL_STREAM_READ:
612 case GL_STREAM_COPY:
613 case GL_STATIC_READ:
614 case GL_STATIC_COPY:
615 case GL_DYNAMIC_READ:
616 case GL_DYNAMIC_COPY:
617 if (context && context->getClientVersion() < 3)
618 {
619 return gl::error(GL_INVALID_ENUM);
620 }
621 break;
622
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000623 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000624 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000625 }
626
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000627 if (context)
628 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000629 // Check ES3 specific targets
630 switch (target)
631 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000632 case GL_COPY_READ_BUFFER:
633 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000634 case GL_PIXEL_PACK_BUFFER:
635 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000636 case GL_UNIFORM_BUFFER:
637 case GL_TRANSFORM_FEEDBACK_BUFFER:
638 if (context->getClientVersion() < 3)
639 {
640 return gl::error(GL_INVALID_ENUM);
641 }
642 }
643
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000644 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000645
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000646 switch (target)
647 {
648 case GL_ARRAY_BUFFER:
649 buffer = context->getArrayBuffer();
650 break;
651 case GL_ELEMENT_ARRAY_BUFFER:
652 buffer = context->getElementArrayBuffer();
653 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000654 case GL_COPY_READ_BUFFER:
655 buffer = context->getCopyReadBuffer();
656 break;
657 case GL_COPY_WRITE_BUFFER:
658 buffer = context->getCopyWriteBuffer();
659 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000660 case GL_PIXEL_PACK_BUFFER:
661 buffer = context->getPixelPackBuffer();
662 break;
663 case GL_PIXEL_UNPACK_BUFFER:
664 buffer = context->getPixelUnpackBuffer();
665 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000666 case GL_TRANSFORM_FEEDBACK_BUFFER:
667 buffer = context->getGenericTransformFeedbackBuffer();
668 break;
669 case GL_UNIFORM_BUFFER:
670 buffer = context->getGenericUniformBuffer();
671 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000672 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000673 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000674 }
675
676 if (!buffer)
677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000678 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000679 }
680
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000681 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000682 }
683 }
684 catch(std::bad_alloc&)
685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000686 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000687 }
688}
689
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000690void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000691{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000692 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 +0000693 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000694
695 try
696 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000697 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000699 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000700 }
701
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000702 if (data == NULL)
703 {
704 return;
705 }
706
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000707 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000708
709 if (context)
710 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000711 // Check ES3 specific targets
712 switch (target)
713 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000714 case GL_COPY_READ_BUFFER:
715 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000716 case GL_PIXEL_PACK_BUFFER:
717 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000718 case GL_UNIFORM_BUFFER:
719 case GL_TRANSFORM_FEEDBACK_BUFFER:
720 if (context->getClientVersion() < 3)
721 {
722 return gl::error(GL_INVALID_ENUM);
723 }
724 }
725
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000726 gl::Buffer *buffer;
727
728 switch (target)
729 {
730 case GL_ARRAY_BUFFER:
731 buffer = context->getArrayBuffer();
732 break;
733 case GL_ELEMENT_ARRAY_BUFFER:
734 buffer = context->getElementArrayBuffer();
735 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000736 case GL_COPY_READ_BUFFER:
737 buffer = context->getCopyReadBuffer();
738 break;
739 case GL_COPY_WRITE_BUFFER:
740 buffer = context->getCopyWriteBuffer();
741 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000742 case GL_PIXEL_PACK_BUFFER:
743 buffer = context->getPixelPackBuffer();
744 break;
745 case GL_PIXEL_UNPACK_BUFFER:
746 buffer = context->getPixelUnpackBuffer();
747 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000748 case GL_TRANSFORM_FEEDBACK_BUFFER:
749 buffer = context->getGenericTransformFeedbackBuffer();
750 break;
751 case GL_UNIFORM_BUFFER:
752 buffer = context->getGenericUniformBuffer();
753 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000754 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000755 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000756 }
757
758 if (!buffer)
759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000760 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000761 }
762
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000763 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000765 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000766 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000767
768 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000769 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000770 }
771 catch(std::bad_alloc&)
772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000773 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000774 }
775}
776
777GLenum __stdcall glCheckFramebufferStatus(GLenum target)
778{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000779 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000780
781 try
782 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000783 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000785 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000786 }
787
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000788 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000789
790 if (context)
791 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000792 gl::Framebuffer *framebuffer = NULL;
793 if (target == GL_READ_FRAMEBUFFER_ANGLE)
794 {
795 framebuffer = context->getReadFramebuffer();
796 }
797 else
798 {
799 framebuffer = context->getDrawFramebuffer();
800 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000801
802 return framebuffer->completeness();
803 }
804 }
805 catch(std::bad_alloc&)
806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000807 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000808 }
809
810 return 0;
811}
812
813void __stdcall glClear(GLbitfield mask)
814{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000815 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000816
817 try
818 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000819 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000820
821 if (context)
822 {
Geoff Lang0b833232013-08-21 10:13:29 -0400823 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
824
825 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
826 {
827 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
828 }
829
830 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
831 {
832 return gl::error(GL_INVALID_VALUE);
833 }
834
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000835 context->clear(mask);
836 }
837 }
838 catch(std::bad_alloc&)
839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000840 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000841 }
842}
843
844void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
845{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000846 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000847 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000848
849 try
850 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000851 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000852
853 if (context)
854 {
855 context->setClearColor(red, green, blue, alpha);
856 }
857 }
858 catch(std::bad_alloc&)
859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000860 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000861 }
862}
863
864void __stdcall glClearDepthf(GLclampf depth)
865{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000866 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000867
868 try
869 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000870 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000871
872 if (context)
873 {
874 context->setClearDepth(depth);
875 }
876 }
877 catch(std::bad_alloc&)
878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000879 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000880 }
881}
882
883void __stdcall glClearStencil(GLint s)
884{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000885 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000886
887 try
888 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000889 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000890
891 if (context)
892 {
893 context->setClearStencil(s);
894 }
895 }
896 catch(std::bad_alloc&)
897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000898 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000899 }
900}
901
902void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
903{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000904 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000905 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000906
907 try
908 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000909 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000910
911 if (context)
912 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000913 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000914 }
915 }
916 catch(std::bad_alloc&)
917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000918 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000919 }
920}
921
922void __stdcall glCompileShader(GLuint shader)
923{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000924 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000925
926 try
927 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000928 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000929
930 if (context)
931 {
932 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000933
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000934 if (!shaderObject)
935 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000936 if (context->getProgram(shader))
937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000938 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000939 }
940 else
941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000942 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000943 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000944 }
945
946 shaderObject->compile();
947 }
948 }
949 catch(std::bad_alloc&)
950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000951 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000952 }
953}
954
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000955void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
956 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000957{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000958 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000959 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000960 target, level, internalformat, width, height, border, imageSize, data);
961
962 try
963 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000964 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000965
966 if (context)
967 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000968 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400969 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000970 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
971 {
972 return;
973 }
974
975 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400976 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400977 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000978 {
979 return;
980 }
981
982 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000984 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000985 }
986
987 switch (target)
988 {
989 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000990 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000991 gl::Texture2D *texture = context->getTexture2D();
992 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000993 }
994 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000995
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000996 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
997 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
998 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
999 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1000 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1001 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001002 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001003 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1004 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001005 }
1006 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001007
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001008 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001009 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001010 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001011 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001012 }
1013 catch(std::bad_alloc&)
1014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001015 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001016 }
1017}
1018
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001019void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1020 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001021{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001022 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001023 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001024 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001025 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1026
1027 try
1028 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001029 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001030
1031 if (context)
1032 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001033 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001034 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001035 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
1036 {
1037 return;
1038 }
1039
1040 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001041 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04001042 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001043 {
1044 return;
1045 }
1046
1047 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001049 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001050 }
1051
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001052 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +00001053 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001054 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001055 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001056 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001057 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001058 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001059 break;
1060
1061 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1062 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1063 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1064 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1065 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1066 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001067 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001068 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001069 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001070 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001071 break;
1072
1073 default:
1074 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001075 }
1076 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001077 }
1078 catch(std::bad_alloc&)
1079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001080 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001081 }
1082}
1083
1084void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1085{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001086 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001087 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001088 target, level, internalformat, x, y, width, height, border);
1089
1090 try
1091 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001092 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001093
1094 if (context)
1095 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001096 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001097 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001098 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001099 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001100 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001101 }
1102
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001103 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001104 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001105 0, 0, 0, x, y, width, height, border))
1106 {
1107 return;
1108 }
1109
1110 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
1111
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001112 switch (target)
1113 {
1114 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001115 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001116 gl::Texture2D *texture = context->getTexture2D();
1117 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001118 }
1119 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001120
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001121 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1122 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1123 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1124 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1125 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1126 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001127 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001128 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1129 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001130 }
1131 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001132
1133 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001134 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001135 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001136 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001137 }
1138 catch(std::bad_alloc&)
1139 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001140 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001141 }
1142}
1143
1144void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1145{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001146 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001147 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001148 target, level, xoffset, yoffset, x, y, width, height);
1149
1150 try
1151 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001152 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001153
1154 if (context)
1155 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001156 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001157 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001158 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001159 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001160 return;
1161 }
1162
1163 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001164 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001165 xoffset, yoffset, 0, x, y, width, height, 0))
1166 {
1167 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001168 }
1169
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001170 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001171
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001172 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001173 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001174 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001175 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001176 gl::Texture2D *texture = context->getTexture2D();
1177 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001178 }
1179 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001180
1181 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1182 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1183 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1184 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1185 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1186 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001187 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001188 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1189 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001190 }
1191 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001192
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001193 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001194 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001195 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001196 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001197 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001198
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001199 catch(std::bad_alloc&)
1200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001201 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001202 }
1203}
1204
1205GLuint __stdcall glCreateProgram(void)
1206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001207 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001208
1209 try
1210 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001211 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001212
1213 if (context)
1214 {
1215 return context->createProgram();
1216 }
1217 }
1218 catch(std::bad_alloc&)
1219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001220 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001221 }
1222
1223 return 0;
1224}
1225
1226GLuint __stdcall glCreateShader(GLenum type)
1227{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001228 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001229
1230 try
1231 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001232 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001233
1234 if (context)
1235 {
1236 switch (type)
1237 {
1238 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001239 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001240 return context->createShader(type);
1241 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001242 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001243 }
1244 }
1245 }
1246 catch(std::bad_alloc&)
1247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001248 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001249 }
1250
1251 return 0;
1252}
1253
1254void __stdcall glCullFace(GLenum mode)
1255{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001256 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001257
1258 try
1259 {
1260 switch (mode)
1261 {
1262 case GL_FRONT:
1263 case GL_BACK:
1264 case GL_FRONT_AND_BACK:
1265 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001266 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001267
1268 if (context)
1269 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001270 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001271 }
1272 }
1273 break;
1274 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001275 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001276 }
1277 }
1278 catch(std::bad_alloc&)
1279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001280 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001281 }
1282}
1283
1284void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1285{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001286 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001287
1288 try
1289 {
1290 if (n < 0)
1291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001292 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001293 }
1294
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001295 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001296
1297 if (context)
1298 {
1299 for (int i = 0; i < n; i++)
1300 {
1301 context->deleteBuffer(buffers[i]);
1302 }
1303 }
1304 }
1305 catch(std::bad_alloc&)
1306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001307 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001308 }
1309}
1310
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001311void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1312{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001313 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001314
1315 try
1316 {
1317 if (n < 0)
1318 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001319 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001320 }
1321
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001322 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001323
1324 if (context)
1325 {
1326 for (int i = 0; i < n; i++)
1327 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001328 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001329 }
1330 }
1331 }
1332 catch(std::bad_alloc&)
1333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001334 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001335 }
1336}
1337
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001338void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1339{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001340 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001341
1342 try
1343 {
1344 if (n < 0)
1345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001346 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001347 }
1348
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001349 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001350
1351 if (context)
1352 {
1353 for (int i = 0; i < n; i++)
1354 {
1355 if (framebuffers[i] != 0)
1356 {
1357 context->deleteFramebuffer(framebuffers[i]);
1358 }
1359 }
1360 }
1361 }
1362 catch(std::bad_alloc&)
1363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001364 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001365 }
1366}
1367
1368void __stdcall glDeleteProgram(GLuint program)
1369{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001370 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001371
1372 try
1373 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001374 if (program == 0)
1375 {
1376 return;
1377 }
1378
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001379 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001380
1381 if (context)
1382 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001383 if (!context->getProgram(program))
1384 {
1385 if(context->getShader(program))
1386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001387 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001388 }
1389 else
1390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001391 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001392 }
1393 }
1394
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001395 context->deleteProgram(program);
1396 }
1397 }
1398 catch(std::bad_alloc&)
1399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001400 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001401 }
1402}
1403
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001404void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1405{
1406 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1407
1408 try
1409 {
1410 if (n < 0)
1411 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001412 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001413 }
1414
1415 gl::Context *context = gl::getNonLostContext();
1416
1417 if (context)
1418 {
1419 for (int i = 0; i < n; i++)
1420 {
1421 context->deleteQuery(ids[i]);
1422 }
1423 }
1424 }
1425 catch(std::bad_alloc&)
1426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001427 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001428 }
1429}
1430
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001431void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1432{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001433 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001434
1435 try
1436 {
1437 if (n < 0)
1438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001439 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001440 }
1441
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001442 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001443
1444 if (context)
1445 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001446 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001447 {
1448 context->deleteRenderbuffer(renderbuffers[i]);
1449 }
1450 }
1451 }
1452 catch(std::bad_alloc&)
1453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001454 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001455 }
1456}
1457
1458void __stdcall glDeleteShader(GLuint shader)
1459{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001460 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001461
1462 try
1463 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001464 if (shader == 0)
1465 {
1466 return;
1467 }
1468
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001469 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001470
1471 if (context)
1472 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001473 if (!context->getShader(shader))
1474 {
1475 if(context->getProgram(shader))
1476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001477 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001478 }
1479 else
1480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001481 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001482 }
1483 }
1484
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001485 context->deleteShader(shader);
1486 }
1487 }
1488 catch(std::bad_alloc&)
1489 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001490 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001491 }
1492}
1493
1494void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1495{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001496 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001497
1498 try
1499 {
1500 if (n < 0)
1501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001502 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001503 }
1504
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001505 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001506
1507 if (context)
1508 {
1509 for (int i = 0; i < n; i++)
1510 {
1511 if (textures[i] != 0)
1512 {
1513 context->deleteTexture(textures[i]);
1514 }
1515 }
1516 }
1517 }
1518 catch(std::bad_alloc&)
1519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001520 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001521 }
1522}
1523
1524void __stdcall glDepthFunc(GLenum func)
1525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001526 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001527
1528 try
1529 {
1530 switch (func)
1531 {
1532 case GL_NEVER:
1533 case GL_ALWAYS:
1534 case GL_LESS:
1535 case GL_LEQUAL:
1536 case GL_EQUAL:
1537 case GL_GREATER:
1538 case GL_GEQUAL:
1539 case GL_NOTEQUAL:
1540 break;
1541 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001542 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001543 }
1544
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001545 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001546
1547 if (context)
1548 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001549 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001550 }
1551 }
1552 catch(std::bad_alloc&)
1553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001554 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001555 }
1556}
1557
1558void __stdcall glDepthMask(GLboolean flag)
1559{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001560 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001561
1562 try
1563 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001565
1566 if (context)
1567 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001568 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001569 }
1570 }
1571 catch(std::bad_alloc&)
1572 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001573 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001574 }
1575}
1576
1577void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1578{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001579 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001580
1581 try
1582 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001583 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001584
1585 if (context)
1586 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001587 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001588 }
1589 }
1590 catch(std::bad_alloc&)
1591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001592 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001593 }
1594}
1595
1596void __stdcall glDetachShader(GLuint program, GLuint shader)
1597{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001598 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001599
1600 try
1601 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001602 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001603
1604 if (context)
1605 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001606
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001607 gl::Program *programObject = context->getProgram(program);
1608 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001609
1610 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001611 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001612 gl::Shader *shaderByProgramHandle;
1613 shaderByProgramHandle = context->getShader(program);
1614 if (!shaderByProgramHandle)
1615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001616 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001617 }
1618 else
1619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001620 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001621 }
1622 }
1623
1624 if (!shaderObject)
1625 {
1626 gl::Program *programByShaderHandle = context->getProgram(shader);
1627 if (!programByShaderHandle)
1628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001629 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001630 }
1631 else
1632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001633 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001634 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001635 }
1636
1637 if (!programObject->detachShader(shaderObject))
1638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001640 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001641 }
1642 }
1643 catch(std::bad_alloc&)
1644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001645 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001646 }
1647}
1648
1649void __stdcall glDisable(GLenum cap)
1650{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001651 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001652
1653 try
1654 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001655 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001656
1657 if (context)
1658 {
1659 switch (cap)
1660 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001661 case GL_CULL_FACE: context->setCullFace(false); break;
1662 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
1663 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
1664 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
1665 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
1666 case GL_STENCIL_TEST: context->setStencilTest(false); break;
1667 case GL_DEPTH_TEST: context->setDepthTest(false); break;
1668 case GL_BLEND: context->setBlend(false); break;
1669 case GL_DITHER: context->setDither(false); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00001670
1671 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1672 case GL_RASTERIZER_DISCARD:
1673 if (context->getClientVersion() < 3)
1674 {
1675 return gl::error(GL_INVALID_ENUM);
1676 }
1677 UNIMPLEMENTED();
1678 break;
1679
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001680 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001681 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001682 }
1683 }
1684 }
1685 catch(std::bad_alloc&)
1686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001687 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001688 }
1689}
1690
1691void __stdcall glDisableVertexAttribArray(GLuint index)
1692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001693 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001694
1695 try
1696 {
1697 if (index >= gl::MAX_VERTEX_ATTRIBS)
1698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001699 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001700 }
1701
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001702 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001703
1704 if (context)
1705 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001706 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001707 }
1708 }
1709 catch(std::bad_alloc&)
1710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001711 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001712 }
1713}
1714
1715void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1716{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001717 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001718
1719 try
1720 {
1721 if (count < 0 || first < 0)
1722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001723 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001724 }
1725
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001726 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001727
1728 if (context)
1729 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001730 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001731 }
1732 }
1733 catch(std::bad_alloc&)
1734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001735 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001736 }
1737}
1738
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001739void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1740{
1741 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1742
1743 try
1744 {
1745 if (count < 0 || first < 0 || primcount < 0)
1746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001747 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001748 }
1749
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001750 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001751 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001752 gl::Context *context = gl::getNonLostContext();
1753
1754 if (context)
1755 {
1756 context->drawArrays(mode, first, count, primcount);
1757 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001758 }
1759 }
1760 catch(std::bad_alloc&)
1761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001762 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001763 }
1764}
1765
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001766void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001767{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001768 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 +00001769 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001770
1771 try
1772 {
1773 if (count < 0)
1774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001775 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001776 }
1777
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001778 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001779
1780 if (context)
1781 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001782 switch (type)
1783 {
1784 case GL_UNSIGNED_BYTE:
1785 case GL_UNSIGNED_SHORT:
1786 break;
1787 case GL_UNSIGNED_INT:
1788 if (!context->supports32bitIndices())
1789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001790 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001791 }
1792 break;
1793 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001794 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001795 }
1796
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001797 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001798 }
1799 }
1800 catch(std::bad_alloc&)
1801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001802 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803 }
1804}
1805
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001806void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1807{
1808 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1809 mode, count, type, indices, primcount);
1810
1811 try
1812 {
1813 if (count < 0 || primcount < 0)
1814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001815 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001816 }
1817
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001818 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001819 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001820 gl::Context *context = gl::getNonLostContext();
1821
1822 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001823 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001824 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001825 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001826 case GL_UNSIGNED_BYTE:
1827 case GL_UNSIGNED_SHORT:
1828 break;
1829 case GL_UNSIGNED_INT:
1830 if (!context->supports32bitIndices())
1831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001832 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001833 }
1834 break;
1835 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001836 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001837 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001838
1839 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001840 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001841 }
1842 }
1843 catch(std::bad_alloc&)
1844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001845 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001846 }
1847}
1848
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001849void __stdcall glEnable(GLenum cap)
1850{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001851 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001852
1853 try
1854 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001855 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001856
1857 if (context)
1858 {
1859 switch (cap)
1860 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001861 case GL_CULL_FACE: context->setCullFace(true); break;
1862 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
1863 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
1864 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
1865 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
1866 case GL_STENCIL_TEST: context->setStencilTest(true); break;
1867 case GL_DEPTH_TEST: context->setDepthTest(true); break;
1868 case GL_BLEND: context->setBlend(true); break;
1869 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001870 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001871 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001872 }
1873 }
1874 }
1875 catch(std::bad_alloc&)
1876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001877 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001878 }
1879}
1880
1881void __stdcall glEnableVertexAttribArray(GLuint index)
1882{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001883 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001884
1885 try
1886 {
1887 if (index >= gl::MAX_VERTEX_ATTRIBS)
1888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001889 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001890 }
1891
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001892 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001893
1894 if (context)
1895 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001896 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001897 }
1898 }
1899 catch(std::bad_alloc&)
1900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001901 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001902 }
1903}
1904
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001905void __stdcall glEndQueryEXT(GLenum target)
1906{
1907 EVENT("GLenum target = 0x%X)", target);
1908
1909 try
1910 {
1911 switch (target)
1912 {
1913 case GL_ANY_SAMPLES_PASSED_EXT:
1914 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
1915 break;
1916 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001917 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001918 }
1919
1920 gl::Context *context = gl::getNonLostContext();
1921
1922 if (context)
1923 {
1924 context->endQuery(target);
1925 }
1926 }
1927 catch(std::bad_alloc&)
1928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001929 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001930 }
1931}
1932
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001933void __stdcall glFinishFenceNV(GLuint fence)
1934{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001935 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001936
1937 try
1938 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001939 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001940
1941 if (context)
1942 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001943 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001944
1945 if (fenceObject == NULL)
1946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001947 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001948 }
1949
Jamie Madillfb9a7402013-07-26 11:55:01 -04001950 if (fenceObject->isFence() != GL_TRUE)
1951 {
1952 return gl::error(GL_INVALID_OPERATION);
1953 }
1954
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001955 fenceObject->finishFence();
1956 }
1957 }
1958 catch(std::bad_alloc&)
1959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001960 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001961 }
1962}
1963
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001964void __stdcall glFinish(void)
1965{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001966 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001967
1968 try
1969 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001971
1972 if (context)
1973 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001974 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001975 }
1976 }
1977 catch(std::bad_alloc&)
1978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001979 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001980 }
1981}
1982
1983void __stdcall glFlush(void)
1984{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001985 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001986
1987 try
1988 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001989 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001990
1991 if (context)
1992 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001993 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001994 }
1995 }
1996 catch(std::bad_alloc&)
1997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001998 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001999 }
2000}
2001
2002void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2003{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002004 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002005 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002006
2007 try
2008 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002009 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002010 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002012 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002013 }
2014
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002015 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002016
2017 if (context)
2018 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002019 gl::Framebuffer *framebuffer = NULL;
2020 GLuint framebufferHandle = 0;
2021 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2022 {
2023 framebuffer = context->getReadFramebuffer();
2024 framebufferHandle = context->getReadFramebufferHandle();
2025 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002026 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002027 {
2028 framebuffer = context->getDrawFramebuffer();
2029 framebufferHandle = context->getDrawFramebufferHandle();
2030 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002031
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002032 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002034 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002035 }
2036
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002037 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002038 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002039 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2040
2041 if (colorAttachment >= context->getMaximumRenderTargets())
2042 {
2043 return gl::error(GL_INVALID_VALUE);
2044 }
2045
Geoff Lang309c92a2013-07-25 16:23:19 -04002046 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002047 }
2048 else
2049 {
2050 switch (attachment)
2051 {
2052 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002053 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002054 break;
2055 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002056 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002057 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04002058 case GL_DEPTH_STENCIL_ATTACHMENT:
2059 if (context->getClientVersion() < 3)
2060 {
2061 return gl::error(GL_INVALID_ENUM);
2062 }
2063 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
2064 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002065 default:
2066 return gl::error(GL_INVALID_ENUM);
2067 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068 }
2069 }
2070 }
2071 catch(std::bad_alloc&)
2072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002073 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002074 }
2075}
2076
2077void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002079 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002080 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002081
2082 try
2083 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002084 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002085 if (context)
2086 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002087 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002088 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002089 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002090 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002091 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04002092
2093 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002094 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002095 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002096 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002097 }
2098
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002099 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002100 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002101 textarget = GL_NONE;
2102 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002103
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002104 gl::Framebuffer *framebuffer = NULL;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002105 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2106 {
2107 framebuffer = context->getReadFramebuffer();
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002108 }
2109 else
2110 {
2111 framebuffer = context->getDrawFramebuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002112 }
2113
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002114 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002115 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002116 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04002117 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002118 }
2119 else
2120 {
2121 switch (attachment)
2122 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002123 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2124 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2125 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002126 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002127 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002128 }
2129 }
2130 catch(std::bad_alloc&)
2131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002132 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002133 }
2134}
2135
2136void __stdcall glFrontFace(GLenum mode)
2137{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002138 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002139
2140 try
2141 {
2142 switch (mode)
2143 {
2144 case GL_CW:
2145 case GL_CCW:
2146 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002147 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002148
2149 if (context)
2150 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002151 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002152 }
2153 }
2154 break;
2155 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002156 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002157 }
2158 }
2159 catch(std::bad_alloc&)
2160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002161 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002162 }
2163}
2164
2165void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2166{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002167 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002168
2169 try
2170 {
2171 if (n < 0)
2172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002173 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002174 }
2175
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002176 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002177
2178 if (context)
2179 {
2180 for (int i = 0; i < n; i++)
2181 {
2182 buffers[i] = context->createBuffer();
2183 }
2184 }
2185 }
2186 catch(std::bad_alloc&)
2187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002188 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002189 }
2190}
2191
2192void __stdcall glGenerateMipmap(GLenum target)
2193{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002194 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002195
2196 try
2197 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002198 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002199
2200 if (context)
2201 {
Jamie Madill35d15012013-10-07 10:46:37 -04002202 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002204 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002205 }
Geoff Langae4852a2013-06-05 15:00:34 -04002206
Jamie Madill35d15012013-10-07 10:46:37 -04002207 gl::Texture *texture = GetTargetTexture(context, target);
2208
2209 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002210 {
2211 return gl::error(GL_INVALID_OPERATION);
2212 }
2213
Geoff Lang005df412013-10-16 14:12:50 -04002214 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002215
Geoff Langae4852a2013-06-05 15:00:34 -04002216 // Internally, all texture formats are sized so checking if the format
2217 // is color renderable and filterable will not fail.
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002218 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2219 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Geoff Langae4852a2013-06-05 15:00:34 -04002220 !gl::IsColorRenderingSupported(internalFormat, context) ||
2221 !gl::IsTextureFilteringSupported(internalFormat, context))
2222 {
2223 return gl::error(GL_INVALID_OPERATION);
2224 }
2225
Jamie Madillc1f8b162013-10-07 10:46:38 -04002226 // Non-power of 2 ES2 check
2227 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2228 {
2229 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2230 return gl::error(GL_INVALID_OPERATION);
2231 }
2232
2233 // Cube completeness check
2234 if (target == GL_TEXTURE_CUBE_MAP)
2235 {
2236 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2237 if (!textureCube->isCubeComplete())
2238 {
2239 return gl::error(GL_INVALID_OPERATION);
2240 }
2241 }
2242
Geoff Langae4852a2013-06-05 15:00:34 -04002243 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002244 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002245 }
2246 catch(std::bad_alloc&)
2247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002248 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002249 }
2250}
2251
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002252void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2253{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002254 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002255
2256 try
2257 {
2258 if (n < 0)
2259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002260 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002261 }
2262
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002263 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002264
2265 if (context)
2266 {
2267 for (int i = 0; i < n; i++)
2268 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002269 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002270 }
2271 }
2272 }
2273 catch(std::bad_alloc&)
2274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002275 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002276 }
2277}
2278
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002279void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2280{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002281 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002282
2283 try
2284 {
2285 if (n < 0)
2286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002287 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002288 }
2289
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002290 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002291
2292 if (context)
2293 {
2294 for (int i = 0; i < n; i++)
2295 {
2296 framebuffers[i] = context->createFramebuffer();
2297 }
2298 }
2299 }
2300 catch(std::bad_alloc&)
2301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002302 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002303 }
2304}
2305
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002306void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2307{
2308 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2309
2310 try
2311 {
2312 if (n < 0)
2313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002314 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002315 }
2316
2317 gl::Context *context = gl::getNonLostContext();
2318
2319 if (context)
2320 {
2321 for (int i = 0; i < n; i++)
2322 {
2323 ids[i] = context->createQuery();
2324 }
2325 }
2326 }
2327 catch(std::bad_alloc&)
2328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002329 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002330 }
2331}
2332
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002333void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2334{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002335 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002336
2337 try
2338 {
2339 if (n < 0)
2340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002341 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002342 }
2343
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002344 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002345
2346 if (context)
2347 {
2348 for (int i = 0; i < n; i++)
2349 {
2350 renderbuffers[i] = context->createRenderbuffer();
2351 }
2352 }
2353 }
2354 catch(std::bad_alloc&)
2355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002357 }
2358}
2359
2360void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2361{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002362 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002363
2364 try
2365 {
2366 if (n < 0)
2367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002368 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369 }
2370
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002371 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002372
2373 if (context)
2374 {
2375 for (int i = 0; i < n; i++)
2376 {
2377 textures[i] = context->createTexture();
2378 }
2379 }
2380 }
2381 catch(std::bad_alloc&)
2382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002383 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002384 }
2385}
2386
daniel@transgaming.com85423182010-04-22 13:35:27 +00002387void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002388{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002389 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002390 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391 program, index, bufsize, length, size, type, name);
2392
2393 try
2394 {
2395 if (bufsize < 0)
2396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002397 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002398 }
2399
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002400 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002401
2402 if (context)
2403 {
2404 gl::Program *programObject = context->getProgram(program);
2405
2406 if (!programObject)
2407 {
2408 if (context->getShader(program))
2409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002410 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002411 }
2412 else
2413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002414 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002415 }
2416 }
2417
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002418 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002420 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002421 }
2422
2423 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2424 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002425 }
2426 catch(std::bad_alloc&)
2427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002428 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002429 }
2430}
2431
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002432void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002433{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002434 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002435 "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 +00002436 program, index, bufsize, length, size, type, name);
2437
2438 try
2439 {
2440 if (bufsize < 0)
2441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002442 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443 }
2444
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002445 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002446
2447 if (context)
2448 {
2449 gl::Program *programObject = context->getProgram(program);
2450
2451 if (!programObject)
2452 {
2453 if (context->getShader(program))
2454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002455 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002456 }
2457 else
2458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002459 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002460 }
2461 }
2462
2463 if (index >= (GLuint)programObject->getActiveUniformCount())
2464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002465 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002466 }
2467
2468 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2469 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002470 }
2471 catch(std::bad_alloc&)
2472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002473 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002474 }
2475}
2476
2477void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2478{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002479 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 +00002480 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002481
2482 try
2483 {
2484 if (maxcount < 0)
2485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002486 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002487 }
2488
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002489 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002490
2491 if (context)
2492 {
2493 gl::Program *programObject = context->getProgram(program);
2494
2495 if (!programObject)
2496 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002497 if (context->getShader(program))
2498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002500 }
2501 else
2502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002503 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002504 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002505 }
2506
2507 return programObject->getAttachedShaders(maxcount, count, shaders);
2508 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002509 }
2510 catch(std::bad_alloc&)
2511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002512 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002513 }
2514}
2515
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002516int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002517{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002518 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002519
2520 try
2521 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002522 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002523
2524 if (context)
2525 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002526
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002527 gl::Program *programObject = context->getProgram(program);
2528
2529 if (!programObject)
2530 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002531 if (context->getShader(program))
2532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002533 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002534 }
2535 else
2536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002537 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002538 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002539 }
2540
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002541 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002542 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002544 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002545 }
2546
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002547 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002548 }
2549 }
2550 catch(std::bad_alloc&)
2551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002552 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002553 }
2554
2555 return -1;
2556}
2557
2558void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2559{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002560 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002561
2562 try
2563 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002565
2566 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002567 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002568 if (!(context->getBooleanv(pname, params)))
2569 {
2570 GLenum nativeType;
2571 unsigned int numParams = 0;
2572 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002573 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002574
2575 if (numParams == 0)
2576 return; // it is known that the pname is valid, but there are no parameters to return
2577
2578 if (nativeType == GL_FLOAT)
2579 {
2580 GLfloat *floatParams = NULL;
2581 floatParams = new GLfloat[numParams];
2582
2583 context->getFloatv(pname, floatParams);
2584
2585 for (unsigned int i = 0; i < numParams; ++i)
2586 {
2587 if (floatParams[i] == 0.0f)
2588 params[i] = GL_FALSE;
2589 else
2590 params[i] = GL_TRUE;
2591 }
2592
2593 delete [] floatParams;
2594 }
2595 else if (nativeType == GL_INT)
2596 {
2597 GLint *intParams = NULL;
2598 intParams = new GLint[numParams];
2599
2600 context->getIntegerv(pname, intParams);
2601
2602 for (unsigned int i = 0; i < numParams; ++i)
2603 {
2604 if (intParams[i] == 0)
2605 params[i] = GL_FALSE;
2606 else
2607 params[i] = GL_TRUE;
2608 }
2609
2610 delete [] intParams;
2611 }
Jamie Madill71fbd602013-07-19 16:36:55 -04002612 else if (nativeType == GL_INT_64_ANGLEX)
2613 {
2614 GLint64 *int64Params = NULL;
2615 int64Params = new GLint64[numParams];
2616
2617 context->getInteger64v(pname, int64Params);
2618
2619 for (unsigned int i = 0; i < numParams; ++i)
2620 {
2621 if (int64Params[i] == 0)
2622 params[i] = GL_FALSE;
2623 else
2624 params[i] = GL_TRUE;
2625 }
2626
2627 delete [] int64Params;
2628 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002629 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002630 }
2631 }
2632 catch(std::bad_alloc&)
2633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002634 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002635 }
2636}
2637
2638void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2639{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002640 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 +00002641
2642 try
2643 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002644 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002645
2646 if (context)
2647 {
2648 gl::Buffer *buffer;
2649
2650 switch (target)
2651 {
2652 case GL_ARRAY_BUFFER:
2653 buffer = context->getArrayBuffer();
2654 break;
2655 case GL_ELEMENT_ARRAY_BUFFER:
2656 buffer = context->getElementArrayBuffer();
2657 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002658 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002659 }
2660
2661 if (!buffer)
2662 {
2663 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002664 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002665 }
2666
2667 switch (pname)
2668 {
2669 case GL_BUFFER_USAGE:
2670 *params = buffer->usage();
2671 break;
2672 case GL_BUFFER_SIZE:
2673 *params = buffer->size();
2674 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002675 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002676 }
2677 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002678 }
2679 catch(std::bad_alloc&)
2680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002681 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002682 }
2683}
2684
2685GLenum __stdcall glGetError(void)
2686{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002687 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002688
2689 gl::Context *context = gl::getContext();
2690
2691 if (context)
2692 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002693 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002694 }
2695
2696 return GL_NO_ERROR;
2697}
2698
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002699void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2700{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002701 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002702
2703 try
2704 {
2705
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002706 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002707
2708 if (context)
2709 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002710 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002711
2712 if (fenceObject == NULL)
2713 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002714 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002715 }
2716
Jamie Madillfb9a7402013-07-26 11:55:01 -04002717 if (fenceObject->isFence() != GL_TRUE)
2718 {
2719 return gl::error(GL_INVALID_OPERATION);
2720 }
2721
2722 switch (pname)
2723 {
2724 case GL_FENCE_STATUS_NV:
2725 case GL_FENCE_CONDITION_NV:
2726 break;
2727
2728 default: return gl::error(GL_INVALID_ENUM);
2729 }
2730
2731 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002732 }
2733 }
2734 catch(std::bad_alloc&)
2735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002736 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002737 }
2738}
2739
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002740void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2741{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002742 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002743
2744 try
2745 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002746 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002747
2748 if (context)
2749 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002750 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002751 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002752 GLenum nativeType;
2753 unsigned int numParams = 0;
2754 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002755 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002756
2757 if (numParams == 0)
2758 return; // it is known that the pname is valid, but that there are no parameters to return.
2759
2760 if (nativeType == GL_BOOL)
2761 {
2762 GLboolean *boolParams = NULL;
2763 boolParams = new GLboolean[numParams];
2764
2765 context->getBooleanv(pname, boolParams);
2766
2767 for (unsigned int i = 0; i < numParams; ++i)
2768 {
2769 if (boolParams[i] == GL_FALSE)
2770 params[i] = 0.0f;
2771 else
2772 params[i] = 1.0f;
2773 }
2774
2775 delete [] boolParams;
2776 }
2777 else if (nativeType == GL_INT)
2778 {
2779 GLint *intParams = NULL;
2780 intParams = new GLint[numParams];
2781
2782 context->getIntegerv(pname, intParams);
2783
2784 for (unsigned int i = 0; i < numParams; ++i)
2785 {
Jamie Madill71fbd602013-07-19 16:36:55 -04002786 params[i] = static_cast<GLfloat>(intParams[i]);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002787 }
2788
2789 delete [] intParams;
2790 }
Jamie Madill71fbd602013-07-19 16:36:55 -04002791 else if (nativeType == GL_INT_64_ANGLEX)
2792 {
2793 GLint64 *int64Params = NULL;
2794 int64Params = new GLint64[numParams];
2795
2796 context->getInteger64v(pname, int64Params);
2797
2798 for (unsigned int i = 0; i < numParams; ++i)
2799 {
2800 params[i] = static_cast<GLfloat>(int64Params[i]);
2801 }
2802
2803 delete [] int64Params;
2804 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002805 }
2806 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002807 }
2808 catch(std::bad_alloc&)
2809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002810 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002811 }
2812}
2813
2814void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2815{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002816 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 +00002817 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002818
2819 try
2820 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002821 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002822
2823 if (context)
2824 {
Geoff Lang646559f2013-08-15 11:08:15 -04002825 META_ASSERT(GL_DRAW_FRAMEBUFFER_ANGLE == GL_DRAW_FRAMEBUFFER && GL_READ_FRAMEBUFFER_ANGLE == GL_READ_FRAMEBUFFER);
2826 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002828 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002829 }
2830
Geoff Lang646559f2013-08-15 11:08:15 -04002831 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002832 {
Geoff Lang646559f2013-08-15 11:08:15 -04002833 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2834 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2835 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2836 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2837 break;
2838 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2839 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2840 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2841 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2842 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2843 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2844 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2845 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2846 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2847 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002848 {
Geoff Lang646559f2013-08-15 11:08:15 -04002849 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002850 }
Geoff Lang646559f2013-08-15 11:08:15 -04002851 default:
2852 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002853 }
Geoff Lang646559f2013-08-15 11:08:15 -04002854
2855 // Determine if the attachment is a valid enum
2856 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002857 {
Geoff Lang646559f2013-08-15 11:08:15 -04002858 case GL_BACK:
2859 case GL_FRONT:
2860 case GL_STENCIL:
2861 case GL_DEPTH_STENCIL_ATTACHMENT:
2862 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002863 {
Geoff Lang646559f2013-08-15 11:08:15 -04002864 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002865 }
Geoff Lang646559f2013-08-15 11:08:15 -04002866 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002867
Geoff Lang646559f2013-08-15 11:08:15 -04002868 case GL_DEPTH_ATTACHMENT:
2869 case GL_STENCIL_ATTACHMENT:
2870 break;
2871
2872 default:
2873 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2874 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2875 {
2876 return gl::error(GL_INVALID_ENUM);
2877 }
2878 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002879 }
2880
Geoff Lang646559f2013-08-15 11:08:15 -04002881 GLuint framebufferHandle = (target == GL_READ_FRAMEBUFFER) ? context->getReadFramebufferHandle()
2882 : context->getDrawFramebufferHandle();
2883
2884 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2885
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002886 GLenum attachmentType;
2887 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002888 GLuint attachmentLevel;
2889 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002890 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002891
Geoff Lang646559f2013-08-15 11:08:15 -04002892 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002893 {
Geoff Lang646559f2013-08-15 11:08:15 -04002894 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002895 {
Geoff Lang646559f2013-08-15 11:08:15 -04002896 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002897 }
2898
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002899 switch (attachment)
2900 {
Geoff Lang646559f2013-08-15 11:08:15 -04002901 case GL_BACK:
2902 attachmentType = framebuffer->getColorbufferType(0);
2903 attachmentHandle = framebuffer->getColorbufferHandle(0);
2904 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2905 attachmentLayer = framebuffer->getColorbufferLayer(0);
2906 renderbuffer = framebuffer->getColorbuffer(0);
2907 break;
2908 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002909 attachmentType = framebuffer->getDepthbufferType();
2910 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002911 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2912 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002913 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002914 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002915 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002916 attachmentType = framebuffer->getStencilbufferType();
2917 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002918 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2919 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002920 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002921 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002922 default:
2923 return gl::error(GL_INVALID_OPERATION);
2924 }
2925 }
2926 else
2927 {
2928 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2929 {
2930 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2931 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2932 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2933 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2934 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2935 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2936 }
2937 else
2938 {
2939 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002940 {
Geoff Lang646559f2013-08-15 11:08:15 -04002941 case GL_DEPTH_ATTACHMENT:
2942 attachmentType = framebuffer->getDepthbufferType();
2943 attachmentHandle = framebuffer->getDepthbufferHandle();
2944 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2945 attachmentLayer = framebuffer->getDepthbufferLayer();
2946 renderbuffer = framebuffer->getDepthbuffer();
2947 break;
2948 case GL_STENCIL_ATTACHMENT:
2949 attachmentType = framebuffer->getStencilbufferType();
2950 attachmentHandle = framebuffer->getStencilbufferHandle();
2951 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2952 attachmentLayer = framebuffer->getStencilbufferLayer();
2953 renderbuffer = framebuffer->getStencilbuffer();
2954 break;
2955 case GL_DEPTH_STENCIL_ATTACHMENT:
2956 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2957 {
2958 return gl::error(GL_INVALID_OPERATION);
2959 }
2960 attachmentType = framebuffer->getDepthStencilbufferType();
2961 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2962 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2963 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2964 renderbuffer = framebuffer->getDepthStencilBuffer();
2965 break;
2966 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002967 return gl::error(GL_INVALID_OPERATION);
2968 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002969 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002970 }
2971
2972 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002973 if (framebufferHandle == 0)
2974 {
2975 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2976 }
2977 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002978 {
2979 attachmentObjectType = attachmentType;
2980 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002981 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002982 {
2983 attachmentObjectType = GL_TEXTURE;
2984 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002985 else
2986 {
2987 UNREACHABLE();
2988 return;
2989 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002990
Geoff Lang646559f2013-08-15 11:08:15 -04002991 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002992 {
Geoff Lang646559f2013-08-15 11:08:15 -04002993 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2994 // is NONE, then querying any other pname will generate INVALID_ENUM.
2995
2996 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2997 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2998 // INVALID_OPERATION for all other pnames
2999
3000 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003001 {
Geoff Lang646559f2013-08-15 11:08:15 -04003002 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3003 *params = attachmentObjectType;
3004 break;
3005
3006 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3007 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003008 {
Geoff Lang646559f2013-08-15 11:08:15 -04003009 return gl::error(GL_INVALID_ENUM);
3010 }
3011 *params = 0;
3012 break;
3013
3014 default:
3015 if (context->getClientVersion() < 3)
3016 {
3017 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003018 }
3019 else
3020 {
Geoff Lang646559f2013-08-15 11:08:15 -04003021 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003022 }
3023 }
Geoff Lang646559f2013-08-15 11:08:15 -04003024 }
3025 else
3026 {
3027 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
3028 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
3029 ASSERT(renderbuffer != NULL);
3030
3031 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003032 {
Geoff Lang646559f2013-08-15 11:08:15 -04003033 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3034 *params = attachmentObjectType;
3035 break;
3036
3037 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3038 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
3039 {
3040 return gl::error(GL_INVALID_ENUM);
3041 }
3042 *params = attachmentHandle;
3043 break;
3044
3045 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3046 if (attachmentObjectType != GL_TEXTURE)
3047 {
3048 return gl::error(GL_INVALID_ENUM);
3049 }
3050 *params = attachmentLevel;
3051 break;
3052
3053 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3054 if (attachmentObjectType != GL_TEXTURE)
3055 {
3056 return gl::error(GL_INVALID_ENUM);
3057 }
3058 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
3059 break;
3060
3061 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
3062 *params = renderbuffer->getRedSize();
3063 break;
3064
3065 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
3066 *params = renderbuffer->getGreenSize();
3067 break;
3068
3069 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
3070 *params = renderbuffer->getBlueSize();
3071 break;
3072
3073 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
3074 *params = renderbuffer->getAlphaSize();
3075 break;
3076
3077 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
3078 *params = renderbuffer->getDepthSize();
3079 break;
3080
3081 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
3082 *params = renderbuffer->getStencilSize();
3083 break;
3084
3085 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
3086 if (attachment == GL_DEPTH_STENCIL)
3087 {
3088 gl::error(GL_INVALID_OPERATION);
3089 }
3090 *params = renderbuffer->getComponentType();
3091 break;
3092
3093 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
3094 *params = renderbuffer->getColorEncoding();
3095 break;
3096
3097 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
3098 if (attachmentObjectType != GL_TEXTURE)
3099 {
3100 return gl::error(GL_INVALID_ENUM);
3101 }
3102 *params = attachmentLayer;
3103 break;
3104
3105 default:
3106 UNREACHABLE();
3107 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003108 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003109 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003110 }
3111 }
3112 catch(std::bad_alloc&)
3113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003114 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003115 }
3116}
3117
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003118GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3119{
3120 EVENT("()");
3121
3122 try
3123 {
3124 gl::Context *context = gl::getContext();
3125
3126 if (context)
3127 {
3128 return context->getResetStatus();
3129 }
3130
3131 return GL_NO_ERROR;
3132 }
3133 catch(std::bad_alloc&)
3134 {
3135 return GL_OUT_OF_MEMORY;
3136 }
3137}
3138
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003139void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3140{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003141 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003142
3143 try
3144 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003145 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003146
3147 if (context)
3148 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003149 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003150 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003151 GLenum nativeType;
3152 unsigned int numParams = 0;
3153 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003154 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003155
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003156 if (numParams == 0)
3157 return; // it is known that pname is valid, but there are no parameters to return
3158
3159 if (nativeType == GL_BOOL)
3160 {
3161 GLboolean *boolParams = NULL;
3162 boolParams = new GLboolean[numParams];
3163
3164 context->getBooleanv(pname, boolParams);
3165
3166 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003167 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003168 if (boolParams[i] == GL_FALSE)
3169 params[i] = 0;
3170 else
3171 params[i] = 1;
3172 }
3173
3174 delete [] boolParams;
3175 }
3176 else if (nativeType == GL_FLOAT)
3177 {
3178 GLfloat *floatParams = NULL;
3179 floatParams = new GLfloat[numParams];
3180
3181 context->getFloatv(pname, floatParams);
3182
3183 for (unsigned int i = 0; i < numParams; ++i)
3184 {
Jamie Madill71fbd602013-07-19 16:36:55 -04003185 // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003186 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003187 {
Jamie Madill71fbd602013-07-19 16:36:55 -04003188 params[i] = static_cast<GLint>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003189 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003190 else
Jamie Madill71fbd602013-07-19 16:36:55 -04003191 {
Jamie Madillaf496912013-07-19 16:36:54 -04003192 params[i] = gl::iround<GLint>(floatParams[i]);
Jamie Madill71fbd602013-07-19 16:36:55 -04003193 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003194 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003195
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003196 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003197 }
Jamie Madill71fbd602013-07-19 16:36:55 -04003198 else if (nativeType == GL_INT_64_ANGLEX)
3199 {
3200 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
3201 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
3202 GLint64 *int64Params = NULL;
3203 int64Params = new GLint64[numParams];
3204
3205 context->getInteger64v(pname, int64Params);
3206
3207 for (unsigned int i = 0; i < numParams; ++i)
3208 {
3209 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
3210 params[i] = static_cast<GLint>(clampedValue);
3211 }
3212
3213 delete [] int64Params;
3214 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003215 }
3216 }
3217 }
3218 catch(std::bad_alloc&)
3219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003220 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003221 }
3222}
3223
3224void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3225{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003226 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003227
3228 try
3229 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003230 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003231
3232 if (context)
3233 {
3234 gl::Program *programObject = context->getProgram(program);
3235
3236 if (!programObject)
3237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003238 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003239 }
3240
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003241 if (context->getClientVersion() < 3)
3242 {
3243 switch (pname)
3244 {
3245 case GL_ACTIVE_UNIFORM_BLOCKS:
3246 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3247 return gl::error(GL_INVALID_ENUM);
3248 }
3249 }
3250
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003251 switch (pname)
3252 {
3253 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003254 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003255 return;
3256 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003257 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003258 return;
3259 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003260 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003261 return;
3262 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003263 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003264 return;
3265 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003266 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003267 return;
3268 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003269 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003270 return;
3271 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003272 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003273 return;
3274 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003275 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003276 return;
3277 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003278 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003279 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003280 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003281 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003282 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003283 case GL_ACTIVE_UNIFORM_BLOCKS:
3284 *params = programObject->getActiveUniformBlockCount();
3285 return;
3286 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3287 *params = programObject->getActiveUniformBlockMaxLength();
3288 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003289 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003290 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003291 }
3292 }
3293 }
3294 catch(std::bad_alloc&)
3295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003296 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003297 }
3298}
3299
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003300void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003301{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003302 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 +00003303 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003304
3305 try
3306 {
3307 if (bufsize < 0)
3308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003309 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003310 }
3311
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003312 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003313
3314 if (context)
3315 {
3316 gl::Program *programObject = context->getProgram(program);
3317
3318 if (!programObject)
3319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003320 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003321 }
3322
3323 programObject->getInfoLog(bufsize, length, infolog);
3324 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003325 }
3326 catch(std::bad_alloc&)
3327 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003328 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003329 }
3330}
3331
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003332void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3333{
3334 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3335
3336 try
3337 {
3338 switch (pname)
3339 {
3340 case GL_CURRENT_QUERY_EXT:
3341 break;
3342 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003343 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003344 }
3345
3346 gl::Context *context = gl::getNonLostContext();
3347
3348 if (context)
3349 {
3350 params[0] = context->getActiveQuery(target);
3351 }
3352 }
3353 catch(std::bad_alloc&)
3354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003355 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003356 }
3357}
3358
3359void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3360{
3361 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3362
3363 try
3364 {
3365 switch (pname)
3366 {
3367 case GL_QUERY_RESULT_EXT:
3368 case GL_QUERY_RESULT_AVAILABLE_EXT:
3369 break;
3370 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003371 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003372 }
3373 gl::Context *context = gl::getNonLostContext();
3374
3375 if (context)
3376 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003377 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3378
3379 if (!queryObject)
3380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003381 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003382 }
3383
3384 if (context->getActiveQuery(queryObject->getType()) == id)
3385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003386 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003387 }
3388
3389 switch(pname)
3390 {
3391 case GL_QUERY_RESULT_EXT:
3392 params[0] = queryObject->getResult();
3393 break;
3394 case GL_QUERY_RESULT_AVAILABLE_EXT:
3395 params[0] = queryObject->isResultAvailable();
3396 break;
3397 default:
3398 ASSERT(false);
3399 }
3400 }
3401 }
3402 catch(std::bad_alloc&)
3403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003404 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003405 }
3406}
3407
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003408void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3409{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003410 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 +00003411
3412 try
3413 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003414 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003415
3416 if (context)
3417 {
3418 if (target != GL_RENDERBUFFER)
3419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003420 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003421 }
3422
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003423 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003425 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003426 }
3427
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003428 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003429
3430 switch (pname)
3431 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003432 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3433 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3434 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3435 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3436 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3437 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3438 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3439 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3440 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003441 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003442 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003443 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003444 *params = renderbuffer->getSamples();
3445 }
3446 else
3447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003448 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003449 }
3450 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003451 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003452 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003453 }
3454 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003455 }
3456 catch(std::bad_alloc&)
3457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003458 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003459 }
3460}
3461
3462void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3463{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003464 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003465
3466 try
3467 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003468 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003469
3470 if (context)
3471 {
3472 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003473
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003474 if (!shaderObject)
3475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003476 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003477 }
3478
3479 switch (pname)
3480 {
3481 case GL_SHADER_TYPE:
3482 *params = shaderObject->getType();
3483 return;
3484 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003485 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003486 return;
3487 case GL_COMPILE_STATUS:
3488 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3489 return;
3490 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003491 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003492 return;
3493 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003494 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003495 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003496 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3497 *params = shaderObject->getTranslatedSourceLength();
3498 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003499 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003500 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003501 }
3502 }
3503 }
3504 catch(std::bad_alloc&)
3505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003506 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003507 }
3508}
3509
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003510void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003511{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003512 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 +00003513 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003514
3515 try
3516 {
3517 if (bufsize < 0)
3518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003519 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003520 }
3521
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003522 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003523
3524 if (context)
3525 {
3526 gl::Shader *shaderObject = context->getShader(shader);
3527
3528 if (!shaderObject)
3529 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003530 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003531 }
3532
3533 shaderObject->getInfoLog(bufsize, length, infolog);
3534 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003535 }
3536 catch(std::bad_alloc&)
3537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003538 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003539 }
3540}
3541
3542void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3543{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003544 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 +00003545 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003546
3547 try
3548 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003549 switch (shadertype)
3550 {
3551 case GL_VERTEX_SHADER:
3552 case GL_FRAGMENT_SHADER:
3553 break;
3554 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003555 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003556 }
3557
3558 switch (precisiontype)
3559 {
3560 case GL_LOW_FLOAT:
3561 case GL_MEDIUM_FLOAT:
3562 case GL_HIGH_FLOAT:
3563 // Assume IEEE 754 precision
3564 range[0] = 127;
3565 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003566 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003567 break;
3568 case GL_LOW_INT:
3569 case GL_MEDIUM_INT:
3570 case GL_HIGH_INT:
3571 // Some (most) hardware only supports single-precision floating-point numbers,
3572 // which can accurately represent integers up to +/-16777216
3573 range[0] = 24;
3574 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003575 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003576 break;
3577 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003578 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003579 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003580 }
3581 catch(std::bad_alloc&)
3582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003583 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003584 }
3585}
3586
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003587void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003588{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003589 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 +00003590 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003591
3592 try
3593 {
3594 if (bufsize < 0)
3595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003596 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003597 }
3598
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003599 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003600
3601 if (context)
3602 {
3603 gl::Shader *shaderObject = context->getShader(shader);
3604
3605 if (!shaderObject)
3606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003607 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003608 }
3609
3610 shaderObject->getSource(bufsize, length, source);
3611 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003612 }
3613 catch(std::bad_alloc&)
3614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003615 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003616 }
3617}
3618
zmo@google.coma574f782011-10-03 21:45:23 +00003619void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3620{
3621 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3622 shader, bufsize, length, source);
3623
3624 try
3625 {
3626 if (bufsize < 0)
3627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003628 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003629 }
3630
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003631 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003632
3633 if (context)
3634 {
3635 gl::Shader *shaderObject = context->getShader(shader);
3636
3637 if (!shaderObject)
3638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003639 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003640 }
3641
3642 shaderObject->getTranslatedSource(bufsize, length, source);
3643 }
3644 }
3645 catch(std::bad_alloc&)
3646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003647 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003648 }
3649}
3650
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003651const GLubyte* __stdcall glGetString(GLenum name)
3652{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003653 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003654
3655 try
3656 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003657 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003658
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003659 switch (name)
3660 {
3661 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003662 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003663 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003664 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003665 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003666 if (context->getClientVersion() == 2)
3667 {
3668 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
3669 }
3670 else
3671 {
3672 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
3673 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003674 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003675 if (context->getClientVersion() == 2)
3676 {
3677 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
3678 }
3679 else
3680 {
3681 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
3682 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003683 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003684 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003685 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003686 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003687 }
3688 }
3689 catch(std::bad_alloc&)
3690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003691 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003692 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003693}
3694
3695void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3696{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003697 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 +00003698
3699 try
3700 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003701 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003702
3703 if (context)
3704 {
Jamie Madill35d15012013-10-07 10:46:37 -04003705 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003706
Jamie Madillfb8a8302013-07-03 14:24:12 -04003707 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003709 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003710 }
3711
3712 switch (pname)
3713 {
3714 case GL_TEXTURE_MAG_FILTER:
3715 *params = (GLfloat)texture->getMagFilter();
3716 break;
3717 case GL_TEXTURE_MIN_FILTER:
3718 *params = (GLfloat)texture->getMinFilter();
3719 break;
3720 case GL_TEXTURE_WRAP_S:
3721 *params = (GLfloat)texture->getWrapS();
3722 break;
3723 case GL_TEXTURE_WRAP_T:
3724 *params = (GLfloat)texture->getWrapT();
3725 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003726 case GL_TEXTURE_WRAP_R:
3727 if (context->getClientVersion() < 3)
3728 {
3729 return gl::error(GL_INVALID_ENUM);
3730 }
3731 *params = (GLfloat)texture->getWrapR();
3732 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003733 case GL_TEXTURE_IMMUTABLE_FORMAT:
3734 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003735 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3736 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003737 case GL_TEXTURE_IMMUTABLE_LEVELS:
3738 if (context->getClientVersion() < 3)
3739 {
3740 return gl::error(GL_INVALID_ENUM);
3741 }
Jamie Madill51a94372013-10-24 17:49:43 -04003742 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003743 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003744 case GL_TEXTURE_USAGE_ANGLE:
3745 *params = (GLfloat)texture->getUsage();
3746 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003747 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3748 if (!context->supportsTextureFilterAnisotropy())
3749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003750 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003751 }
3752 *params = (GLfloat)texture->getMaxAnisotropy();
3753 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003754 case GL_TEXTURE_SWIZZLE_R:
3755 if (context->getClientVersion() < 3)
3756 {
3757 return gl::error(GL_INVALID_ENUM);
3758 }
3759 *params = (GLfloat)texture->getSwizzleRed();
3760 break;
3761 case GL_TEXTURE_SWIZZLE_G:
3762 if (context->getClientVersion() < 3)
3763 {
3764 return gl::error(GL_INVALID_ENUM);
3765 }
3766 *params = (GLfloat)texture->getSwizzleGreen();
3767 break;
3768 case GL_TEXTURE_SWIZZLE_B:
3769 if (context->getClientVersion() < 3)
3770 {
3771 return gl::error(GL_INVALID_ENUM);
3772 }
3773 *params = (GLfloat)texture->getSwizzleBlue();
3774 break;
3775 case GL_TEXTURE_SWIZZLE_A:
3776 if (context->getClientVersion() < 3)
3777 {
3778 return gl::error(GL_INVALID_ENUM);
3779 }
3780 *params = (GLfloat)texture->getSwizzleAlpha();
3781 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003782 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003783 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003784 }
3785 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003786 }
3787 catch(std::bad_alloc&)
3788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003789 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003790 }
3791}
3792
3793void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3794{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003795 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 +00003796
3797 try
3798 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003799 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003800
3801 if (context)
3802 {
Jamie Madill35d15012013-10-07 10:46:37 -04003803 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003804
Jamie Madillfb8a8302013-07-03 14:24:12 -04003805 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003807 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003808 }
3809
3810 switch (pname)
3811 {
3812 case GL_TEXTURE_MAG_FILTER:
3813 *params = texture->getMagFilter();
3814 break;
3815 case GL_TEXTURE_MIN_FILTER:
3816 *params = texture->getMinFilter();
3817 break;
3818 case GL_TEXTURE_WRAP_S:
3819 *params = texture->getWrapS();
3820 break;
3821 case GL_TEXTURE_WRAP_T:
3822 *params = texture->getWrapT();
3823 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003824 case GL_TEXTURE_WRAP_R:
3825 if (context->getClientVersion() < 3)
3826 {
3827 return gl::error(GL_INVALID_ENUM);
3828 }
3829 *params = texture->getWrapR();
3830 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003831 case GL_TEXTURE_IMMUTABLE_FORMAT:
3832 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003833 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3834 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003835 case GL_TEXTURE_IMMUTABLE_LEVELS:
3836 if (context->getClientVersion() < 3)
3837 {
3838 return gl::error(GL_INVALID_ENUM);
3839 }
Jamie Madill51a94372013-10-24 17:49:43 -04003840 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003841 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003842 case GL_TEXTURE_USAGE_ANGLE:
3843 *params = texture->getUsage();
3844 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003845 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3846 if (!context->supportsTextureFilterAnisotropy())
3847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003848 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003849 }
3850 *params = (GLint)texture->getMaxAnisotropy();
3851 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003852 case GL_TEXTURE_SWIZZLE_R:
3853 if (context->getClientVersion() < 3)
3854 {
3855 return gl::error(GL_INVALID_ENUM);
3856 }
3857 *params = texture->getSwizzleRed();
3858 break;
3859 case GL_TEXTURE_SWIZZLE_G:
3860 if (context->getClientVersion() < 3)
3861 {
3862 return gl::error(GL_INVALID_ENUM);
3863 }
3864 *params = texture->getSwizzleGreen();
3865 break;
3866 case GL_TEXTURE_SWIZZLE_B:
3867 if (context->getClientVersion() < 3)
3868 {
3869 return gl::error(GL_INVALID_ENUM);
3870 }
3871 *params = texture->getSwizzleBlue();
3872 break;
3873 case GL_TEXTURE_SWIZZLE_A:
3874 if (context->getClientVersion() < 3)
3875 {
3876 return gl::error(GL_INVALID_ENUM);
3877 }
3878 *params = texture->getSwizzleAlpha();
3879 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003880
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003881 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003882 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003883 }
3884 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003885 }
3886 catch(std::bad_alloc&)
3887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003888 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003889 }
3890}
3891
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003892void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3893{
3894 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3895 program, location, bufSize, params);
3896
3897 try
3898 {
3899 if (bufSize < 0)
3900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003901 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003902 }
3903
3904 gl::Context *context = gl::getNonLostContext();
3905
3906 if (context)
3907 {
3908 if (program == 0)
3909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003910 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003911 }
3912
3913 gl::Program *programObject = context->getProgram(program);
3914
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003915 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003917 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003918 }
3919
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003920 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3921 if (!programBinary)
3922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003923 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003924 }
3925
3926 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003928 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003929 }
3930 }
3931 }
3932 catch(std::bad_alloc&)
3933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003934 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003935 }
3936}
3937
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003938void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3939{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003940 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003941
3942 try
3943 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003944 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003945
3946 if (context)
3947 {
3948 if (program == 0)
3949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003950 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003951 }
3952
3953 gl::Program *programObject = context->getProgram(program);
3954
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003955 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003957 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003958 }
3959
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003960 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3961 if (!programBinary)
3962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003963 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003964 }
3965
3966 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003967 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003968 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003969 }
3970 }
3971 }
3972 catch(std::bad_alloc&)
3973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003974 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003975 }
3976}
3977
3978void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3979{
3980 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3981 program, location, bufSize, params);
3982
3983 try
3984 {
3985 if (bufSize < 0)
3986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003987 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003988 }
3989
3990 gl::Context *context = gl::getNonLostContext();
3991
3992 if (context)
3993 {
3994 if (program == 0)
3995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003996 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003997 }
3998
3999 gl::Program *programObject = context->getProgram(program);
4000
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004001 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004003 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004004 }
4005
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004006 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4007 if (!programBinary)
4008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004009 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004010 }
4011
4012 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004014 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004015 }
4016 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004017 }
4018 catch(std::bad_alloc&)
4019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004020 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004021 }
4022}
4023
4024void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4025{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004026 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004027
4028 try
4029 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004030 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004031
4032 if (context)
4033 {
4034 if (program == 0)
4035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004036 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004037 }
4038
4039 gl::Program *programObject = context->getProgram(program);
4040
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004041 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004043 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004044 }
4045
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004046 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4047 if (!programBinary)
4048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004049 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004050 }
4051
4052 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004054 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004055 }
4056 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004057 }
4058 catch(std::bad_alloc&)
4059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004060 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004061 }
4062}
4063
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004064int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004065{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004066 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004067
4068 try
4069 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004070 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004071
4072 if (strstr(name, "gl_") == name)
4073 {
4074 return -1;
4075 }
4076
4077 if (context)
4078 {
4079 gl::Program *programObject = context->getProgram(program);
4080
4081 if (!programObject)
4082 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004083 if (context->getShader(program))
4084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004085 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004086 }
4087 else
4088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004089 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004090 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004091 }
4092
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004093 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004094 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004096 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004097 }
4098
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004099 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004100 }
4101 }
4102 catch(std::bad_alloc&)
4103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004104 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004105 }
4106
4107 return -1;
4108}
4109
4110void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4111{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004112 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004113
4114 try
4115 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004116 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004117
daniel@transgaming.come0078962010-04-15 20:45:08 +00004118 if (context)
4119 {
4120 if (index >= gl::MAX_VERTEX_ATTRIBS)
4121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004122 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004123 }
4124
daniel@transgaming.com83921382011-01-08 05:46:00 +00004125 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004126
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004127 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004128 {
Jamie Madillaff71502013-07-02 11:57:05 -04004129 return;
4130 }
4131
4132 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4133 {
4134 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4135 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004136 {
Jamie Madillaff71502013-07-02 11:57:05 -04004137 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004138 }
Jamie Madillaff71502013-07-02 11:57:05 -04004139 }
4140 else
4141 {
4142 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004143 }
4144 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004145 }
4146 catch(std::bad_alloc&)
4147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004148 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004149 }
4150}
4151
4152void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4153{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004154 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
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
daniel@transgaming.come0078962010-04-15 20:45:08 +00004160 if (context)
4161 {
4162 if (index >= gl::MAX_VERTEX_ATTRIBS)
4163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004164 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004165 }
4166
daniel@transgaming.com83921382011-01-08 05:46:00 +00004167 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004168
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004169 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004170 {
Jamie Madillaff71502013-07-02 11:57:05 -04004171 return;
4172 }
4173
4174 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4175 {
4176 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4177 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004178 {
Jamie Madillaff71502013-07-02 11:57:05 -04004179 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04004180 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004181 }
Jamie Madillaff71502013-07-02 11:57:05 -04004182 }
4183 else
4184 {
4185 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004186 }
4187 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004188 }
4189 catch(std::bad_alloc&)
4190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004191 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004192 }
4193}
4194
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004195void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004196{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004197 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004198
4199 try
4200 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004201 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004202
daniel@transgaming.come0078962010-04-15 20:45:08 +00004203 if (context)
4204 {
4205 if (index >= gl::MAX_VERTEX_ATTRIBS)
4206 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004207 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004208 }
4209
4210 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004212 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004213 }
4214
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004215 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004216 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004217 }
4218 catch(std::bad_alloc&)
4219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004220 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004221 }
4222}
4223
4224void __stdcall glHint(GLenum target, GLenum mode)
4225{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004226 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004227
4228 try
4229 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004230 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004231 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004232 case GL_FASTEST:
4233 case GL_NICEST:
4234 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004235 break;
4236 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004237 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004238 }
4239
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004240 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004241 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004242 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004243 case GL_GENERATE_MIPMAP_HINT:
4244 if (context) context->setGenerateMipmapHint(mode);
4245 break;
4246 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4247 if (context) context->setFragmentShaderDerivativeHint(mode);
4248 break;
4249 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004250 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004251 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004252 }
4253 catch(std::bad_alloc&)
4254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004255 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004256 }
4257}
4258
4259GLboolean __stdcall glIsBuffer(GLuint buffer)
4260{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004261 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004262
4263 try
4264 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004265 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004266
4267 if (context && buffer)
4268 {
4269 gl::Buffer *bufferObject = context->getBuffer(buffer);
4270
4271 if (bufferObject)
4272 {
4273 return GL_TRUE;
4274 }
4275 }
4276 }
4277 catch(std::bad_alloc&)
4278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004279 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004280 }
4281
4282 return GL_FALSE;
4283}
4284
4285GLboolean __stdcall glIsEnabled(GLenum cap)
4286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004287 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004288
4289 try
4290 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004292
4293 if (context)
4294 {
4295 switch (cap)
4296 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004297 case GL_CULL_FACE: return context->isCullFaceEnabled();
4298 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4299 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4300 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4301 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4302 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4303 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4304 case GL_BLEND: return context->isBlendEnabled();
4305 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004306 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004307 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004308 }
4309 }
4310 }
4311 catch(std::bad_alloc&)
4312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004313 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004314 }
4315
4316 return false;
4317}
4318
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004319GLboolean __stdcall glIsFenceNV(GLuint fence)
4320{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004321 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004322
4323 try
4324 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004325 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004326
4327 if (context)
4328 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004329 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004330
4331 if (fenceObject == NULL)
4332 {
4333 return GL_FALSE;
4334 }
4335
4336 return fenceObject->isFence();
4337 }
4338 }
4339 catch(std::bad_alloc&)
4340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004341 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004342 }
4343
4344 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004345}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004346
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004347GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4348{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004349 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004350
4351 try
4352 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004353 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004354
4355 if (context && framebuffer)
4356 {
4357 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4358
4359 if (framebufferObject)
4360 {
4361 return GL_TRUE;
4362 }
4363 }
4364 }
4365 catch(std::bad_alloc&)
4366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004367 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004368 }
4369
4370 return GL_FALSE;
4371}
4372
4373GLboolean __stdcall glIsProgram(GLuint program)
4374{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004375 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004376
4377 try
4378 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004379 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004380
4381 if (context && program)
4382 {
4383 gl::Program *programObject = context->getProgram(program);
4384
4385 if (programObject)
4386 {
4387 return GL_TRUE;
4388 }
4389 }
4390 }
4391 catch(std::bad_alloc&)
4392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004393 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004394 }
4395
4396 return GL_FALSE;
4397}
4398
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004399GLboolean __stdcall glIsQueryEXT(GLuint id)
4400{
4401 EVENT("(GLuint id = %d)", id);
4402
4403 try
4404 {
4405 if (id == 0)
4406 {
4407 return GL_FALSE;
4408 }
4409
4410 gl::Context *context = gl::getNonLostContext();
4411
4412 if (context)
4413 {
4414 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4415
4416 if (queryObject)
4417 {
4418 return GL_TRUE;
4419 }
4420 }
4421 }
4422 catch(std::bad_alloc&)
4423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004424 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004425 }
4426
4427 return GL_FALSE;
4428}
4429
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004430GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4431{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004432 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004433
4434 try
4435 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004436 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004437
4438 if (context && renderbuffer)
4439 {
4440 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4441
4442 if (renderbufferObject)
4443 {
4444 return GL_TRUE;
4445 }
4446 }
4447 }
4448 catch(std::bad_alloc&)
4449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004450 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004451 }
4452
4453 return GL_FALSE;
4454}
4455
4456GLboolean __stdcall glIsShader(GLuint shader)
4457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004458 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004459
4460 try
4461 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004462 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004463
4464 if (context && shader)
4465 {
4466 gl::Shader *shaderObject = context->getShader(shader);
4467
4468 if (shaderObject)
4469 {
4470 return GL_TRUE;
4471 }
4472 }
4473 }
4474 catch(std::bad_alloc&)
4475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004476 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004477 }
4478
4479 return GL_FALSE;
4480}
4481
4482GLboolean __stdcall glIsTexture(GLuint texture)
4483{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004484 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004485
4486 try
4487 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004488 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489
4490 if (context && texture)
4491 {
4492 gl::Texture *textureObject = context->getTexture(texture);
4493
4494 if (textureObject)
4495 {
4496 return GL_TRUE;
4497 }
4498 }
4499 }
4500 catch(std::bad_alloc&)
4501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004502 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004503 }
4504
4505 return GL_FALSE;
4506}
4507
4508void __stdcall glLineWidth(GLfloat width)
4509{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004510 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004511
4512 try
4513 {
4514 if (width <= 0.0f)
4515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004516 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004517 }
4518
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004519 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004520
4521 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004522 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004523 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004524 }
4525 }
4526 catch(std::bad_alloc&)
4527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004528 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004529 }
4530}
4531
4532void __stdcall glLinkProgram(GLuint program)
4533{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004534 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004535
4536 try
4537 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004538 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004539
4540 if (context)
4541 {
4542 gl::Program *programObject = context->getProgram(program);
4543
4544 if (!programObject)
4545 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004546 if (context->getShader(program))
4547 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004548 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004549 }
4550 else
4551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004552 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004553 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004554 }
4555
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004556 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004557 }
4558 }
4559 catch(std::bad_alloc&)
4560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004561 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004562 }
4563}
4564
4565void __stdcall glPixelStorei(GLenum pname, GLint param)
4566{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004567 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004568
4569 try
4570 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004571 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004572
4573 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004574 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004575 switch (pname)
4576 {
4577 case GL_UNPACK_ALIGNMENT:
4578 if (param != 1 && param != 2 && param != 4 && param != 8)
4579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004580 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004581 }
4582
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004583 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004584 break;
4585
4586 case GL_PACK_ALIGNMENT:
4587 if (param != 1 && param != 2 && param != 4 && param != 8)
4588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004589 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004590 }
4591
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004592 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004593 break;
4594
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004595 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4596 context->setPackReverseRowOrder(param != 0);
4597 break;
4598
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004599 case GL_UNPACK_IMAGE_HEIGHT:
4600 case GL_UNPACK_SKIP_IMAGES:
4601 case GL_UNPACK_ROW_LENGTH:
4602 case GL_UNPACK_SKIP_ROWS:
4603 case GL_UNPACK_SKIP_PIXELS:
4604 case GL_PACK_ROW_LENGTH:
4605 case GL_PACK_SKIP_ROWS:
4606 case GL_PACK_SKIP_PIXELS:
4607 if (context->getClientVersion() < 3)
4608 {
4609 return gl::error(GL_INVALID_ENUM);
4610 }
4611 UNIMPLEMENTED();
4612 break;
4613
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004614 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004615 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004616 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004617 }
4618 }
4619 catch(std::bad_alloc&)
4620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004621 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004622 }
4623}
4624
4625void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4626{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004627 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004628
4629 try
4630 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004631 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004632
4633 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004634 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004635 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004636 }
4637 }
4638 catch(std::bad_alloc&)
4639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004640 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004641 }
4642}
4643
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004644void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4645 GLenum format, GLenum type, GLsizei bufSize,
4646 GLvoid *data)
4647{
4648 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4649 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4650 x, y, width, height, format, type, bufSize, data);
4651
4652 try
4653 {
4654 if (width < 0 || height < 0 || bufSize < 0)
4655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004656 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004657 }
4658
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004659 gl::Context *context = gl::getNonLostContext();
4660
4661 if (context)
4662 {
Geoff Lang005df412013-10-16 14:12:50 -04004663 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004664
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004665 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4666 // and attempting to read back if that's the case is an error. The error will be registered
4667 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004668 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004669 return;
4670
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004671 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4672 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004673
4674 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004676 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004677 }
4678
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004679 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4680 }
4681 }
4682 catch(std::bad_alloc&)
4683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004684 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004685 }
4686}
4687
4688void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4689 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004690{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004691 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004692 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004693 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004694
4695 try
4696 {
4697 if (width < 0 || height < 0)
4698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004699 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004700 }
4701
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004702 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004703
4704 if (context)
4705 {
Geoff Lang005df412013-10-16 14:12:50 -04004706 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004707
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004708 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4709 // and attempting to read back if that's the case is an error. The error will be registered
4710 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004711 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004712 return;
4713
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004714 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4715 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004716
4717 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004719 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004720 }
4721
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004722 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004723 }
4724 }
4725 catch(std::bad_alloc&)
4726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004727 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004728 }
4729}
4730
4731void __stdcall glReleaseShaderCompiler(void)
4732{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004733 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004734
4735 try
4736 {
4737 gl::Shader::releaseCompiler();
4738 }
4739 catch(std::bad_alloc&)
4740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004741 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004742 }
4743}
4744
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004745void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004746{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004747 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 +00004748 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004749
4750 try
4751 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004752 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004753
4754 if (context)
4755 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004756 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004757 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004758 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004759 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004760 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004761
4762 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004763 }
4764 }
4765 catch(std::bad_alloc&)
4766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004767 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004768 }
4769}
4770
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004771void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4772{
4773 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4774}
4775
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004776void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4777{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004778 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004779
4780 try
4781 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004782 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004783
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004784 if (context)
4785 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004786 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004787 }
4788 }
4789 catch(std::bad_alloc&)
4790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004791 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004792 }
4793}
4794
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004795void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4796{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004797 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004798
4799 try
4800 {
4801 if (condition != GL_ALL_COMPLETED_NV)
4802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004803 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004804 }
4805
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004806 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004807
4808 if (context)
4809 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004810 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004811
4812 if (fenceObject == NULL)
4813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004814 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004815 }
4816
4817 fenceObject->setFence(condition);
4818 }
4819 }
4820 catch(std::bad_alloc&)
4821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004822 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004823 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004824}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004825
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004826void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4827{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004828 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 +00004829
4830 try
4831 {
4832 if (width < 0 || height < 0)
4833 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004834 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004835 }
4836
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004837 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004838
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004839 if (context)
4840 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004841 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004842 }
4843 }
4844 catch(std::bad_alloc&)
4845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004846 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004847 }
4848}
4849
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004850void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004851{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004852 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004853 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004854 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004855
4856 try
4857 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004858 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004859 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004860 }
4861 catch(std::bad_alloc&)
4862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004863 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004864 }
4865}
4866
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004867void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004868{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004869 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 +00004870 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004871
4872 try
4873 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004874 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004875 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004876 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004877 }
4878
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004879 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004880
4881 if (context)
4882 {
4883 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004884
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004885 if (!shaderObject)
4886 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004887 if (context->getProgram(shader))
4888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004889 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004890 }
4891 else
4892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004893 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004894 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004895 }
4896
4897 shaderObject->setSource(count, string, length);
4898 }
4899 }
4900 catch(std::bad_alloc&)
4901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004902 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004903 }
4904}
4905
4906void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4907{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004908 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004909}
4910
4911void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4912{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004913 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 +00004914
4915 try
4916 {
4917 switch (face)
4918 {
4919 case GL_FRONT:
4920 case GL_BACK:
4921 case GL_FRONT_AND_BACK:
4922 break;
4923 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004924 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004925 }
4926
4927 switch (func)
4928 {
4929 case GL_NEVER:
4930 case GL_ALWAYS:
4931 case GL_LESS:
4932 case GL_LEQUAL:
4933 case GL_EQUAL:
4934 case GL_GEQUAL:
4935 case GL_GREATER:
4936 case GL_NOTEQUAL:
4937 break;
4938 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004939 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004940 }
4941
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004942 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004943
4944 if (context)
4945 {
4946 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4947 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004948 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004949 }
4950
4951 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4952 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004953 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004954 }
4955 }
4956 }
4957 catch(std::bad_alloc&)
4958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004959 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004960 }
4961}
4962
4963void __stdcall glStencilMask(GLuint mask)
4964{
4965 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4966}
4967
4968void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4969{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004970 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004971
4972 try
4973 {
4974 switch (face)
4975 {
4976 case GL_FRONT:
4977 case GL_BACK:
4978 case GL_FRONT_AND_BACK:
4979 break;
4980 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004981 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004982 }
4983
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004984 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004985
4986 if (context)
4987 {
4988 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4989 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004990 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004991 }
4992
4993 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4994 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004995 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004996 }
4997 }
4998 }
4999 catch(std::bad_alloc&)
5000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005001 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005002 }
5003}
5004
5005void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5006{
5007 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5008}
5009
5010void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5011{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005012 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 +00005013 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005014
5015 try
5016 {
5017 switch (face)
5018 {
5019 case GL_FRONT:
5020 case GL_BACK:
5021 case GL_FRONT_AND_BACK:
5022 break;
5023 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005024 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005025 }
5026
5027 switch (fail)
5028 {
5029 case GL_ZERO:
5030 case GL_KEEP:
5031 case GL_REPLACE:
5032 case GL_INCR:
5033 case GL_DECR:
5034 case GL_INVERT:
5035 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005036 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005037 break;
5038 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005039 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005040 }
5041
5042 switch (zfail)
5043 {
5044 case GL_ZERO:
5045 case GL_KEEP:
5046 case GL_REPLACE:
5047 case GL_INCR:
5048 case GL_DECR:
5049 case GL_INVERT:
5050 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005051 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005052 break;
5053 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005054 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005055 }
5056
5057 switch (zpass)
5058 {
5059 case GL_ZERO:
5060 case GL_KEEP:
5061 case GL_REPLACE:
5062 case GL_INCR:
5063 case GL_DECR:
5064 case GL_INVERT:
5065 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005066 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005067 break;
5068 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005069 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005070 }
5071
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005072 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005073
5074 if (context)
5075 {
5076 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5077 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005078 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005079 }
5080
5081 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5082 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005083 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005084 }
5085 }
5086 }
5087 catch(std::bad_alloc&)
5088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005089 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005090 }
5091}
5092
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005093GLboolean __stdcall glTestFenceNV(GLuint fence)
5094{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005095 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005096
5097 try
5098 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005099 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005100
5101 if (context)
5102 {
Jamie Madill33dc8432013-07-26 11:55:05 -04005103 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005104
5105 if (fenceObject == NULL)
5106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005107 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005108 }
5109
Jamie Madillfb9a7402013-07-26 11:55:01 -04005110 if (fenceObject->isFence() != GL_TRUE)
5111 {
5112 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
5113 }
5114
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005115 return fenceObject->testFence();
5116 }
5117 }
5118 catch(std::bad_alloc&)
5119 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005120 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005121 }
5122
5123 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005124}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005125
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005126void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5127 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005128{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005129 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 +00005130 "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 +00005131 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005132
5133 try
5134 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005135 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005136
5137 if (context)
5138 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005139 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005140 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005141 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005142 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005143 return;
5144 }
5145
5146 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005147 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005148 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005149 {
5150 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005151 }
5152
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005153 switch (target)
5154 {
5155 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005156 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005157 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005158 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005159 }
5160 break;
5161 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005162 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005163 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005164 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005165 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005166 break;
5167 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5168 {
5169 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005170 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005171 }
5172 break;
5173 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5174 {
5175 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005176 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005177 }
5178 break;
5179 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5180 {
5181 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005182 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005183 }
5184 break;
5185 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5186 {
5187 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005188 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005189 }
5190 break;
5191 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5192 {
5193 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005194 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005195 }
5196 break;
5197 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005198 }
5199 }
5200 }
5201 catch(std::bad_alloc&)
5202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005203 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005204 }
5205}
5206
5207void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5208{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005209 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5210
5211 try
5212 {
5213 gl::Context *context = gl::getNonLostContext();
5214
5215 if (context)
5216 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005217 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04005218 {
5219 return;
5220 }
5221
Jamie Madill35d15012013-10-07 10:46:37 -04005222 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005223
Jamie Madillfb8a8302013-07-03 14:24:12 -04005224 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005226 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005227 }
5228
5229 switch (pname)
5230 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005231 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5232 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5233 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5234 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5235 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5236 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
5237 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
5238 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5239 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005240 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
5241 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
5242 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
5243 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005244
Jamie Madill478fdb22013-07-19 16:36:59 -04005245 case GL_TEXTURE_BASE_LEVEL:
5246 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005247 case GL_TEXTURE_MIN_LOD:
5248 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005249 UNIMPLEMENTED();
5250 break;
5251
Jamie Madill478fdb22013-07-19 16:36:59 -04005252 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005253 }
5254 }
5255 }
5256 catch(std::bad_alloc&)
5257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005258 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005259 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005260}
5261
5262void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5263{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005264 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265}
5266
5267void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5268{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005269 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005270
5271 try
5272 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005273 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005274
5275 if (context)
5276 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005277 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005278 {
5279 return;
5280 }
5281
Jamie Madill35d15012013-10-07 10:46:37 -04005282 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005283
Jamie Madillfb8a8302013-07-03 14:24:12 -04005284 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005286 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005287 }
5288
5289 switch (pname)
5290 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005291 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5292 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5293 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5294 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5295 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5296 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5297 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5298 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5299 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005300 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5301 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5302 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5303 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005304
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005305 case GL_TEXTURE_BASE_LEVEL:
5306 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005307 case GL_TEXTURE_MIN_LOD:
5308 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005309 UNIMPLEMENTED();
5310 break;
5311
Jamie Madill478fdb22013-07-19 16:36:59 -04005312 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005313 }
5314 }
5315 }
5316 catch(std::bad_alloc&)
5317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005318 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005319 }
5320}
5321
5322void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5323{
5324 glTexParameteri(target, pname, *params);
5325}
5326
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005327void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5328{
5329 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5330 target, levels, internalformat, width, height);
5331
5332 try
5333 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005334 gl::Context *context = gl::getNonLostContext();
5335
5336 if (context)
5337 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005338 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005339 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005340 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005341 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005342 }
5343
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005344 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005345 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005346 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005347 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005348 }
5349
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005350 switch (target)
5351 {
5352 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005353 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005354 gl::Texture2D *texture2d = context->getTexture2D();
5355 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005356 }
5357 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005358
Geoff Lang01c21d22013-09-24 11:52:16 -04005359 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005360 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005361 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5362 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005363 }
5364 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005365
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005366 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005367 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005368 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005369 }
5370 }
5371 catch(std::bad_alloc&)
5372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005373 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005374 }
5375}
5376
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005377void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5378 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005379{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005380 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005381 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005382 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005383 target, level, xoffset, yoffset, width, height, format, type, pixels);
5384
5385 try
5386 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005388
5389 if (context)
5390 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005391 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005392 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005393 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005394 {
5395 return;
5396 }
5397
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005398 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005399 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005400 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005401 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005402 return;
5403 }
5404
5405 switch (target)
5406 {
5407 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005408 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005409 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005410 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005411 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005412 break;
5413
5414 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5415 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5416 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5417 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5418 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5419 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005420 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005421 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005422 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005423 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005424 break;
5425
5426 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005427 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005428 }
5429 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005430 }
5431 catch(std::bad_alloc&)
5432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005433 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005434 }
5435}
5436
5437void __stdcall glUniform1f(GLint location, GLfloat x)
5438{
5439 glUniform1fv(location, 1, &x);
5440}
5441
5442void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5443{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005444 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005445
5446 try
5447 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005448 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.com4f39fd92010-03-08 20:26:45 +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->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005470 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005471 }
5472 }
5473 }
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 glUniform1i(GLint location, GLint x)
5481{
5482 glUniform1iv(location, 1, &x);
5483}
5484
5485void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5486{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005487 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005488
5489 try
5490 {
5491 if (count < 0)
5492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005493 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005494 }
5495
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005496 if (location == -1)
5497 {
5498 return;
5499 }
5500
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005501 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005502
5503 if (context)
5504 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005505 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005506 if (!programBinary)
5507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005508 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005509 }
5510
5511 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005513 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005514 }
5515 }
5516 }
5517 catch(std::bad_alloc&)
5518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005519 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005520 }
5521}
5522
5523void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5524{
5525 GLfloat xy[2] = {x, y};
5526
5527 glUniform2fv(location, 1, (GLfloat*)&xy);
5528}
5529
5530void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005532 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005533
5534 try
5535 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005536 if (count < 0)
5537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005538 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005539 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005540
5541 if (location == -1)
5542 {
5543 return;
5544 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005545
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005546 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005547
5548 if (context)
5549 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005550 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005551 if (!programBinary)
5552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005553 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005554 }
5555
5556 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005558 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005559 }
5560 }
5561 }
5562 catch(std::bad_alloc&)
5563 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005564 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005565 }
5566}
5567
5568void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5569{
5570 GLint xy[4] = {x, y};
5571
5572 glUniform2iv(location, 1, (GLint*)&xy);
5573}
5574
5575void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5576{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005577 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005578
5579 try
5580 {
5581 if (count < 0)
5582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005583 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005584 }
5585
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005586 if (location == -1)
5587 {
5588 return;
5589 }
5590
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005591 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005592
5593 if (context)
5594 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005595 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005596 if (!programBinary)
5597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005598 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005599 }
5600
5601 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005603 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005604 }
5605 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005606 }
5607 catch(std::bad_alloc&)
5608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005609 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005610 }
5611}
5612
5613void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5614{
5615 GLfloat xyz[3] = {x, y, z};
5616
5617 glUniform3fv(location, 1, (GLfloat*)&xyz);
5618}
5619
5620void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5621{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005622 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005623
5624 try
5625 {
5626 if (count < 0)
5627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005628 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005629 }
5630
5631 if (location == -1)
5632 {
5633 return;
5634 }
5635
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005636 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005637
5638 if (context)
5639 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005640 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005641 if (!programBinary)
5642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005643 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005644 }
5645
5646 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005648 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005649 }
5650 }
5651 }
5652 catch(std::bad_alloc&)
5653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005654 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005655 }
5656}
5657
5658void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5659{
5660 GLint xyz[3] = {x, y, z};
5661
5662 glUniform3iv(location, 1, (GLint*)&xyz);
5663}
5664
5665void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5666{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005667 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005668
5669 try
5670 {
5671 if (count < 0)
5672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005673 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005674 }
5675
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005676 if (location == -1)
5677 {
5678 return;
5679 }
5680
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005681 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005682
5683 if (context)
5684 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005685 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005686 if (!programBinary)
5687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005688 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005689 }
5690
5691 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005693 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005694 }
5695 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005696 }
5697 catch(std::bad_alloc&)
5698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005699 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700 }
5701}
5702
5703void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5704{
5705 GLfloat xyzw[4] = {x, y, z, w};
5706
5707 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5708}
5709
5710void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5711{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005712 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005713
5714 try
5715 {
5716 if (count < 0)
5717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005718 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005719 }
5720
5721 if (location == -1)
5722 {
5723 return;
5724 }
5725
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005726 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005727
5728 if (context)
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
5736 if (!programBinary->setUniform4fv(location, count, v))
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 glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5749{
5750 GLint xyzw[4] = {x, y, z, w};
5751
5752 glUniform4iv(location, 1, (GLint*)&xyzw);
5753}
5754
5755void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5756{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005757 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005758
5759 try
5760 {
5761 if (count < 0)
5762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005763 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005764 }
5765
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005766 if (location == -1)
5767 {
5768 return;
5769 }
5770
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005771 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005772
5773 if (context)
5774 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005775 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005776 if (!programBinary)
5777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005778 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005779 }
5780
5781 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005783 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005784 }
5785 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005786 }
5787 catch(std::bad_alloc&)
5788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005789 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005790 }
5791}
5792
5793void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5794{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005795 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005796 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005797
5798 try
5799 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005800 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005802 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005803 }
5804
5805 if (location == -1)
5806 {
5807 return;
5808 }
5809
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005810 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005811
5812 if (context)
5813 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005814 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5815 {
5816 return gl::error(GL_INVALID_VALUE);
5817 }
5818
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005819 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005820 if (!programBinary)
5821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005822 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005823 }
5824
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005825 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005827 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005828 }
5829 }
5830 }
5831 catch(std::bad_alloc&)
5832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005833 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005834 }
5835}
5836
5837void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5838{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005839 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005840 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005841
5842 try
5843 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005844 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005846 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005847 }
5848
5849 if (location == -1)
5850 {
5851 return;
5852 }
5853
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005854 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005855
5856 if (context)
5857 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005858 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5859 {
5860 return gl::error(GL_INVALID_VALUE);
5861 }
5862
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005863 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005864 if (!programBinary)
5865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005866 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005867 }
5868
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005869 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005871 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005872 }
5873 }
5874 }
5875 catch(std::bad_alloc&)
5876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005877 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005878 }
5879}
5880
5881void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5882{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005883 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005884 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005885
5886 try
5887 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005888 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005890 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005891 }
5892
5893 if (location == -1)
5894 {
5895 return;
5896 }
5897
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005898 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005899
5900 if (context)
5901 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005902 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5903 {
5904 return gl::error(GL_INVALID_VALUE);
5905 }
5906
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005907 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005908 if (!programBinary)
5909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005910 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005911 }
5912
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005913 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005914 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005915 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005916 }
5917 }
5918 }
5919 catch(std::bad_alloc&)
5920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005921 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005922 }
5923}
5924
5925void __stdcall glUseProgram(GLuint program)
5926{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005927 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005928
5929 try
5930 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005931 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005932
5933 if (context)
5934 {
5935 gl::Program *programObject = context->getProgram(program);
5936
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005937 if (!programObject && program != 0)
5938 {
5939 if (context->getShader(program))
5940 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005941 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005942 }
5943 else
5944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005945 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005946 }
5947 }
5948
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005949 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005951 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005952 }
5953
5954 context->useProgram(program);
5955 }
5956 }
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 glValidateProgram(GLuint program)
5964{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005965 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005966
5967 try
5968 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005969 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005970
5971 if (context)
5972 {
5973 gl::Program *programObject = context->getProgram(program);
5974
5975 if (!programObject)
5976 {
5977 if (context->getShader(program))
5978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005979 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005980 }
5981 else
5982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005983 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005984 }
5985 }
5986
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005987 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005988 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005989 }
5990 catch(std::bad_alloc&)
5991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005992 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005993 }
5994}
5995
5996void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5997{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005998 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005999
6000 try
6001 {
6002 if (index >= gl::MAX_VERTEX_ATTRIBS)
6003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006004 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006005 }
6006
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006007 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006008
6009 if (context)
6010 {
6011 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006012 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006013 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006014 }
6015 catch(std::bad_alloc&)
6016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006017 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006018 }
6019}
6020
6021void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6022{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006023 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006024
6025 try
6026 {
6027 if (index >= gl::MAX_VERTEX_ATTRIBS)
6028 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006029 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006030 }
6031
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006032 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006033
6034 if (context)
6035 {
6036 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006037 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006038 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006039 }
6040 catch(std::bad_alloc&)
6041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006042 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006043 }
6044}
6045
6046void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6047{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006048 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006049
6050 try
6051 {
6052 if (index >= gl::MAX_VERTEX_ATTRIBS)
6053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006054 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006055 }
6056
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006057 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006058
6059 if (context)
6060 {
6061 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006062 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006063 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006064 }
6065 catch(std::bad_alloc&)
6066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006067 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006068 }
6069}
6070
6071void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6072{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006073 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006074
6075 try
6076 {
6077 if (index >= gl::MAX_VERTEX_ATTRIBS)
6078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006079 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006080 }
6081
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006082 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006083
6084 if (context)
6085 {
6086 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006087 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006088 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006089 }
6090 catch(std::bad_alloc&)
6091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006092 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006093 }
6094}
6095
6096void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6097{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006098 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 +00006099
6100 try
6101 {
6102 if (index >= gl::MAX_VERTEX_ATTRIBS)
6103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006104 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006105 }
6106
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006107 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006108
6109 if (context)
6110 {
6111 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006112 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006113 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006114 }
6115 catch(std::bad_alloc&)
6116 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006117 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006118 }
6119}
6120
6121void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6122{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006123 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006124
6125 try
6126 {
6127 if (index >= gl::MAX_VERTEX_ATTRIBS)
6128 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006129 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006130 }
6131
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006132 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006133
6134 if (context)
6135 {
6136 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006137 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006138 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006139 }
6140 catch(std::bad_alloc&)
6141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006142 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006143 }
6144}
6145
6146void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6147{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006148 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 +00006149
6150 try
6151 {
6152 if (index >= gl::MAX_VERTEX_ATTRIBS)
6153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006154 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006155 }
6156
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006157 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006158
6159 if (context)
6160 {
6161 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006162 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006163 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006164 }
6165 catch(std::bad_alloc&)
6166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006167 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006168 }
6169}
6170
6171void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6172{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006173 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006174
6175 try
6176 {
6177 if (index >= gl::MAX_VERTEX_ATTRIBS)
6178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006179 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006180 }
6181
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006182 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006183
6184 if (context)
6185 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006186 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006187 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006188 }
6189 catch(std::bad_alloc&)
6190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006191 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006192 }
6193}
6194
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006195void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6196{
6197 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6198
6199 try
6200 {
6201 if (index >= gl::MAX_VERTEX_ATTRIBS)
6202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006203 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006204 }
6205
6206 gl::Context *context = gl::getNonLostContext();
6207
6208 if (context)
6209 {
6210 context->setVertexAttribDivisor(index, divisor);
6211 }
6212 }
6213 catch(std::bad_alloc&)
6214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006215 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006216 }
6217}
6218
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006219void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006220{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006221 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006222 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006223 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006224
6225 try
6226 {
6227 if (index >= gl::MAX_VERTEX_ATTRIBS)
6228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006229 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006230 }
6231
6232 if (size < 1 || size > 4)
6233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006234 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006235 }
6236
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006237 gl::Context *context = gl::getNonLostContext();
6238
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006239 switch (type)
6240 {
6241 case GL_BYTE:
6242 case GL_UNSIGNED_BYTE:
6243 case GL_SHORT:
6244 case GL_UNSIGNED_SHORT:
6245 case GL_FIXED:
6246 case GL_FLOAT:
6247 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006248 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006249 case GL_INT:
6250 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006251 case GL_INT_2_10_10_10_REV:
6252 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006253 if (context && context->getClientVersion() < 3)
6254 {
6255 return gl::error(GL_INVALID_ENUM);
6256 }
6257 else
6258 {
6259 break;
6260 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006261 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006262 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006263 }
6264
6265 if (stride < 0)
6266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006267 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006268 }
6269
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006270 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6271 {
6272 return gl::error(GL_INVALID_OPERATION);
6273 }
6274
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006275 if (context)
6276 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006277 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6278 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6279 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6280 // and the pointer argument is not NULL.
6281 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6282 {
6283 return gl::error(GL_INVALID_OPERATION);
6284 }
6285
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006286 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6287 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006288 }
6289 }
6290 catch(std::bad_alloc&)
6291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006292 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006293 }
6294}
6295
6296void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6297{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006298 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 +00006299
6300 try
6301 {
6302 if (width < 0 || height < 0)
6303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006304 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006305 }
6306
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006307 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006308
6309 if (context)
6310 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006311 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006312 }
6313 }
6314 catch(std::bad_alloc&)
6315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006316 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006317 }
6318}
6319
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006320// OpenGL ES 3.0 functions
6321
6322void __stdcall glReadBuffer(GLenum mode)
6323{
6324 EVENT("(GLenum mode = 0x%X)", mode);
6325
6326 try
6327 {
6328 gl::Context *context = gl::getNonLostContext();
6329
6330 if (context)
6331 {
6332 if (context->getClientVersion() < 3)
6333 {
6334 return gl::error(GL_INVALID_OPERATION);
6335 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006336
Jamie Madill54133512013-06-21 09:33:07 -04006337 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006338 UNIMPLEMENTED();
6339 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006340 }
6341 catch(std::bad_alloc&)
6342 {
6343 return gl::error(GL_OUT_OF_MEMORY);
6344 }
6345}
6346
6347void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6348{
6349 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6350 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6351
6352 try
6353 {
6354 gl::Context *context = gl::getNonLostContext();
6355
6356 if (context)
6357 {
6358 if (context->getClientVersion() < 3)
6359 {
6360 return gl::error(GL_INVALID_OPERATION);
6361 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006362
Jamie Madill54133512013-06-21 09:33:07 -04006363 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006364 UNIMPLEMENTED();
6365 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006366 }
6367 catch(std::bad_alloc&)
6368 {
6369 return gl::error(GL_OUT_OF_MEMORY);
6370 }
6371}
6372
6373void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6374{
6375 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6376 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6377 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6378 target, level, internalformat, width, height, depth, border, format, type, pixels);
6379
6380 try
6381 {
6382 gl::Context *context = gl::getNonLostContext();
6383
6384 if (context)
6385 {
6386 if (context->getClientVersion() < 3)
6387 {
6388 return gl::error(GL_INVALID_OPERATION);
6389 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006390
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006391 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006392 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006393 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006394 {
6395 return;
6396 }
6397
6398 switch(target)
6399 {
6400 case GL_TEXTURE_3D:
6401 {
6402 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006403 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006404 }
6405 break;
6406
6407 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006408 {
6409 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006410 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006411 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006412 break;
6413
6414 default:
6415 return gl::error(GL_INVALID_ENUM);
6416 }
6417 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006418 }
6419 catch(std::bad_alloc&)
6420 {
6421 return gl::error(GL_OUT_OF_MEMORY);
6422 }
6423}
6424
6425void __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)
6426{
6427 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6428 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6429 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6430 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6431
6432 try
6433 {
6434 gl::Context *context = gl::getNonLostContext();
6435
6436 if (context)
6437 {
6438 if (context->getClientVersion() < 3)
6439 {
6440 return gl::error(GL_INVALID_OPERATION);
6441 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006442
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006443 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006444 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006445 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006446 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006447 {
6448 return;
6449 }
6450
6451 switch(target)
6452 {
6453 case GL_TEXTURE_3D:
6454 {
6455 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006456 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 +00006457 }
6458 break;
6459
6460 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006461 {
6462 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006463 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 +00006464 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006465 break;
6466
6467 default:
6468 return gl::error(GL_INVALID_ENUM);
6469 }
6470 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006471 }
6472 catch(std::bad_alloc&)
6473 {
6474 return gl::error(GL_OUT_OF_MEMORY);
6475 }
6476}
6477
6478void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6479{
6480 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6481 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6482 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6483
6484 try
6485 {
6486 gl::Context *context = gl::getNonLostContext();
6487
6488 if (context)
6489 {
6490 if (context->getClientVersion() < 3)
6491 {
6492 return gl::error(GL_INVALID_OPERATION);
6493 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006494
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006495 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006496 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006497 {
6498 return;
6499 }
6500
6501 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6502 gl::Texture *texture = NULL;
6503 switch (target)
6504 {
6505 case GL_TEXTURE_3D:
6506 texture = context->getTexture3D();
6507 break;
6508
6509 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006510 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006511 break;
6512
6513 default:
6514 return gl::error(GL_INVALID_ENUM);
6515 }
6516
6517 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6518 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006519 }
6520 catch(std::bad_alloc&)
6521 {
6522 return gl::error(GL_OUT_OF_MEMORY);
6523 }
6524}
6525
6526void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6527{
Geoff Langeef52cc2013-10-16 15:07:39 -04006528 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 +00006529 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6530 "const GLvoid* data = 0x%0.8p)",
6531 target, level, internalformat, width, height, depth, border, imageSize, data);
6532
6533 try
6534 {
6535 gl::Context *context = gl::getNonLostContext();
6536
6537 if (context)
6538 {
6539 if (context->getClientVersion() < 3)
6540 {
6541 return gl::error(GL_INVALID_OPERATION);
6542 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006543
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006544 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 +00006545 {
6546 return gl::error(GL_INVALID_VALUE);
6547 }
6548
6549 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006550 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006551 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006552 {
6553 return;
6554 }
6555
6556 switch(target)
6557 {
6558 case GL_TEXTURE_3D:
6559 {
6560 gl::Texture3D *texture = context->getTexture3D();
6561 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6562 }
6563 break;
6564
6565 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006566 {
6567 gl::Texture2DArray *texture = context->getTexture2DArray();
6568 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6569 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006570 break;
6571
6572 default:
6573 return gl::error(GL_INVALID_ENUM);
6574 }
6575 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006576 }
6577 catch(std::bad_alloc&)
6578 {
6579 return gl::error(GL_OUT_OF_MEMORY);
6580 }
6581}
6582
6583void __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)
6584{
6585 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6586 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6587 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6588 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6589
6590 try
6591 {
6592 gl::Context *context = gl::getNonLostContext();
6593
6594 if (context)
6595 {
6596 if (context->getClientVersion() < 3)
6597 {
6598 return gl::error(GL_INVALID_OPERATION);
6599 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006600
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006601 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 +00006602 {
6603 return gl::error(GL_INVALID_VALUE);
6604 }
6605
6606 if (!data)
6607 {
6608 return gl::error(GL_INVALID_VALUE);
6609 }
6610
6611 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006612 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006613 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006614 {
6615 return;
6616 }
6617
6618 switch(target)
6619 {
6620 case GL_TEXTURE_3D:
6621 {
6622 gl::Texture3D *texture = context->getTexture3D();
6623 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6624 format, imageSize, data);
6625 }
6626 break;
6627
6628 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006629 {
6630 gl::Texture2DArray *texture = context->getTexture2DArray();
6631 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6632 format, imageSize, data);
6633 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006634 break;
6635
6636 default:
6637 return gl::error(GL_INVALID_ENUM);
6638 }
6639 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006640 }
6641 catch(std::bad_alloc&)
6642 {
6643 return gl::error(GL_OUT_OF_MEMORY);
6644 }
6645}
6646
6647void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6648{
6649 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6650
6651 try
6652 {
6653 gl::Context *context = gl::getNonLostContext();
6654
6655 if (context)
6656 {
6657 if (context->getClientVersion() < 3)
6658 {
6659 return gl::error(GL_INVALID_OPERATION);
6660 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006661
Jamie Madill3641b4b2013-07-26 12:54:59 -04006662 glGenQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006663 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006664 }
6665 catch(std::bad_alloc&)
6666 {
6667 return gl::error(GL_OUT_OF_MEMORY);
6668 }
6669}
6670
6671void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6672{
6673 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6674
6675 try
6676 {
6677 gl::Context *context = gl::getNonLostContext();
6678
6679 if (context)
6680 {
6681 if (context->getClientVersion() < 3)
6682 {
6683 return gl::error(GL_INVALID_OPERATION);
6684 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006685
Jamie Madill3641b4b2013-07-26 12:54:59 -04006686 glDeleteQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006687 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006688 }
6689 catch(std::bad_alloc&)
6690 {
6691 return gl::error(GL_OUT_OF_MEMORY);
6692 }
6693}
6694
6695GLboolean __stdcall glIsQuery(GLuint id)
6696{
6697 EVENT("(GLuint id = %u)", id);
6698
6699 try
6700 {
6701 gl::Context *context = gl::getNonLostContext();
6702
6703 if (context)
6704 {
6705 if (context->getClientVersion() < 3)
6706 {
6707 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6708 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006709
Jamie Madill3641b4b2013-07-26 12:54:59 -04006710 // TODO: XFB queries
6711 return glIsQueryEXT(id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006712 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006713 }
6714 catch(std::bad_alloc&)
6715 {
6716 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6717 }
6718
6719 return GL_FALSE;
6720}
6721
6722void __stdcall glBeginQuery(GLenum target, GLuint id)
6723{
6724 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6725
6726 try
6727 {
6728 gl::Context *context = gl::getNonLostContext();
6729
6730 if (context)
6731 {
6732 if (context->getClientVersion() < 3)
6733 {
6734 return gl::error(GL_INVALID_OPERATION);
6735 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006736
Jamie Madill3641b4b2013-07-26 12:54:59 -04006737 switch (target)
6738 {
6739 case GL_ANY_SAMPLES_PASSED:
6740 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
6741 case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
6742 break;
6743 default:
6744 return gl::error(GL_INVALID_ENUM);
6745 }
6746
6747 if (id == 0)
6748 {
6749 return gl::error(GL_INVALID_OPERATION);
6750 }
6751
6752 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6753 {
6754 // TODO: XFB queries
6755 UNIMPLEMENTED();
6756 }
6757 else
6758 {
6759 context->beginQuery(target, id);
6760 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006761 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006762 }
6763 catch(std::bad_alloc&)
6764 {
6765 return gl::error(GL_OUT_OF_MEMORY);
6766 }
6767}
6768
6769void __stdcall glEndQuery(GLenum target)
6770{
6771 EVENT("(GLenum target = 0x%X)", target);
6772
6773 try
6774 {
6775 gl::Context *context = gl::getNonLostContext();
6776
6777 if (context)
6778 {
6779 if (context->getClientVersion() < 3)
6780 {
6781 return gl::error(GL_INVALID_OPERATION);
6782 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006783
Jamie Madill3641b4b2013-07-26 12:54:59 -04006784 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6785 {
6786 // TODO: XFB queries
6787 UNIMPLEMENTED();
6788 }
6789 else
6790 {
6791 glEndQueryEXT(target);
6792 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006793 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006794 }
6795 catch(std::bad_alloc&)
6796 {
6797 return gl::error(GL_OUT_OF_MEMORY);
6798 }
6799}
6800
6801void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6802{
6803 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6804
6805 try
6806 {
6807 gl::Context *context = gl::getNonLostContext();
6808
6809 if (context)
6810 {
6811 if (context->getClientVersion() < 3)
6812 {
6813 return gl::error(GL_INVALID_OPERATION);
6814 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006815
Jamie Madill3641b4b2013-07-26 12:54:59 -04006816 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6817 {
6818 // TODO: XFB queries
6819 UNIMPLEMENTED();
6820 }
6821 else
6822 {
6823 glGetQueryivEXT(target, pname, params);
6824 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006825 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006826 }
6827 catch(std::bad_alloc&)
6828 {
6829 return gl::error(GL_OUT_OF_MEMORY);
6830 }
6831}
6832
6833void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6834{
6835 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6836
6837 try
6838 {
6839 gl::Context *context = gl::getNonLostContext();
6840
6841 if (context)
6842 {
6843 if (context->getClientVersion() < 3)
6844 {
6845 return gl::error(GL_INVALID_OPERATION);
6846 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006847
Jamie Madill3641b4b2013-07-26 12:54:59 -04006848 // TODO: XFB queries
6849 glGetQueryObjectuivEXT(id, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006850 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006851 }
6852 catch(std::bad_alloc&)
6853 {
6854 return gl::error(GL_OUT_OF_MEMORY);
6855 }
6856}
6857
6858GLboolean __stdcall glUnmapBuffer(GLenum target)
6859{
6860 EVENT("(GLenum target = 0x%X)", target);
6861
6862 try
6863 {
6864 gl::Context *context = gl::getNonLostContext();
6865
6866 if (context)
6867 {
6868 if (context->getClientVersion() < 3)
6869 {
6870 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6871 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006872
Jamie Madill54133512013-06-21 09:33:07 -04006873 // glUnmapBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006874 UNIMPLEMENTED();
6875 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006876 }
6877 catch(std::bad_alloc&)
6878 {
6879 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6880 }
6881
6882 return GL_FALSE;
6883}
6884
6885void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6886{
6887 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6888
6889 try
6890 {
6891 gl::Context *context = gl::getNonLostContext();
6892
6893 if (context)
6894 {
6895 if (context->getClientVersion() < 3)
6896 {
6897 return gl::error(GL_INVALID_OPERATION);
6898 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006899
Jamie Madill54133512013-06-21 09:33:07 -04006900 // glGetBufferPointerv
shannonwoods@chromium.org2d2190a2013-05-30 00:17:35 +00006901 UNIMPLEMENTED();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006902 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006903 }
6904 catch(std::bad_alloc&)
6905 {
6906 return gl::error(GL_OUT_OF_MEMORY);
6907 }
6908}
6909
6910void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6911{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006912 try
6913 {
6914 gl::Context *context = gl::getNonLostContext();
6915
6916 if (context)
6917 {
6918 if (context->getClientVersion() < 3)
6919 {
6920 return gl::error(GL_INVALID_OPERATION);
6921 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006922
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006923 glDrawBuffersEXT(n, bufs);
6924 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006925 }
6926 catch(std::bad_alloc&)
6927 {
6928 return gl::error(GL_OUT_OF_MEMORY);
6929 }
6930}
6931
6932void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6933{
6934 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6935 location, count, transpose, value);
6936
6937 try
6938 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006939 if (count < 0)
6940 {
6941 return gl::error(GL_INVALID_VALUE);
6942 }
6943
6944 if (location == -1)
6945 {
6946 return;
6947 }
6948
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006949 gl::Context *context = gl::getNonLostContext();
6950
6951 if (context)
6952 {
6953 if (context->getClientVersion() < 3)
6954 {
6955 return gl::error(GL_INVALID_OPERATION);
6956 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006957
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006958 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6959 if (!programBinary)
6960 {
6961 return gl::error(GL_INVALID_OPERATION);
6962 }
6963
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006964 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006965 {
6966 return gl::error(GL_INVALID_OPERATION);
6967 }
6968 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006969 }
6970 catch(std::bad_alloc&)
6971 {
6972 return gl::error(GL_OUT_OF_MEMORY);
6973 }
6974}
6975
6976void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6977{
6978 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6979 location, count, transpose, value);
6980
6981 try
6982 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006983 if (count < 0)
6984 {
6985 return gl::error(GL_INVALID_VALUE);
6986 }
6987
6988 if (location == -1)
6989 {
6990 return;
6991 }
6992
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006993 gl::Context *context = gl::getNonLostContext();
6994
6995 if (context)
6996 {
6997 if (context->getClientVersion() < 3)
6998 {
6999 return gl::error(GL_INVALID_OPERATION);
7000 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007001
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007002 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7003 if (!programBinary)
7004 {
7005 return gl::error(GL_INVALID_OPERATION);
7006 }
7007
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007008 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007009 {
7010 return gl::error(GL_INVALID_OPERATION);
7011 }
7012 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007013 }
7014 catch(std::bad_alloc&)
7015 {
7016 return gl::error(GL_OUT_OF_MEMORY);
7017 }
7018}
7019
7020void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7021{
7022 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7023 location, count, transpose, value);
7024
7025 try
7026 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007027 if (count < 0)
7028 {
7029 return gl::error(GL_INVALID_VALUE);
7030 }
7031
7032 if (location == -1)
7033 {
7034 return;
7035 }
7036
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007037 gl::Context *context = gl::getNonLostContext();
7038
7039 if (context)
7040 {
7041 if (context->getClientVersion() < 3)
7042 {
7043 return gl::error(GL_INVALID_OPERATION);
7044 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007045
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007046 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7047 if (!programBinary)
7048 {
7049 return gl::error(GL_INVALID_OPERATION);
7050 }
7051
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007052 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007053 {
7054 return gl::error(GL_INVALID_OPERATION);
7055 }
7056 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007057 }
7058 catch(std::bad_alloc&)
7059 {
7060 return gl::error(GL_OUT_OF_MEMORY);
7061 }
7062}
7063
7064void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7065{
7066 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7067 location, count, transpose, value);
7068
7069 try
7070 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007071 if (count < 0)
7072 {
7073 return gl::error(GL_INVALID_VALUE);
7074 }
7075
7076 if (location == -1)
7077 {
7078 return;
7079 }
7080
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007081 gl::Context *context = gl::getNonLostContext();
7082
7083 if (context)
7084 {
7085 if (context->getClientVersion() < 3)
7086 {
7087 return gl::error(GL_INVALID_OPERATION);
7088 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007089
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007090 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7091 if (!programBinary)
7092 {
7093 return gl::error(GL_INVALID_OPERATION);
7094 }
7095
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007096 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007097 {
7098 return gl::error(GL_INVALID_OPERATION);
7099 }
7100 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007101 }
7102 catch(std::bad_alloc&)
7103 {
7104 return gl::error(GL_OUT_OF_MEMORY);
7105 }
7106}
7107
7108void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7109{
7110 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7111 location, count, transpose, value);
7112
7113 try
7114 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007115 if (count < 0)
7116 {
7117 return gl::error(GL_INVALID_VALUE);
7118 }
7119
7120 if (location == -1)
7121 {
7122 return;
7123 }
7124
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007125 gl::Context *context = gl::getNonLostContext();
7126
7127 if (context)
7128 {
7129 if (context->getClientVersion() < 3)
7130 {
7131 return gl::error(GL_INVALID_OPERATION);
7132 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007133
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007134 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7135 if (!programBinary)
7136 {
7137 return gl::error(GL_INVALID_OPERATION);
7138 }
7139
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007140 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007141 {
7142 return gl::error(GL_INVALID_OPERATION);
7143 }
7144 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007145 }
7146 catch(std::bad_alloc&)
7147 {
7148 return gl::error(GL_OUT_OF_MEMORY);
7149 }
7150}
7151
7152void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7153{
7154 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7155 location, count, transpose, value);
7156
7157 try
7158 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007159 if (count < 0)
7160 {
7161 return gl::error(GL_INVALID_VALUE);
7162 }
7163
7164 if (location == -1)
7165 {
7166 return;
7167 }
7168
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007169 gl::Context *context = gl::getNonLostContext();
7170
7171 if (context)
7172 {
7173 if (context->getClientVersion() < 3)
7174 {
7175 return gl::error(GL_INVALID_OPERATION);
7176 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007177
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007178 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7179 if (!programBinary)
7180 {
7181 return gl::error(GL_INVALID_OPERATION);
7182 }
7183
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007184 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007185 {
7186 return gl::error(GL_INVALID_OPERATION);
7187 }
7188 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007189 }
7190 catch(std::bad_alloc&)
7191 {
7192 return gl::error(GL_OUT_OF_MEMORY);
7193 }
7194}
7195
7196void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7197{
7198 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7199 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7200 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7201
7202 try
7203 {
7204 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007205 if (context)
7206 {
7207 if (context->getClientVersion() < 3)
7208 {
7209 return gl::error(GL_INVALID_OPERATION);
7210 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007211
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007212 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04007213 dstX0, dstY0, dstX1, dstY1, mask, filter,
7214 false))
7215 {
7216 return;
7217 }
7218
7219 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7220 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007221 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007222 }
7223 catch(std::bad_alloc&)
7224 {
7225 return gl::error(GL_OUT_OF_MEMORY);
7226 }
7227}
7228
7229void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7230{
7231 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7232 target, samples, internalformat, width, height);
7233
7234 try
7235 {
7236 gl::Context *context = gl::getNonLostContext();
7237
7238 if (context)
7239 {
7240 if (context->getClientVersion() < 3)
7241 {
7242 return gl::error(GL_INVALID_OPERATION);
7243 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007244
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007245 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007246 width, height, false))
7247 {
7248 return;
7249 }
7250
7251 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007252 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007253 }
7254 catch(std::bad_alloc&)
7255 {
7256 return gl::error(GL_OUT_OF_MEMORY);
7257 }
7258}
7259
7260void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7261{
7262 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7263 target, attachment, texture, level, layer);
7264
7265 try
7266 {
7267 gl::Context *context = gl::getNonLostContext();
7268
7269 if (context)
7270 {
7271 if (context->getClientVersion() < 3)
7272 {
7273 return gl::error(GL_INVALID_OPERATION);
7274 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007275
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007276 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007277 {
7278 return;
7279 }
7280
7281 gl::Framebuffer *framebuffer = NULL;
7282 if (target == GL_READ_FRAMEBUFFER)
7283 {
7284 framebuffer = context->getReadFramebuffer();
7285 }
7286 else
7287 {
7288 framebuffer = context->getDrawFramebuffer();
7289 }
7290
7291 gl::Texture *textureObject = context->getTexture(texture);
7292 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7293
7294 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7295 {
7296 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7297 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7298 }
7299 else
7300 {
7301 switch (attachment)
7302 {
7303 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7304 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7305 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7306 }
7307 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007308 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007309 }
7310 catch(std::bad_alloc&)
7311 {
7312 return gl::error(GL_OUT_OF_MEMORY);
7313 }
7314}
7315
7316GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7317{
7318 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7319 target, offset, length, access);
7320
7321 try
7322 {
7323 gl::Context *context = gl::getNonLostContext();
7324
7325 if (context)
7326 {
7327 if (context->getClientVersion() < 3)
7328 {
7329 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7330 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007331
Jamie Madill54133512013-06-21 09:33:07 -04007332 // glMapBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007333 UNIMPLEMENTED();
7334 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007335 }
7336 catch(std::bad_alloc&)
7337 {
7338 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7339 }
7340
7341 return NULL;
7342}
7343
7344void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7345{
7346 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7347
7348 try
7349 {
7350 gl::Context *context = gl::getNonLostContext();
7351
7352 if (context)
7353 {
7354 if (context->getClientVersion() < 3)
7355 {
7356 return gl::error(GL_INVALID_OPERATION);
7357 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007358
Jamie Madill54133512013-06-21 09:33:07 -04007359 // glFlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007360 UNIMPLEMENTED();
7361 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007362 }
7363 catch(std::bad_alloc&)
7364 {
7365 return gl::error(GL_OUT_OF_MEMORY);
7366 }
7367}
7368
7369void __stdcall glBindVertexArray(GLuint array)
7370{
7371 EVENT("(GLuint array = %u)", array);
7372
7373 try
7374 {
7375 gl::Context *context = gl::getNonLostContext();
7376
7377 if (context)
7378 {
7379 if (context->getClientVersion() < 3)
7380 {
7381 return gl::error(GL_INVALID_OPERATION);
7382 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007383
Jamie Madilld1028542013-07-02 11:57:04 -04007384 gl::VertexArray *vao = context->getVertexArray(array);
7385
7386 if (!vao)
7387 {
7388 // The default VAO should always exist
7389 ASSERT(array != 0);
7390 return gl::error(GL_INVALID_OPERATION);
7391 }
7392
7393 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007394 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007395 }
7396 catch(std::bad_alloc&)
7397 {
7398 return gl::error(GL_OUT_OF_MEMORY);
7399 }
7400}
7401
7402void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7403{
7404 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7405
7406 try
7407 {
7408 gl::Context *context = gl::getNonLostContext();
7409
7410 if (context)
7411 {
7412 if (context->getClientVersion() < 3)
7413 {
7414 return gl::error(GL_INVALID_OPERATION);
7415 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007416
Jamie Madilld1028542013-07-02 11:57:04 -04007417 if (n < 0)
7418 {
7419 return gl::error(GL_INVALID_VALUE);
7420 }
7421
7422 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7423 {
7424 if (arrays[arrayIndex] != 0)
7425 {
7426 context->deleteVertexArray(arrays[arrayIndex]);
7427 }
7428 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007429 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007430 }
7431 catch(std::bad_alloc&)
7432 {
7433 return gl::error(GL_OUT_OF_MEMORY);
7434 }
7435}
7436
7437void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7438{
7439 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7440
7441 try
7442 {
7443 gl::Context *context = gl::getNonLostContext();
7444
7445 if (context)
7446 {
7447 if (context->getClientVersion() < 3)
7448 {
7449 return gl::error(GL_INVALID_OPERATION);
7450 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007451
Jamie Madilld1028542013-07-02 11:57:04 -04007452 if (n < 0)
7453 {
7454 return gl::error(GL_INVALID_VALUE);
7455 }
7456
7457 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7458 {
7459 arrays[arrayIndex] = context->createVertexArray();
7460 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007461 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007462 }
7463 catch(std::bad_alloc&)
7464 {
7465 return gl::error(GL_OUT_OF_MEMORY);
7466 }
7467}
7468
7469GLboolean __stdcall glIsVertexArray(GLuint array)
7470{
7471 EVENT("(GLuint array = %u)", array);
7472
7473 try
7474 {
7475 gl::Context *context = gl::getNonLostContext();
7476
7477 if (context)
7478 {
7479 if (context->getClientVersion() < 3)
7480 {
7481 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7482 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007483
Jamie Madilld1028542013-07-02 11:57:04 -04007484 if (array == 0)
7485 {
7486 return GL_FALSE;
7487 }
7488
7489 gl::VertexArray *vao = context->getVertexArray(array);
7490
7491 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007492 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007493 }
7494 catch(std::bad_alloc&)
7495 {
7496 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7497 }
7498
7499 return GL_FALSE;
7500}
7501
7502void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7503{
7504 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7505 target, index, data);
7506
7507 try
7508 {
7509 gl::Context *context = gl::getNonLostContext();
7510
7511 if (context)
7512 {
7513 if (context->getClientVersion() < 3)
7514 {
7515 return gl::error(GL_INVALID_OPERATION);
7516 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007517
Shannon Woods15934d52013-08-19 14:28:49 -04007518 switch (target)
7519 {
7520 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7521 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7522 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7523 if (index >= context->getMaxTransformFeedbackBufferBindings())
7524 return gl::error(GL_INVALID_VALUE);
7525 break;
7526 case GL_UNIFORM_BUFFER_START:
7527 case GL_UNIFORM_BUFFER_SIZE:
7528 case GL_UNIFORM_BUFFER_BINDING:
7529 if (index >= context->getMaximumCombinedUniformBufferBindings())
7530 return gl::error(GL_INVALID_VALUE);
7531 break;
7532 default:
7533 return gl::error(GL_INVALID_ENUM);
7534 }
7535
7536 if (!(context->getIndexedIntegerv(target, index, data)))
7537 {
7538 GLenum nativeType;
7539 unsigned int numParams = 0;
7540 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7541 return gl::error(GL_INVALID_ENUM);
7542
7543 if (numParams == 0)
7544 return; // it is known that pname is valid, but there are no parameters to return
7545
7546 if (nativeType == GL_INT_64_ANGLEX)
7547 {
7548 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7549 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7550 GLint64 *int64Params = new GLint64[numParams];
7551
7552 context->getIndexedInteger64v(target, index, int64Params);
7553
7554 for (unsigned int i = 0; i < numParams; ++i)
7555 {
7556 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7557 data[i] = static_cast<GLint>(clampedValue);
7558 }
7559
7560 delete [] int64Params;
7561 }
7562 else
7563 {
7564 UNREACHABLE();
7565 }
7566 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007567 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007568 }
7569 catch(std::bad_alloc&)
7570 {
7571 return gl::error(GL_OUT_OF_MEMORY);
7572 }
7573}
7574
7575void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7576{
7577 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7578
7579 try
7580 {
7581 gl::Context *context = gl::getNonLostContext();
7582
7583 if (context)
7584 {
7585 if (context->getClientVersion() < 3)
7586 {
7587 return gl::error(GL_INVALID_OPERATION);
7588 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007589
Jamie Madill54133512013-06-21 09:33:07 -04007590 // glBeginTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007591 UNIMPLEMENTED();
7592 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007593 }
7594 catch(std::bad_alloc&)
7595 {
7596 return gl::error(GL_OUT_OF_MEMORY);
7597 }
7598}
7599
7600void __stdcall glEndTransformFeedback(void)
7601{
7602 EVENT("(void)");
7603
7604 try
7605 {
7606 gl::Context *context = gl::getNonLostContext();
7607
7608 if (context)
7609 {
7610 if (context->getClientVersion() < 3)
7611 {
7612 return gl::error(GL_INVALID_OPERATION);
7613 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007614
Jamie Madill54133512013-06-21 09:33:07 -04007615 // glEndTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007616 UNIMPLEMENTED();
7617 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007618 }
7619 catch(std::bad_alloc&)
7620 {
7621 return gl::error(GL_OUT_OF_MEMORY);
7622 }
7623}
7624
7625void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7626{
7627 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7628 target, index, buffer, offset, size);
7629
7630 try
7631 {
7632 gl::Context *context = gl::getNonLostContext();
7633
7634 if (context)
7635 {
7636 if (context->getClientVersion() < 3)
7637 {
7638 return gl::error(GL_INVALID_OPERATION);
7639 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007640
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007641 switch (target)
7642 {
7643 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007644 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007645 {
7646 return gl::error(GL_INVALID_VALUE);
7647 }
7648 break;
7649
7650 case GL_UNIFORM_BUFFER:
7651 if (index >= context->getMaximumCombinedUniformBufferBindings())
7652 {
7653 return gl::error(GL_INVALID_VALUE);
7654 }
7655 break;
7656
7657 default:
7658 return gl::error(GL_INVALID_ENUM);
7659 }
7660
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007661 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007662 {
7663 return gl::error(GL_INVALID_VALUE);
7664 }
7665
7666 switch (target)
7667 {
7668 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007669
7670 // size and offset must be a multiple of 4
7671 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7672 {
7673 return gl::error(GL_INVALID_VALUE);
7674 }
7675
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007676 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7677 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007678 break;
7679
7680 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007681
7682 // it is an error to bind an offset not a multiple of the alignment
7683 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7684 {
7685 return gl::error(GL_INVALID_VALUE);
7686 }
7687
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007688 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7689 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007690 break;
7691
7692 default:
7693 UNREACHABLE();
7694 }
7695 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007696 }
7697 catch(std::bad_alloc&)
7698 {
7699 return gl::error(GL_OUT_OF_MEMORY);
7700 }
7701}
7702
7703void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7704{
7705 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7706 target, index, buffer);
7707
7708 try
7709 {
7710 gl::Context *context = gl::getNonLostContext();
7711
7712 if (context)
7713 {
7714 if (context->getClientVersion() < 3)
7715 {
7716 return gl::error(GL_INVALID_OPERATION);
7717 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007718
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007719 switch (target)
7720 {
7721 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007722 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007723 {
7724 return gl::error(GL_INVALID_VALUE);
7725 }
7726 break;
7727
7728 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007729 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007730 {
7731 return gl::error(GL_INVALID_VALUE);
7732 }
7733 break;
7734
7735 default:
7736 return gl::error(GL_INVALID_ENUM);
7737 }
7738
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007739 switch (target)
7740 {
7741 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007742 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007743 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007744 break;
7745
7746 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007747 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007748 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007749 break;
7750
7751 default:
7752 UNREACHABLE();
7753 }
7754 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007755 }
7756 catch(std::bad_alloc&)
7757 {
7758 return gl::error(GL_OUT_OF_MEMORY);
7759 }
7760}
7761
7762void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7763{
7764 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7765 program, count, varyings, bufferMode);
7766
7767 try
7768 {
7769 gl::Context *context = gl::getNonLostContext();
7770
7771 if (context)
7772 {
7773 if (context->getClientVersion() < 3)
7774 {
7775 return gl::error(GL_INVALID_OPERATION);
7776 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007777
Jamie Madill54133512013-06-21 09:33:07 -04007778 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007779 UNIMPLEMENTED();
7780 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007781 }
7782 catch(std::bad_alloc&)
7783 {
7784 return gl::error(GL_OUT_OF_MEMORY);
7785 }
7786}
7787
7788void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7789{
7790 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7791 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7792 program, index, bufSize, length, size, type, name);
7793
7794 try
7795 {
7796 gl::Context *context = gl::getNonLostContext();
7797
7798 if (context)
7799 {
7800 if (context->getClientVersion() < 3)
7801 {
7802 return gl::error(GL_INVALID_OPERATION);
7803 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007804
Jamie Madill54133512013-06-21 09:33:07 -04007805 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007806 UNIMPLEMENTED();
7807 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007808 }
7809 catch(std::bad_alloc&)
7810 {
7811 return gl::error(GL_OUT_OF_MEMORY);
7812 }
7813}
7814
7815void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7816{
7817 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7818 index, size, type, stride, pointer);
7819
7820 try
7821 {
7822 gl::Context *context = gl::getNonLostContext();
7823
7824 if (context)
7825 {
7826 if (context->getClientVersion() < 3)
7827 {
7828 return gl::error(GL_INVALID_OPERATION);
7829 }
7830 }
7831
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007832 if (index >= gl::MAX_VERTEX_ATTRIBS)
7833 {
7834 return gl::error(GL_INVALID_VALUE);
7835 }
7836
7837 if (size < 1 || size > 4)
7838 {
7839 return gl::error(GL_INVALID_VALUE);
7840 }
7841
7842 switch (type)
7843 {
7844 case GL_BYTE:
7845 case GL_UNSIGNED_BYTE:
7846 case GL_SHORT:
7847 case GL_UNSIGNED_SHORT:
7848 case GL_INT:
7849 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007850 case GL_INT_2_10_10_10_REV:
7851 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007852 break;
7853 default:
7854 return gl::error(GL_INVALID_ENUM);
7855 }
7856
7857 if (stride < 0)
7858 {
7859 return gl::error(GL_INVALID_VALUE);
7860 }
7861
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007862 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7863 {
7864 return gl::error(GL_INVALID_OPERATION);
7865 }
7866
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007867 if (context)
7868 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007869 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7870 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7871 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7872 // and the pointer argument is not NULL.
7873 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7874 {
7875 return gl::error(GL_INVALID_OPERATION);
7876 }
7877
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007878 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7879 stride, pointer);
7880 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007881 }
7882 catch(std::bad_alloc&)
7883 {
7884 return gl::error(GL_OUT_OF_MEMORY);
7885 }
7886}
7887
7888void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7889{
7890 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7891 index, pname, params);
7892
7893 try
7894 {
7895 gl::Context *context = gl::getNonLostContext();
7896
7897 if (context)
7898 {
7899 if (context->getClientVersion() < 3)
7900 {
7901 return gl::error(GL_INVALID_OPERATION);
7902 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007903
Jamie Madilla7d05862013-07-02 11:57:06 -04007904 if (index >= gl::MAX_VERTEX_ATTRIBS)
7905 {
7906 return gl::error(GL_INVALID_VALUE);
7907 }
7908
7909 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7910
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007911 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007912 {
7913 return;
7914 }
7915
7916 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7917 {
7918 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7919 for (int i = 0; i < 4; ++i)
7920 {
7921 params[i] = currentValueData.IntValues[i];
7922 }
7923 }
7924 else
7925 {
7926 *params = attribState.querySingleParameter<GLint>(pname);
7927 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007928 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007929 }
7930 catch(std::bad_alloc&)
7931 {
7932 return gl::error(GL_OUT_OF_MEMORY);
7933 }
7934}
7935
7936void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7937{
7938 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7939 index, pname, params);
7940
7941 try
7942 {
7943 gl::Context *context = gl::getNonLostContext();
7944
7945 if (context)
7946 {
7947 if (context->getClientVersion() < 3)
7948 {
7949 return gl::error(GL_INVALID_OPERATION);
7950 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007951
Jamie Madilla7d05862013-07-02 11:57:06 -04007952 if (index >= gl::MAX_VERTEX_ATTRIBS)
7953 {
7954 return gl::error(GL_INVALID_VALUE);
7955 }
7956
7957 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7958
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007959 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007960 {
7961 return;
7962 }
7963
7964 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7965 {
7966 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7967 for (int i = 0; i < 4; ++i)
7968 {
7969 params[i] = currentValueData.UnsignedIntValues[i];
7970 }
7971 }
7972 else
7973 {
7974 *params = attribState.querySingleParameter<GLuint>(pname);
7975 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007976 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007977 }
7978 catch(std::bad_alloc&)
7979 {
7980 return gl::error(GL_OUT_OF_MEMORY);
7981 }
7982}
7983
7984void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7985{
7986 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7987 index, x, y, z, w);
7988
7989 try
7990 {
7991 gl::Context *context = gl::getNonLostContext();
7992
7993 if (context)
7994 {
7995 if (context->getClientVersion() < 3)
7996 {
7997 return gl::error(GL_INVALID_OPERATION);
7998 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007999
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008000 if (index >= gl::MAX_VERTEX_ATTRIBS)
8001 {
8002 return gl::error(GL_INVALID_VALUE);
8003 }
8004
8005 GLint vals[4] = { x, y, z, w };
8006 context->setVertexAttribi(index, vals);
8007 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008008 }
8009 catch(std::bad_alloc&)
8010 {
8011 return gl::error(GL_OUT_OF_MEMORY);
8012 }
8013}
8014
8015void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8016{
8017 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8018 index, x, y, z, w);
8019
8020 try
8021 {
8022 gl::Context *context = gl::getNonLostContext();
8023
8024 if (context)
8025 {
8026 if (context->getClientVersion() < 3)
8027 {
8028 return gl::error(GL_INVALID_OPERATION);
8029 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008030
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008031 if (index >= gl::MAX_VERTEX_ATTRIBS)
8032 {
8033 return gl::error(GL_INVALID_VALUE);
8034 }
8035
8036 GLuint vals[4] = { x, y, z, w };
8037 context->setVertexAttribu(index, vals);
8038 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008039 }
8040 catch(std::bad_alloc&)
8041 {
8042 return gl::error(GL_OUT_OF_MEMORY);
8043 }
8044}
8045
8046void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8047{
8048 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8049
8050 try
8051 {
8052 gl::Context *context = gl::getNonLostContext();
8053
8054 if (context)
8055 {
8056 if (context->getClientVersion() < 3)
8057 {
8058 return gl::error(GL_INVALID_OPERATION);
8059 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008060
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008061 if (index >= gl::MAX_VERTEX_ATTRIBS)
8062 {
8063 return gl::error(GL_INVALID_VALUE);
8064 }
8065
8066 context->setVertexAttribi(index, v);
8067 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008068 }
8069 catch(std::bad_alloc&)
8070 {
8071 return gl::error(GL_OUT_OF_MEMORY);
8072 }
8073}
8074
8075void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8076{
8077 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8078
8079 try
8080 {
8081 gl::Context *context = gl::getNonLostContext();
8082
8083 if (context)
8084 {
8085 if (context->getClientVersion() < 3)
8086 {
8087 return gl::error(GL_INVALID_OPERATION);
8088 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008089
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008090 if (index >= gl::MAX_VERTEX_ATTRIBS)
8091 {
8092 return gl::error(GL_INVALID_VALUE);
8093 }
8094
8095 context->setVertexAttribu(index, v);
8096 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008097 }
8098 catch(std::bad_alloc&)
8099 {
8100 return gl::error(GL_OUT_OF_MEMORY);
8101 }
8102}
8103
8104void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8105{
8106 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8107 program, location, params);
8108
8109 try
8110 {
8111 gl::Context *context = gl::getNonLostContext();
8112
8113 if (context)
8114 {
8115 if (context->getClientVersion() < 3)
8116 {
8117 return gl::error(GL_INVALID_OPERATION);
8118 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008119
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008120 if (program == 0)
8121 {
8122 return gl::error(GL_INVALID_VALUE);
8123 }
8124
8125 gl::Program *programObject = context->getProgram(program);
8126
8127 if (!programObject || !programObject->isLinked())
8128 {
8129 return gl::error(GL_INVALID_OPERATION);
8130 }
8131
8132 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8133 if (!programBinary)
8134 {
8135 return gl::error(GL_INVALID_OPERATION);
8136 }
8137
8138 if (!programBinary->getUniformuiv(location, NULL, params))
8139 {
8140 return gl::error(GL_INVALID_OPERATION);
8141 }
8142 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008143 }
8144 catch(std::bad_alloc&)
8145 {
8146 return gl::error(GL_OUT_OF_MEMORY);
8147 }
8148}
8149
8150GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8151{
8152 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8153 program, name);
8154
8155 try
8156 {
8157 gl::Context *context = gl::getNonLostContext();
8158
8159 if (context)
8160 {
8161 if (context->getClientVersion() < 3)
8162 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008163 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008164 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008165
Jamie Madilld1e78c92013-06-20 11:55:50 -04008166 if (program == 0)
8167 {
8168 return gl::error(GL_INVALID_VALUE, -1);
8169 }
8170
8171 gl::Program *programObject = context->getProgram(program);
8172
8173 if (!programObject || !programObject->isLinked())
8174 {
8175 return gl::error(GL_INVALID_OPERATION, -1);
8176 }
8177
8178 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8179 if (!programBinary)
8180 {
8181 return gl::error(GL_INVALID_OPERATION, -1);
8182 }
8183
8184 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008185 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008186 }
8187 catch(std::bad_alloc&)
8188 {
8189 return gl::error(GL_OUT_OF_MEMORY, 0);
8190 }
8191
8192 return 0;
8193}
8194
8195void __stdcall glUniform1ui(GLint location, GLuint v0)
8196{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008197 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008198}
8199
8200void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8201{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008202 const GLuint xy[] = { v0, v1 };
8203 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008204}
8205
8206void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8207{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008208 const GLuint xyz[] = { v0, v1, v2 };
8209 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008210}
8211
8212void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8213{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008214 const GLuint xyzw[] = { v0, v1, v2, v3 };
8215 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008216}
8217
8218void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8219{
8220 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8221 location, count, value);
8222
8223 try
8224 {
8225 gl::Context *context = gl::getNonLostContext();
8226
8227 if (context)
8228 {
8229 if (context->getClientVersion() < 3)
8230 {
8231 return gl::error(GL_INVALID_OPERATION);
8232 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008233
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008234 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8235 if (!programBinary)
8236 {
8237 return gl::error(GL_INVALID_OPERATION);
8238 }
8239
8240 if (!programBinary->setUniform1uiv(location, count, value))
8241 {
8242 return gl::error(GL_INVALID_OPERATION);
8243 }
8244 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008245 }
8246 catch(std::bad_alloc&)
8247 {
8248 return gl::error(GL_OUT_OF_MEMORY);
8249 }
8250}
8251
8252void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8253{
8254 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8255 location, count, value);
8256
8257 try
8258 {
8259 gl::Context *context = gl::getNonLostContext();
8260
8261 if (context)
8262 {
8263 if (context->getClientVersion() < 3)
8264 {
8265 return gl::error(GL_INVALID_OPERATION);
8266 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008267
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008268 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8269 if (!programBinary)
8270 {
8271 return gl::error(GL_INVALID_OPERATION);
8272 }
8273
8274 if (!programBinary->setUniform2uiv(location, count, value))
8275 {
8276 return gl::error(GL_INVALID_OPERATION);
8277 }
8278 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008279 }
8280 catch(std::bad_alloc&)
8281 {
8282 return gl::error(GL_OUT_OF_MEMORY);
8283 }
8284}
8285
8286void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8287{
8288 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8289 location, count, value);
8290
8291 try
8292 {
8293 gl::Context *context = gl::getNonLostContext();
8294
8295 if (context)
8296 {
8297 if (context->getClientVersion() < 3)
8298 {
8299 return gl::error(GL_INVALID_OPERATION);
8300 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008301
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008302 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8303 if (!programBinary)
8304 {
8305 return gl::error(GL_INVALID_OPERATION);
8306 }
8307
8308 if (!programBinary->setUniform3uiv(location, count, value))
8309 {
8310 return gl::error(GL_INVALID_OPERATION);
8311 }
8312 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008313 }
8314 catch(std::bad_alloc&)
8315 {
8316 return gl::error(GL_OUT_OF_MEMORY);
8317 }
8318}
8319
8320void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8321{
8322 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8323 location, count, value);
8324
8325 try
8326 {
8327 gl::Context *context = gl::getNonLostContext();
8328
8329 if (context)
8330 {
8331 if (context->getClientVersion() < 3)
8332 {
8333 return gl::error(GL_INVALID_OPERATION);
8334 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008335
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008336 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8337 if (!programBinary)
8338 {
8339 return gl::error(GL_INVALID_OPERATION);
8340 }
8341
8342 if (!programBinary->setUniform4uiv(location, count, value))
8343 {
8344 return gl::error(GL_INVALID_OPERATION);
8345 }
8346 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008347 }
8348 catch(std::bad_alloc&)
8349 {
8350 return gl::error(GL_OUT_OF_MEMORY);
8351 }
8352}
8353
8354void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8355{
8356 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8357 buffer, drawbuffer, value);
8358
8359 try
8360 {
8361 gl::Context *context = gl::getNonLostContext();
8362
8363 if (context)
8364 {
8365 if (context->getClientVersion() < 3)
8366 {
8367 return gl::error(GL_INVALID_OPERATION);
8368 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008369
Geoff Lang42359ca2013-08-21 13:25:17 -04008370 switch (buffer)
8371 {
8372 case GL_COLOR:
8373 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8374 {
8375 return gl::error(GL_INVALID_VALUE);
8376 }
8377 break;
8378 case GL_STENCIL:
8379 if (drawbuffer != 0)
8380 {
8381 return gl::error(GL_INVALID_VALUE);
8382 }
8383 default:
8384 return gl::error(GL_INVALID_ENUM);
8385 }
8386
8387 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008388 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008389 }
8390 catch(std::bad_alloc&)
8391 {
8392 return gl::error(GL_OUT_OF_MEMORY);
8393 }
8394}
8395
8396void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8397{
8398 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8399 buffer, drawbuffer, value);
8400
8401 try
8402 {
8403 gl::Context *context = gl::getNonLostContext();
8404
8405 if (context)
8406 {
8407 if (context->getClientVersion() < 3)
8408 {
8409 return gl::error(GL_INVALID_OPERATION);
8410 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008411
Geoff Lang42359ca2013-08-21 13:25:17 -04008412 switch (buffer)
8413 {
8414 case GL_COLOR:
8415 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8416 {
8417 return gl::error(GL_INVALID_VALUE);
8418 }
8419 break;
8420 default:
8421 return gl::error(GL_INVALID_ENUM);
8422 }
8423
8424 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008425 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008426 }
8427 catch(std::bad_alloc&)
8428 {
8429 return gl::error(GL_OUT_OF_MEMORY);
8430 }
8431}
8432
8433void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8434{
8435 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8436 buffer, drawbuffer, value);
8437
8438 try
8439 {
8440 gl::Context *context = gl::getNonLostContext();
8441
8442 if (context)
8443 {
8444 if (context->getClientVersion() < 3)
8445 {
8446 return gl::error(GL_INVALID_OPERATION);
8447 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008448
Geoff Lang42359ca2013-08-21 13:25:17 -04008449 switch (buffer)
8450 {
8451 case GL_COLOR:
8452 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8453 {
8454 return gl::error(GL_INVALID_VALUE);
8455 }
8456 break;
8457 case GL_DEPTH:
8458 if (drawbuffer != 0)
8459 {
8460 return gl::error(GL_INVALID_VALUE);
8461 }
8462 break;
8463 default:
8464 return gl::error(GL_INVALID_ENUM);
8465 }
8466
8467 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008468 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008469 }
8470 catch(std::bad_alloc&)
8471 {
8472 return gl::error(GL_OUT_OF_MEMORY);
8473 }
8474}
8475
8476void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8477{
8478 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8479 buffer, drawbuffer, depth, stencil);
8480
8481 try
8482 {
8483 gl::Context *context = gl::getNonLostContext();
8484
8485 if (context)
8486 {
8487 if (context->getClientVersion() < 3)
8488 {
8489 return gl::error(GL_INVALID_OPERATION);
8490 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008491
Geoff Lang42359ca2013-08-21 13:25:17 -04008492 switch (buffer)
8493 {
8494 case GL_DEPTH_STENCIL:
8495 if (drawbuffer != 0)
8496 {
8497 return gl::error(GL_INVALID_VALUE);
8498 }
8499 break;
8500 default:
8501 return gl::error(GL_INVALID_ENUM);
8502 }
8503
8504 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008505 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008506 }
8507 catch(std::bad_alloc&)
8508 {
8509 return gl::error(GL_OUT_OF_MEMORY);
8510 }
8511}
8512
8513const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8514{
8515 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8516
8517 try
8518 {
8519 gl::Context *context = gl::getNonLostContext();
8520
8521 if (context)
8522 {
8523 if (context->getClientVersion() < 3)
8524 {
8525 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8526 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008527
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008528 if (name != GL_EXTENSIONS)
8529 {
8530 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8531 }
8532
8533 if (index >= context->getNumExtensions())
8534 {
8535 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8536 }
8537
8538 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8539 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008540 }
8541 catch(std::bad_alloc&)
8542 {
8543 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8544 }
8545
8546 return NULL;
8547}
8548
8549void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8550{
8551 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8552 readTarget, writeTarget, readOffset, writeOffset, size);
8553
8554 try
8555 {
8556 gl::Context *context = gl::getNonLostContext();
8557
8558 if (context)
8559 {
8560 if (context->getClientVersion() < 3)
8561 {
8562 return gl::error(GL_INVALID_OPERATION);
8563 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008564
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008565 gl::Buffer *readBuffer = NULL;
8566 switch (readTarget)
8567 {
8568 case GL_ARRAY_BUFFER:
8569 readBuffer = context->getArrayBuffer();
8570 break;
8571 case GL_COPY_READ_BUFFER:
8572 readBuffer = context->getCopyReadBuffer();
8573 break;
8574 case GL_COPY_WRITE_BUFFER:
8575 readBuffer = context->getCopyWriteBuffer();
8576 break;
8577 case GL_ELEMENT_ARRAY_BUFFER:
8578 readBuffer = context->getElementArrayBuffer();
8579 break;
8580 case GL_PIXEL_PACK_BUFFER:
8581 readBuffer = context->getPixelPackBuffer();
8582 break;
8583 case GL_PIXEL_UNPACK_BUFFER:
8584 readBuffer = context->getPixelUnpackBuffer();
8585 break;
8586 case GL_TRANSFORM_FEEDBACK_BUFFER:
8587 readBuffer = context->getGenericTransformFeedbackBuffer();
8588 break;
8589 case GL_UNIFORM_BUFFER:
8590 readBuffer = context->getGenericUniformBuffer();
8591 break;
8592 default:
8593 return gl::error(GL_INVALID_ENUM);
8594 }
8595
8596 gl::Buffer *writeBuffer = NULL;
8597 switch (writeTarget)
8598 {
8599 case GL_ARRAY_BUFFER:
8600 writeBuffer = context->getArrayBuffer();
8601 break;
8602 case GL_COPY_READ_BUFFER:
8603 writeBuffer = context->getCopyReadBuffer();
8604 break;
8605 case GL_COPY_WRITE_BUFFER:
8606 writeBuffer = context->getCopyWriteBuffer();
8607 break;
8608 case GL_ELEMENT_ARRAY_BUFFER:
8609 writeBuffer = context->getElementArrayBuffer();
8610 break;
8611 case GL_PIXEL_PACK_BUFFER:
8612 writeBuffer = context->getPixelPackBuffer();
8613 break;
8614 case GL_PIXEL_UNPACK_BUFFER:
8615 writeBuffer = context->getPixelUnpackBuffer();
8616 break;
8617 case GL_TRANSFORM_FEEDBACK_BUFFER:
8618 writeBuffer = context->getGenericTransformFeedbackBuffer();
8619 break;
8620 case GL_UNIFORM_BUFFER:
8621 writeBuffer = context->getGenericUniformBuffer();
8622 break;
8623 default:
8624 return gl::error(GL_INVALID_ENUM);
8625 }
8626
8627 if (!readBuffer || !writeBuffer)
8628 {
8629 return gl::error(GL_INVALID_OPERATION);
8630 }
8631
8632 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8633 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8634 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8635 {
8636 return gl::error(GL_INVALID_VALUE);
8637 }
8638
8639 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8640 {
8641 return gl::error(GL_INVALID_VALUE);
8642 }
8643
8644 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8645
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008646 // if size is zero, the copy is a successful no-op
8647 if (size > 0)
8648 {
8649 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8650 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008651 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008652 }
8653 catch(std::bad_alloc&)
8654 {
8655 return gl::error(GL_OUT_OF_MEMORY);
8656 }
8657}
8658
8659void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8660{
8661 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8662 program, uniformCount, uniformNames, uniformIndices);
8663
8664 try
8665 {
8666 gl::Context *context = gl::getNonLostContext();
8667
8668 if (context)
8669 {
8670 if (context->getClientVersion() < 3)
8671 {
8672 return gl::error(GL_INVALID_OPERATION);
8673 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008674
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008675 if (uniformCount < 0)
8676 {
8677 return gl::error(GL_INVALID_VALUE);
8678 }
8679
8680 gl::Program *programObject = context->getProgram(program);
8681
8682 if (!programObject)
8683 {
8684 if (context->getShader(program))
8685 {
8686 return gl::error(GL_INVALID_OPERATION);
8687 }
8688 else
8689 {
8690 return gl::error(GL_INVALID_VALUE);
8691 }
8692 }
8693
8694 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8695 if (!programObject->isLinked() || !programBinary)
8696 {
8697 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8698 {
8699 uniformIndices[uniformId] = GL_INVALID_INDEX;
8700 }
8701 }
8702 else
8703 {
8704 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8705 {
8706 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8707 }
8708 }
8709 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008710 }
8711 catch(std::bad_alloc&)
8712 {
8713 return gl::error(GL_OUT_OF_MEMORY);
8714 }
8715}
8716
8717void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8718{
8719 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8720 program, uniformCount, uniformIndices, pname, params);
8721
8722 try
8723 {
8724 gl::Context *context = gl::getNonLostContext();
8725
8726 if (context)
8727 {
8728 if (context->getClientVersion() < 3)
8729 {
8730 return gl::error(GL_INVALID_OPERATION);
8731 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008732
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008733 if (uniformCount < 0)
8734 {
8735 return gl::error(GL_INVALID_VALUE);
8736 }
8737
8738 gl::Program *programObject = context->getProgram(program);
8739
8740 if (!programObject)
8741 {
8742 if (context->getShader(program))
8743 {
8744 return gl::error(GL_INVALID_OPERATION);
8745 }
8746 else
8747 {
8748 return gl::error(GL_INVALID_VALUE);
8749 }
8750 }
8751
8752 switch (pname)
8753 {
8754 case GL_UNIFORM_TYPE:
8755 case GL_UNIFORM_SIZE:
8756 case GL_UNIFORM_NAME_LENGTH:
8757 case GL_UNIFORM_BLOCK_INDEX:
8758 case GL_UNIFORM_OFFSET:
8759 case GL_UNIFORM_ARRAY_STRIDE:
8760 case GL_UNIFORM_MATRIX_STRIDE:
8761 case GL_UNIFORM_IS_ROW_MAJOR:
8762 break;
8763 default:
8764 return gl::error(GL_INVALID_ENUM);
8765 }
8766
8767 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8768
8769 if (!programBinary && uniformCount > 0)
8770 {
8771 return gl::error(GL_INVALID_VALUE);
8772 }
8773
8774 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8775 {
8776 const GLuint index = uniformIndices[uniformId];
8777
8778 if (index >= (GLuint)programBinary->getActiveUniformCount())
8779 {
8780 return gl::error(GL_INVALID_VALUE);
8781 }
8782 }
8783
8784 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8785 {
8786 const GLuint index = uniformIndices[uniformId];
8787 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8788 }
8789 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008790 }
8791 catch(std::bad_alloc&)
8792 {
8793 return gl::error(GL_OUT_OF_MEMORY);
8794 }
8795}
8796
8797GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8798{
8799 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8800
8801 try
8802 {
8803 gl::Context *context = gl::getNonLostContext();
8804
8805 if (context)
8806 {
8807 if (context->getClientVersion() < 3)
8808 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008809 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008810 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008811
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008812 gl::Program *programObject = context->getProgram(program);
8813
8814 if (!programObject)
8815 {
8816 if (context->getShader(program))
8817 {
8818 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8819 }
8820 else
8821 {
8822 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8823 }
8824 }
8825
8826 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8827 if (!programBinary)
8828 {
8829 return GL_INVALID_INDEX;
8830 }
8831
8832 return programBinary->getUniformBlockIndex(uniformBlockName);
8833 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008834 }
8835 catch(std::bad_alloc&)
8836 {
8837 return gl::error(GL_OUT_OF_MEMORY, 0);
8838 }
8839
8840 return 0;
8841}
8842
8843void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8844{
8845 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8846 program, uniformBlockIndex, pname, params);
8847
8848 try
8849 {
8850 gl::Context *context = gl::getNonLostContext();
8851
8852 if (context)
8853 {
8854 if (context->getClientVersion() < 3)
8855 {
8856 return gl::error(GL_INVALID_OPERATION);
8857 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008858 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008859
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008860 if (!programObject)
8861 {
8862 if (context->getShader(program))
8863 {
8864 return gl::error(GL_INVALID_OPERATION);
8865 }
8866 else
8867 {
8868 return gl::error(GL_INVALID_VALUE);
8869 }
8870 }
8871
8872 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8873
8874 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8875 {
8876 return gl::error(GL_INVALID_VALUE);
8877 }
8878
8879 switch (pname)
8880 {
8881 case GL_UNIFORM_BLOCK_BINDING:
8882 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8883 break;
8884
8885 case GL_UNIFORM_BLOCK_DATA_SIZE:
8886 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8887 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8888 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8889 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8890 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8891 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8892 break;
8893
8894 default:
8895 return gl::error(GL_INVALID_ENUM);
8896 }
8897 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008898 }
8899 catch(std::bad_alloc&)
8900 {
8901 return gl::error(GL_OUT_OF_MEMORY);
8902 }
8903}
8904
8905void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8906{
8907 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8908 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8909
8910 try
8911 {
8912 gl::Context *context = gl::getNonLostContext();
8913
8914 if (context)
8915 {
8916 if (context->getClientVersion() < 3)
8917 {
8918 return gl::error(GL_INVALID_OPERATION);
8919 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008920
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008921 gl::Program *programObject = context->getProgram(program);
8922
8923 if (!programObject)
8924 {
8925 if (context->getShader(program))
8926 {
8927 return gl::error(GL_INVALID_OPERATION);
8928 }
8929 else
8930 {
8931 return gl::error(GL_INVALID_VALUE);
8932 }
8933 }
8934
8935 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8936
8937 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8938 {
8939 return gl::error(GL_INVALID_VALUE);
8940 }
8941
8942 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8943 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008944 }
8945 catch(std::bad_alloc&)
8946 {
8947 return gl::error(GL_OUT_OF_MEMORY);
8948 }
8949}
8950
8951void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8952{
8953 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8954 program, uniformBlockIndex, uniformBlockBinding);
8955
8956 try
8957 {
8958 gl::Context *context = gl::getNonLostContext();
8959
8960 if (context)
8961 {
8962 if (context->getClientVersion() < 3)
8963 {
8964 return gl::error(GL_INVALID_OPERATION);
8965 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008966
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008967 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8968 {
8969 return gl::error(GL_INVALID_VALUE);
8970 }
8971
8972 gl::Program *programObject = context->getProgram(program);
8973
8974 if (!programObject)
8975 {
8976 if (context->getShader(program))
8977 {
8978 return gl::error(GL_INVALID_OPERATION);
8979 }
8980 else
8981 {
8982 return gl::error(GL_INVALID_VALUE);
8983 }
8984 }
8985
8986 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8987
8988 // if never linked, there won't be any uniform blocks
8989 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8990 {
8991 return gl::error(GL_INVALID_VALUE);
8992 }
8993
8994 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8995 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008996 }
8997 catch(std::bad_alloc&)
8998 {
8999 return gl::error(GL_OUT_OF_MEMORY);
9000 }
9001}
9002
9003void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9004{
9005 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9006 mode, first, count, instanceCount);
9007
9008 try
9009 {
9010 gl::Context *context = gl::getNonLostContext();
9011
9012 if (context)
9013 {
9014 if (context->getClientVersion() < 3)
9015 {
9016 return gl::error(GL_INVALID_OPERATION);
9017 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009018
Jamie Madill54133512013-06-21 09:33:07 -04009019 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009020 UNIMPLEMENTED();
9021 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009022 }
9023 catch(std::bad_alloc&)
9024 {
9025 return gl::error(GL_OUT_OF_MEMORY);
9026 }
9027}
9028
9029void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
9030{
9031 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
9032 mode, count, type, indices, instanceCount);
9033
9034 try
9035 {
9036 gl::Context *context = gl::getNonLostContext();
9037
9038 if (context)
9039 {
9040 if (context->getClientVersion() < 3)
9041 {
9042 return gl::error(GL_INVALID_OPERATION);
9043 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009044
Jamie Madill54133512013-06-21 09:33:07 -04009045 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009046 UNIMPLEMENTED();
9047 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009048 }
9049 catch(std::bad_alloc&)
9050 {
9051 return gl::error(GL_OUT_OF_MEMORY);
9052 }
9053}
9054
9055GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
9056{
9057 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
9058
9059 try
9060 {
9061 gl::Context *context = gl::getNonLostContext();
9062
9063 if (context)
9064 {
9065 if (context->getClientVersion() < 3)
9066 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009067 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009068 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009069
Jamie Madill5215e1a2013-07-26 11:55:19 -04009070 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
9071 {
9072 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
9073 }
9074
9075 if (flags != 0)
9076 {
9077 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
9078 }
9079
9080 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009081 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009082 }
9083 catch(std::bad_alloc&)
9084 {
9085 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9086 }
9087
9088 return NULL;
9089}
9090
9091GLboolean __stdcall glIsSync(GLsync sync)
9092{
9093 EVENT("(GLsync sync = 0x%0.8p)", sync);
9094
9095 try
9096 {
9097 gl::Context *context = gl::getNonLostContext();
9098
9099 if (context)
9100 {
9101 if (context->getClientVersion() < 3)
9102 {
9103 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9104 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009105
Jamie Madill5215e1a2013-07-26 11:55:19 -04009106 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009107 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009108 }
9109 catch(std::bad_alloc&)
9110 {
9111 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9112 }
9113
9114 return GL_FALSE;
9115}
9116
9117void __stdcall glDeleteSync(GLsync sync)
9118{
9119 EVENT("(GLsync sync = 0x%0.8p)", sync);
9120
9121 try
9122 {
9123 gl::Context *context = gl::getNonLostContext();
9124
9125 if (context)
9126 {
9127 if (context->getClientVersion() < 3)
9128 {
9129 return gl::error(GL_INVALID_OPERATION);
9130 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009131
Jamie Madill5215e1a2013-07-26 11:55:19 -04009132 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
9133 {
9134 return gl::error(GL_INVALID_VALUE);
9135 }
9136
9137 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009138 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009139 }
9140 catch(std::bad_alloc&)
9141 {
9142 return gl::error(GL_OUT_OF_MEMORY);
9143 }
9144}
9145
9146GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9147{
9148 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9149 sync, flags, timeout);
9150
9151 try
9152 {
9153 gl::Context *context = gl::getNonLostContext();
9154
9155 if (context)
9156 {
9157 if (context->getClientVersion() < 3)
9158 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009159 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009160 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009161
Jamie Madill5215e1a2013-07-26 11:55:19 -04009162 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
9163 {
9164 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9165 }
9166
9167 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9168
9169 if (!fenceSync)
9170 {
9171 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9172 }
9173
9174 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009175 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009176 }
9177 catch(std::bad_alloc&)
9178 {
9179 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9180 }
9181
9182 return GL_FALSE;
9183}
9184
9185void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9186{
9187 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9188 sync, flags, timeout);
9189
9190 try
9191 {
9192 gl::Context *context = gl::getNonLostContext();
9193
9194 if (context)
9195 {
9196 if (context->getClientVersion() < 3)
9197 {
9198 return gl::error(GL_INVALID_OPERATION);
9199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009200
Jamie Madill5215e1a2013-07-26 11:55:19 -04009201 if (flags != 0)
9202 {
9203 return gl::error(GL_INVALID_VALUE);
9204 }
9205
9206 if (timeout != GL_TIMEOUT_IGNORED)
9207 {
9208 return gl::error(GL_INVALID_VALUE);
9209 }
9210
9211 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9212
9213 if (!fenceSync)
9214 {
9215 return gl::error(GL_INVALID_VALUE);
9216 }
9217
9218 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009219 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009220 }
9221 catch(std::bad_alloc&)
9222 {
9223 return gl::error(GL_OUT_OF_MEMORY);
9224 }
9225}
9226
9227void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9228{
9229 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9230 pname, params);
9231
9232 try
9233 {
9234 gl::Context *context = gl::getNonLostContext();
9235
9236 if (context)
9237 {
9238 if (context->getClientVersion() < 3)
9239 {
9240 return gl::error(GL_INVALID_OPERATION);
9241 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009242
Jamie Madill71fbd602013-07-19 16:36:55 -04009243 if (!(context->getInteger64v(pname, params)))
9244 {
9245 GLenum nativeType;
9246 unsigned int numParams = 0;
9247 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9248 return gl::error(GL_INVALID_ENUM);
9249
9250 if (numParams == 0)
9251 return; // it is known that the pname is valid, but that there are no parameters to return.
9252
9253 if (nativeType == GL_BOOL)
9254 {
9255 GLboolean *boolParams = NULL;
9256 boolParams = new GLboolean[numParams];
9257
9258 context->getBooleanv(pname, boolParams);
9259
9260 for (unsigned int i = 0; i < numParams; ++i)
9261 {
9262 if (boolParams[i] == GL_FALSE)
9263 params[i] = 0;
9264 else
9265 params[i] = 1;
9266 }
9267
9268 delete [] boolParams;
9269 }
9270 else if (nativeType == GL_INT)
9271 {
9272 GLint *intParams = NULL;
9273 intParams = new GLint[numParams];
9274
9275 context->getIntegerv(pname, intParams);
9276
9277 for (unsigned int i = 0; i < numParams; ++i)
9278 {
9279 params[i] = static_cast<GLint64>(intParams[i]);
9280 }
9281
9282 delete [] intParams;
9283 }
9284 else if (nativeType == GL_FLOAT)
9285 {
9286 GLfloat *floatParams = NULL;
9287 floatParams = new GLfloat[numParams];
9288
9289 context->getFloatv(pname, floatParams);
9290
9291 for (unsigned int i = 0; i < numParams; ++i)
9292 {
9293 // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
9294 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
9295 {
9296 params[i] = static_cast<GLint64>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
9297 }
9298 else
9299 {
9300 params[i] = gl::iround<GLint64>(floatParams[i]);
9301 }
9302 }
9303
9304 delete [] floatParams;
9305 }
9306 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009307 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009308 }
9309 catch(std::bad_alloc&)
9310 {
9311 return gl::error(GL_OUT_OF_MEMORY);
9312 }
9313}
9314
9315void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9316{
9317 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9318 sync, pname, bufSize, length, values);
9319
9320 try
9321 {
9322 gl::Context *context = gl::getNonLostContext();
9323
9324 if (context)
9325 {
9326 if (context->getClientVersion() < 3)
9327 {
9328 return gl::error(GL_INVALID_OPERATION);
9329 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009330
Jamie Madill5215e1a2013-07-26 11:55:19 -04009331 if (bufSize < 0)
9332 {
9333 return gl::error(GL_INVALID_VALUE);
9334 }
9335
9336 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9337
9338 if (!fenceSync)
9339 {
9340 return gl::error(GL_INVALID_VALUE);
9341 }
9342
9343 switch (pname)
9344 {
9345 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9346 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9347 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9348 case GL_SYNC_FLAGS: values[0] = 0; break;
9349
9350 default:
9351 return gl::error(GL_INVALID_ENUM);
9352 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009353 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009354 }
9355 catch(std::bad_alloc&)
9356 {
9357 return gl::error(GL_OUT_OF_MEMORY);
9358 }
9359}
9360
9361void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9362{
9363 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9364 target, index, data);
9365
9366 try
9367 {
9368 gl::Context *context = gl::getNonLostContext();
9369
9370 if (context)
9371 {
9372 if (context->getClientVersion() < 3)
9373 {
9374 return gl::error(GL_INVALID_OPERATION);
9375 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009376
Shannon Woods15934d52013-08-19 14:28:49 -04009377 switch (target)
9378 {
9379 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9380 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9381 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9382 if (index >= context->getMaxTransformFeedbackBufferBindings())
9383 return gl::error(GL_INVALID_VALUE);
9384 break;
9385 case GL_UNIFORM_BUFFER_START:
9386 case GL_UNIFORM_BUFFER_SIZE:
9387 case GL_UNIFORM_BUFFER_BINDING:
9388 if (index >= context->getMaximumCombinedUniformBufferBindings())
9389 return gl::error(GL_INVALID_VALUE);
9390 break;
9391 default:
9392 return gl::error(GL_INVALID_ENUM);
9393 }
9394
9395 if (!(context->getIndexedInteger64v(target, index, data)))
9396 {
9397 GLenum nativeType;
9398 unsigned int numParams = 0;
9399 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9400 return gl::error(GL_INVALID_ENUM);
9401
9402 if (numParams == 0)
9403 return; // it is known that pname is valid, but there are no parameters to return
9404
9405 if (nativeType == GL_INT)
9406 {
9407 GLint *intParams = new GLint[numParams];
9408
9409 context->getIndexedIntegerv(target, index, intParams);
9410
9411 for (unsigned int i = 0; i < numParams; ++i)
9412 {
9413 data[i] = static_cast<GLint64>(intParams[i]);
9414 }
9415
9416 delete [] intParams;
9417 }
9418 else
9419 {
9420 UNREACHABLE();
9421 }
9422 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009423 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009424 }
9425 catch(std::bad_alloc&)
9426 {
9427 return gl::error(GL_OUT_OF_MEMORY);
9428 }
9429}
9430
9431void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9432{
9433 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9434 target, pname, params);
9435
9436 try
9437 {
9438 gl::Context *context = gl::getNonLostContext();
9439
9440 if (context)
9441 {
9442 if (context->getClientVersion() < 3)
9443 {
9444 return gl::error(GL_INVALID_OPERATION);
9445 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009446
Jamie Madill54133512013-06-21 09:33:07 -04009447 // glGetBufferParameteri64v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009448 UNIMPLEMENTED();
9449 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009450 }
9451 catch(std::bad_alloc&)
9452 {
9453 return gl::error(GL_OUT_OF_MEMORY);
9454 }
9455}
9456
9457void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9458{
9459 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9460
9461 try
9462 {
9463 gl::Context *context = gl::getNonLostContext();
9464
9465 if (context)
9466 {
9467 if (context->getClientVersion() < 3)
9468 {
9469 return gl::error(GL_INVALID_OPERATION);
9470 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009471
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009472 if (count < 0)
9473 {
9474 return gl::error(GL_INVALID_VALUE);
9475 }
9476
9477 for (int i = 0; i < count; i++)
9478 {
9479 samplers[i] = context->createSampler();
9480 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009481 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009482 }
9483 catch(std::bad_alloc&)
9484 {
9485 return gl::error(GL_OUT_OF_MEMORY);
9486 }
9487}
9488
9489void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9490{
9491 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
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
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009504 if (count < 0)
9505 {
9506 return gl::error(GL_INVALID_VALUE);
9507 }
9508
9509 for (int i = 0; i < count; i++)
9510 {
9511 context->deleteSampler(samplers[i]);
9512 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009513 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009514 }
9515 catch(std::bad_alloc&)
9516 {
9517 return gl::error(GL_OUT_OF_MEMORY);
9518 }
9519}
9520
9521GLboolean __stdcall glIsSampler(GLuint sampler)
9522{
9523 EVENT("(GLuint sampler = %u)", sampler);
9524
9525 try
9526 {
9527 gl::Context *context = gl::getNonLostContext();
9528
9529 if (context)
9530 {
9531 if (context->getClientVersion() < 3)
9532 {
9533 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9534 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009535
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009536 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009537 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009538 }
9539 catch(std::bad_alloc&)
9540 {
9541 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9542 }
9543
9544 return GL_FALSE;
9545}
9546
9547void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9548{
9549 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9550
9551 try
9552 {
9553 gl::Context *context = gl::getNonLostContext();
9554
9555 if (context)
9556 {
9557 if (context->getClientVersion() < 3)
9558 {
9559 return gl::error(GL_INVALID_OPERATION);
9560 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009561
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009562 if (sampler != 0 && !context->isSampler(sampler))
9563 {
9564 return gl::error(GL_INVALID_OPERATION);
9565 }
9566
9567 if (unit >= context->getMaximumCombinedTextureImageUnits())
9568 {
9569 return gl::error(GL_INVALID_VALUE);
9570 }
9571
9572 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009573 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009574 }
9575 catch(std::bad_alloc&)
9576 {
9577 return gl::error(GL_OUT_OF_MEMORY);
9578 }
9579}
9580
9581void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9582{
9583 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9584
9585 try
9586 {
9587 gl::Context *context = gl::getNonLostContext();
9588
9589 if (context)
9590 {
9591 if (context->getClientVersion() < 3)
9592 {
9593 return gl::error(GL_INVALID_OPERATION);
9594 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009595
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009596 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009597 {
9598 return;
9599 }
9600
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009601 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009602 {
9603 return;
9604 }
9605
9606 if (!context->isSampler(sampler))
9607 {
9608 return gl::error(GL_INVALID_OPERATION);
9609 }
9610
9611 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009612 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009613 }
9614 catch(std::bad_alloc&)
9615 {
9616 return gl::error(GL_OUT_OF_MEMORY);
9617 }
9618}
9619
9620void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9621{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009622 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009623}
9624
9625void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9626{
9627 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9628
9629 try
9630 {
9631 gl::Context *context = gl::getNonLostContext();
9632
9633 if (context)
9634 {
9635 if (context->getClientVersion() < 3)
9636 {
9637 return gl::error(GL_INVALID_OPERATION);
9638 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009639
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009640 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009641 {
9642 return;
9643 }
9644
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009645 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009646 {
9647 return;
9648 }
9649
9650 if (!context->isSampler(sampler))
9651 {
9652 return gl::error(GL_INVALID_OPERATION);
9653 }
9654
9655 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009657 }
9658 catch(std::bad_alloc&)
9659 {
9660 return gl::error(GL_OUT_OF_MEMORY);
9661 }
9662}
9663
9664void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9665{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009666 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009667}
9668
9669void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9670{
9671 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9672
9673 try
9674 {
9675 gl::Context *context = gl::getNonLostContext();
9676
9677 if (context)
9678 {
9679 if (context->getClientVersion() < 3)
9680 {
9681 return gl::error(GL_INVALID_OPERATION);
9682 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009683
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009684 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009685 {
9686 return;
9687 }
9688
9689 if (!context->isSampler(sampler))
9690 {
9691 return gl::error(GL_INVALID_OPERATION);
9692 }
9693
9694 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009695 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009696 }
9697 catch(std::bad_alloc&)
9698 {
9699 return gl::error(GL_OUT_OF_MEMORY);
9700 }
9701}
9702
9703void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9704{
9705 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9706
9707 try
9708 {
9709 gl::Context *context = gl::getNonLostContext();
9710
9711 if (context)
9712 {
9713 if (context->getClientVersion() < 3)
9714 {
9715 return gl::error(GL_INVALID_OPERATION);
9716 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009717
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009718 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009719 {
9720 return;
9721 }
9722
9723 if (!context->isSampler(sampler))
9724 {
9725 return gl::error(GL_INVALID_OPERATION);
9726 }
9727
9728 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009729 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009730 }
9731 catch(std::bad_alloc&)
9732 {
9733 return gl::error(GL_OUT_OF_MEMORY);
9734 }
9735}
9736
9737void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9738{
9739 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9740
9741 try
9742 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009743 if (index >= gl::MAX_VERTEX_ATTRIBS)
9744 {
9745 return gl::error(GL_INVALID_VALUE);
9746 }
9747
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009748 gl::Context *context = gl::getNonLostContext();
9749
9750 if (context)
9751 {
9752 if (context->getClientVersion() < 3)
9753 {
9754 return gl::error(GL_INVALID_OPERATION);
9755 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009756
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009757 context->setVertexAttribDivisor(index, divisor);
9758 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009759 }
9760 catch(std::bad_alloc&)
9761 {
9762 return gl::error(GL_OUT_OF_MEMORY);
9763 }
9764}
9765
9766void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9767{
9768 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9769
9770 try
9771 {
9772 gl::Context *context = gl::getNonLostContext();
9773
9774 if (context)
9775 {
9776 if (context->getClientVersion() < 3)
9777 {
9778 return gl::error(GL_INVALID_OPERATION);
9779 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009780
Jamie Madill54133512013-06-21 09:33:07 -04009781 // glBindTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009782 UNIMPLEMENTED();
9783 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009784 }
9785 catch(std::bad_alloc&)
9786 {
9787 return gl::error(GL_OUT_OF_MEMORY);
9788 }
9789}
9790
9791void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9792{
9793 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
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 // glDeleteTransformFeedbacks
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 glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9817{
9818 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9819
9820 try
9821 {
9822 gl::Context *context = gl::getNonLostContext();
9823
9824 if (context)
9825 {
9826 if (context->getClientVersion() < 3)
9827 {
9828 return gl::error(GL_INVALID_OPERATION);
9829 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009830
Jamie Madill54133512013-06-21 09:33:07 -04009831 // glGenTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009832 UNIMPLEMENTED();
9833 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009834 }
9835 catch(std::bad_alloc&)
9836 {
9837 return gl::error(GL_OUT_OF_MEMORY);
9838 }
9839}
9840
9841GLboolean __stdcall glIsTransformFeedback(GLuint id)
9842{
9843 EVENT("(GLuint id = %u)", id);
9844
9845 try
9846 {
9847 gl::Context *context = gl::getNonLostContext();
9848
9849 if (context)
9850 {
9851 if (context->getClientVersion() < 3)
9852 {
9853 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9854 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009855
Jamie Madill54133512013-06-21 09:33:07 -04009856 // glIsTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009857 UNIMPLEMENTED();
9858 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009859 }
9860 catch(std::bad_alloc&)
9861 {
9862 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9863 }
9864
9865 return GL_FALSE;
9866}
9867
9868void __stdcall glPauseTransformFeedback(void)
9869{
9870 EVENT("(void)");
9871
9872 try
9873 {
9874 gl::Context *context = gl::getNonLostContext();
9875
9876 if (context)
9877 {
9878 if (context->getClientVersion() < 3)
9879 {
9880 return gl::error(GL_INVALID_OPERATION);
9881 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009882
Jamie Madill54133512013-06-21 09:33:07 -04009883 // glPauseTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009884 UNIMPLEMENTED();
9885 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009886 }
9887 catch(std::bad_alloc&)
9888 {
9889 return gl::error(GL_OUT_OF_MEMORY);
9890 }
9891}
9892
9893void __stdcall glResumeTransformFeedback(void)
9894{
9895 EVENT("(void)");
9896
9897 try
9898 {
9899 gl::Context *context = gl::getNonLostContext();
9900
9901 if (context)
9902 {
9903 if (context->getClientVersion() < 3)
9904 {
9905 return gl::error(GL_INVALID_OPERATION);
9906 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009907
Jamie Madill54133512013-06-21 09:33:07 -04009908 // glResumeTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009909 UNIMPLEMENTED();
9910 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009911 }
9912 catch(std::bad_alloc&)
9913 {
9914 return gl::error(GL_OUT_OF_MEMORY);
9915 }
9916}
9917
9918void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9919{
9920 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9921 program, bufSize, length, binaryFormat, binary);
9922
9923 try
9924 {
9925 gl::Context *context = gl::getNonLostContext();
9926
9927 if (context)
9928 {
9929 if (context->getClientVersion() < 3)
9930 {
9931 return gl::error(GL_INVALID_OPERATION);
9932 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009933
Jamie Madill54133512013-06-21 09:33:07 -04009934 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009935 UNIMPLEMENTED();
9936 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009937 }
9938 catch(std::bad_alloc&)
9939 {
9940 return gl::error(GL_OUT_OF_MEMORY);
9941 }
9942}
9943
9944void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9945{
9946 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9947 program, binaryFormat, binary, length);
9948
9949 try
9950 {
9951 gl::Context *context = gl::getNonLostContext();
9952
9953 if (context)
9954 {
9955 if (context->getClientVersion() < 3)
9956 {
9957 return gl::error(GL_INVALID_OPERATION);
9958 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009959
Jamie Madill54133512013-06-21 09:33:07 -04009960 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009961 UNIMPLEMENTED();
9962 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009963 }
9964 catch(std::bad_alloc&)
9965 {
9966 return gl::error(GL_OUT_OF_MEMORY);
9967 }
9968}
9969
9970void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9971{
9972 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9973 program, pname, value);
9974
9975 try
9976 {
9977 gl::Context *context = gl::getNonLostContext();
9978
9979 if (context)
9980 {
9981 if (context->getClientVersion() < 3)
9982 {
9983 return gl::error(GL_INVALID_OPERATION);
9984 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009985
Jamie Madill54133512013-06-21 09:33:07 -04009986 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009987 UNIMPLEMENTED();
9988 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009989 }
9990 catch(std::bad_alloc&)
9991 {
9992 return gl::error(GL_OUT_OF_MEMORY);
9993 }
9994}
9995
9996void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9997{
9998 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9999 target, numAttachments, attachments);
10000
10001 try
10002 {
10003 gl::Context *context = gl::getNonLostContext();
10004
10005 if (context)
10006 {
10007 if (context->getClientVersion() < 3)
10008 {
10009 return gl::error(GL_INVALID_OPERATION);
10010 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010011
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010012 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010013 {
10014 return;
10015 }
10016
10017 int maxDimension = context->getMaximumRenderbufferDimension();
10018 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
10019 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010020 }
10021 catch(std::bad_alloc&)
10022 {
10023 return gl::error(GL_OUT_OF_MEMORY);
10024 }
10025}
10026
10027void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10028{
10029 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10030 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10031 target, numAttachments, attachments, x, y, width, height);
10032
10033 try
10034 {
10035 gl::Context *context = gl::getNonLostContext();
10036
10037 if (context)
10038 {
10039 if (context->getClientVersion() < 3)
10040 {
10041 return gl::error(GL_INVALID_OPERATION);
10042 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010043
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010044 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010045 {
10046 return;
10047 }
10048
10049 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
10050 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010051 }
10052 catch(std::bad_alloc&)
10053 {
10054 return gl::error(GL_OUT_OF_MEMORY);
10055 }
10056}
10057
10058void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10059{
10060 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10061 target, levels, internalformat, width, height);
10062
10063 try
10064 {
10065 gl::Context *context = gl::getNonLostContext();
10066
10067 if (context)
10068 {
10069 if (context->getClientVersion() < 3)
10070 {
10071 return gl::error(GL_INVALID_OPERATION);
10072 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010073
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010074 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010075 {
10076 return;
10077 }
10078
10079 switch (target)
10080 {
10081 case GL_TEXTURE_2D:
10082 {
10083 gl::Texture2D *texture2d = context->getTexture2D();
10084 texture2d->storage(levels, internalformat, width, height);
10085 }
10086 break;
10087
Geoff Lang01c21d22013-09-24 11:52:16 -040010088 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010089 {
10090 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
10091 textureCube->storage(levels, internalformat, width);
10092 }
10093 break;
10094
10095 default:
10096 return gl::error(GL_INVALID_ENUM);
10097 }
10098 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010099 }
10100 catch(std::bad_alloc&)
10101 {
10102 return gl::error(GL_OUT_OF_MEMORY);
10103 }
10104}
10105
10106void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10107{
10108 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10109 "GLsizei height = %d, GLsizei depth = %d)",
10110 target, levels, internalformat, width, height, depth);
10111
10112 try
10113 {
10114 gl::Context *context = gl::getNonLostContext();
10115
10116 if (context)
10117 {
10118 if (context->getClientVersion() < 3)
10119 {
10120 return gl::error(GL_INVALID_OPERATION);
10121 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010122
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010123 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010124 {
10125 return;
10126 }
10127
10128 switch (target)
10129 {
10130 case GL_TEXTURE_3D:
10131 {
10132 gl::Texture3D *texture3d = context->getTexture3D();
10133 texture3d->storage(levels, internalformat, width, height, depth);
10134 }
10135 break;
10136
10137 case GL_TEXTURE_2D_ARRAY:
10138 {
10139 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
10140 texture2darray->storage(levels, internalformat, width, height, depth);
10141 }
10142 break;
10143
10144 default:
Geoff Lang01c21d22013-09-24 11:52:16 -040010145 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010146 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010147 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010148 }
10149 catch(std::bad_alloc&)
10150 {
10151 return gl::error(GL_OUT_OF_MEMORY);
10152 }
10153}
10154
10155void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10156{
10157 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10158 "GLint* params = 0x%0.8p)",
10159 target, internalformat, pname, bufSize, params);
10160
10161 try
10162 {
10163 gl::Context *context = gl::getNonLostContext();
10164
10165 if (context)
10166 {
10167 if (context->getClientVersion() < 3)
10168 {
10169 return gl::error(GL_INVALID_OPERATION);
10170 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010171
Shannon Woods809d2502013-07-08 10:32:18 -040010172 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10173 !gl::IsDepthRenderingSupported(internalformat, context) &&
10174 !gl::IsStencilRenderingSupported(internalformat, context))
10175 {
10176 return gl::error(GL_INVALID_ENUM);
10177 }
10178
10179 if (target != GL_RENDERBUFFER)
10180 {
10181 return gl::error(GL_INVALID_ENUM);
10182 }
10183
10184 if (bufSize < 0)
10185 {
10186 return gl::error(GL_INVALID_VALUE);
10187 }
10188
10189 switch (pname)
10190 {
10191 case GL_NUM_SAMPLE_COUNTS:
10192 if (bufSize != 0)
10193 *params = context->getNumSampleCounts(internalformat);
10194 break;
10195 case GL_SAMPLES:
10196 context->getSampleCounts(internalformat, bufSize, params);
10197 break;
10198 default:
10199 return gl::error(GL_INVALID_ENUM);
10200 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010201 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010202 }
10203 catch(std::bad_alloc&)
10204 {
10205 return gl::error(GL_OUT_OF_MEMORY);
10206 }
10207}
10208
10209// Extension functions
10210
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010211void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10212 GLbitfield mask, GLenum filter)
10213{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010214 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010215 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10216 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10217 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10218
10219 try
10220 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010221 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010222
10223 if (context)
10224 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010225 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010226 dstX0, dstY0, dstX1, dstY1, mask, filter,
10227 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010228 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010229 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010230 }
10231
Geoff Lang758d5b22013-06-11 11:42:50 -040010232 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10233 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010234 }
10235 }
10236 catch(std::bad_alloc&)
10237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010238 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010239 }
10240}
10241
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010242void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10243 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010244{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010245 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010246 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010247 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010248 target, level, internalformat, width, height, depth, border, format, type, pixels);
10249
10250 try
10251 {
10252 UNIMPLEMENTED(); // FIXME
10253 }
10254 catch(std::bad_alloc&)
10255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010256 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010257 }
10258}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010259
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010260void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10261 GLenum *binaryFormat, void *binary)
10262{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010263 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 +000010264 program, bufSize, length, binaryFormat, binary);
10265
10266 try
10267 {
10268 gl::Context *context = gl::getNonLostContext();
10269
10270 if (context)
10271 {
10272 gl::Program *programObject = context->getProgram(program);
10273
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010274 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010276 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010277 }
10278
10279 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10280
10281 if (!programBinary)
10282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010283 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010284 }
10285
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010286 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010288 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010289 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010290
10291 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010292 }
10293 }
10294 catch(std::bad_alloc&)
10295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010296 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010297 }
10298}
10299
10300void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10301 const void *binary, GLint length)
10302{
10303 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10304 program, binaryFormat, binary, length);
10305
10306 try
10307 {
10308 gl::Context *context = gl::getNonLostContext();
10309
10310 if (context)
10311 {
10312 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010314 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010315 }
10316
10317 gl::Program *programObject = context->getProgram(program);
10318
10319 if (!programObject)
10320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010321 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010322 }
10323
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010324 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010325 }
10326 }
10327 catch(std::bad_alloc&)
10328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010329 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010330 }
10331}
10332
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010333void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10334{
10335 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10336
10337 try
10338 {
10339 gl::Context *context = gl::getNonLostContext();
10340
10341 if (context)
10342 {
10343 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10344 {
10345 return gl::error(GL_INVALID_VALUE);
10346 }
10347
10348 if (context->getDrawFramebufferHandle() == 0)
10349 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010350 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010351 {
10352 return gl::error(GL_INVALID_OPERATION);
10353 }
10354
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010355 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010356 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010357 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010358 }
10359 }
10360 else
10361 {
10362 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10363 {
10364 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10365 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10366 {
10367 return gl::error(GL_INVALID_OPERATION);
10368 }
10369 }
10370 }
10371
10372 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10373
10374 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10375 {
10376 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10377 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010378
10379 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10380 {
10381 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10382 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010383 }
10384 }
10385 catch (std::bad_alloc&)
10386 {
10387 return gl::error(GL_OUT_OF_MEMORY);
10388 }
10389}
10390
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010391__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10392{
10393 struct Extension
10394 {
10395 const char *name;
10396 __eglMustCastToProperFunctionPointerType address;
10397 };
10398
10399 static const Extension glExtensions[] =
10400 {
10401 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010402 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010403 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010404 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10405 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10406 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10407 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10408 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10409 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10410 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010411 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010412 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010413 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10414 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10415 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10416 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010417 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10418 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10419 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10420 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10421 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10422 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10423 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010424 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010425 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10426 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10427 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010428 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10429 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010430
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010431 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010432 {
10433 if (strcmp(procname, glExtensions[ext].name) == 0)
10434 {
10435 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10436 }
10437 }
10438
10439 return NULL;
10440}
10441
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010442// Non-public functions used by EGL
10443
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010444bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010445{
10446 EVENT("(egl::Surface* surface = 0x%0.8p)",
10447 surface);
10448
10449 try
10450 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010451 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010452
10453 if (context)
10454 {
10455 gl::Texture2D *textureObject = context->getTexture2D();
10456
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010457 if (textureObject->isImmutable())
10458 {
10459 return false;
10460 }
10461
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010462 if (textureObject)
10463 {
10464 textureObject->bindTexImage(surface);
10465 }
10466 }
10467 }
10468 catch(std::bad_alloc&)
10469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010470 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010471 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010472
10473 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010474}
10475
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010476}