blob: 0d19eb33c8ab6bf46dc940ed1219e146a143939e [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00003// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040024#include "libGLESv2/VertexArray.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000025
Geoff Lange8ebe7f2013-08-05 15:03:13 -040026#include "libGLESv2/validationES.h"
27#include "libGLESv2/validationES2.h"
28#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050029#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040030
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000031extern "C"
32{
33
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000034// OpenGL ES 2.0 functions
35
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000036void __stdcall glActiveTexture(GLenum texture)
37{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000038 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000039
40 try
41 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000042 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000043
44 if (context)
45 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000046 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
47 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000048 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000049 }
50
daniel@transgaming.com428d1582010-05-04 03:35:25 +000051 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000052 }
53 }
54 catch(std::bad_alloc&)
55 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000056 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000057 }
58}
59
60void __stdcall glAttachShader(GLuint program, GLuint shader)
61{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000062 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000063
64 try
65 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000066 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000067
68 if (context)
69 {
70 gl::Program *programObject = context->getProgram(program);
71 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000072
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000073 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000074 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000075 if (context->getShader(program))
76 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000077 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000078 }
79 else
80 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000081 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000082 }
83 }
84
85 if (!shaderObject)
86 {
87 if (context->getProgram(shader))
88 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000089 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000090 }
91 else
92 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000093 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000094 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000095 }
96
97 if (!programObject->attachShader(shaderObject))
98 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000099 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000100 }
101 }
102 }
103 catch(std::bad_alloc&)
104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000105 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000106 }
107}
108
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000109void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
110{
111 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
112
113 try
114 {
115 switch (target)
116 {
117 case GL_ANY_SAMPLES_PASSED_EXT:
118 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
119 break;
120 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000121 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000122 }
123
124 if (id == 0)
125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000126 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000127 }
128
129 gl::Context *context = gl::getNonLostContext();
130
131 if (context)
132 {
133 context->beginQuery(target, id);
134 }
135 }
136 catch(std::bad_alloc&)
137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000138 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000139 }
140}
141
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000142void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000143{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000144 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000145
146 try
147 {
148 if (index >= gl::MAX_VERTEX_ATTRIBS)
149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000150 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151 }
152
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000153 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000154
155 if (context)
156 {
157 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000158
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000159 if (!programObject)
160 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000161 if (context->getShader(program))
162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000163 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000164 }
165 else
166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000167 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000168 }
169 }
170
171 if (strncmp(name, "gl_", 3) == 0)
172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000173 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000174 }
175
176 programObject->bindAttributeLocation(index, name);
177 }
178 }
179 catch(std::bad_alloc&)
180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000181 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000182 }
183}
184
185void __stdcall glBindBuffer(GLenum target, GLuint buffer)
186{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000187 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000188
189 try
190 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000191 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000192
193 if (context)
194 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000195 // Check ES3 specific targets
196 switch (target)
197 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000198 case GL_COPY_READ_BUFFER:
199 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000200 case GL_PIXEL_PACK_BUFFER:
201 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000202 case GL_UNIFORM_BUFFER:
203 case GL_TRANSFORM_FEEDBACK_BUFFER:
204 if (context->getClientVersion() < 3)
205 {
206 return gl::error(GL_INVALID_ENUM);
207 }
208 }
209
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000210 switch (target)
211 {
212 case GL_ARRAY_BUFFER:
213 context->bindArrayBuffer(buffer);
214 return;
215 case GL_ELEMENT_ARRAY_BUFFER:
216 context->bindElementArrayBuffer(buffer);
217 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000218 case GL_COPY_READ_BUFFER:
219 context->bindCopyReadBuffer(buffer);
220 return;
221 case GL_COPY_WRITE_BUFFER:
222 context->bindCopyWriteBuffer(buffer);
223 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000224 case GL_PIXEL_PACK_BUFFER:
225 context->bindPixelPackBuffer(buffer);
226 return;
227 case GL_PIXEL_UNPACK_BUFFER:
228 context->bindPixelUnpackBuffer(buffer);
229 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000230 case GL_UNIFORM_BUFFER:
231 context->bindGenericUniformBuffer(buffer);
232 return;
233 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000234 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000235 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000236 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000237 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000238 }
239 }
240 }
241 catch(std::bad_alloc&)
242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000243 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000244 }
245}
246
247void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
248{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000249 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000250
251 try
252 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500253 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000255 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256 }
257
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000258 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000259
260 if (context)
261 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000262 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
263 {
264 context->bindReadFramebuffer(framebuffer);
265 }
266
267 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
268 {
269 context->bindDrawFramebuffer(framebuffer);
270 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000271 }
272 }
273 catch(std::bad_alloc&)
274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000275 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000276 }
277}
278
279void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
280{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000281 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282
283 try
284 {
285 if (target != GL_RENDERBUFFER)
286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000287 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000288 }
289
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000290 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000291
292 if (context)
293 {
294 context->bindRenderbuffer(renderbuffer);
295 }
296 }
297 catch(std::bad_alloc&)
298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000299 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000300 }
301}
302
303void __stdcall glBindTexture(GLenum target, GLuint texture)
304{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000305 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000306
307 try
308 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000309 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000310
311 if (context)
312 {
313 gl::Texture *textureObject = context->getTexture(texture);
314
315 if (textureObject && textureObject->getTarget() != target && texture != 0)
316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000317 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000318 }
319
320 switch (target)
321 {
322 case GL_TEXTURE_2D:
323 context->bindTexture2D(texture);
324 return;
325 case GL_TEXTURE_CUBE_MAP:
326 context->bindTextureCubeMap(texture);
327 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000328 case GL_TEXTURE_3D:
329 if (context->getClientVersion() < 3)
330 {
331 return gl::error(GL_INVALID_ENUM);
332 }
333 context->bindTexture3D(texture);
334 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000335 case GL_TEXTURE_2D_ARRAY:
336 if (context->getClientVersion() < 3)
337 {
338 return gl::error(GL_INVALID_ENUM);
339 }
340 context->bindTexture2DArray(texture);
341 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000342 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000343 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000344 }
345 }
346 }
347 catch(std::bad_alloc&)
348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000349 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000350 }
351}
352
353void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
354{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000355 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000356 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000357
358 try
359 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000360 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000361
362 if (context)
363 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000364 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000365 }
366 }
367 catch(std::bad_alloc&)
368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000369 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000370 }
371}
372
373void __stdcall glBlendEquation(GLenum mode)
374{
375 glBlendEquationSeparate(mode, mode);
376}
377
378void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
379{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000380 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000381
382 try
383 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000384 gl::Context *context = gl::getNonLostContext();
385
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000386 switch (modeRGB)
387 {
388 case GL_FUNC_ADD:
389 case GL_FUNC_SUBTRACT:
390 case GL_FUNC_REVERSE_SUBTRACT:
391 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000392
393 case GL_MIN:
394 case GL_MAX:
395 if (context && context->getClientVersion() < 3)
396 {
397 return gl::error(GL_INVALID_ENUM);
398 }
399 break;
400
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000401 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000402 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000403 }
404
405 switch (modeAlpha)
406 {
407 case GL_FUNC_ADD:
408 case GL_FUNC_SUBTRACT:
409 case GL_FUNC_REVERSE_SUBTRACT:
410 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000411
412 case GL_MIN:
413 case GL_MAX:
414 if (context && context->getClientVersion() < 3)
415 {
416 return gl::error(GL_INVALID_ENUM);
417 }
418 break;
419
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000420 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000421 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000422 }
423
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000424 if (context)
425 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000426 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000427 }
428 }
429 catch(std::bad_alloc&)
430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000431 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000432 }
433}
434
435void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
436{
437 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
438}
439
440void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
441{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000442 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 +0000443 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000444
445 try
446 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000447 gl::Context *context = gl::getNonLostContext();
448
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000449 switch (srcRGB)
450 {
451 case GL_ZERO:
452 case GL_ONE:
453 case GL_SRC_COLOR:
454 case GL_ONE_MINUS_SRC_COLOR:
455 case GL_DST_COLOR:
456 case GL_ONE_MINUS_DST_COLOR:
457 case GL_SRC_ALPHA:
458 case GL_ONE_MINUS_SRC_ALPHA:
459 case GL_DST_ALPHA:
460 case GL_ONE_MINUS_DST_ALPHA:
461 case GL_CONSTANT_COLOR:
462 case GL_ONE_MINUS_CONSTANT_COLOR:
463 case GL_CONSTANT_ALPHA:
464 case GL_ONE_MINUS_CONSTANT_ALPHA:
465 case GL_SRC_ALPHA_SATURATE:
466 break;
467 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000468 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000469 }
470
471 switch (dstRGB)
472 {
473 case GL_ZERO:
474 case GL_ONE:
475 case GL_SRC_COLOR:
476 case GL_ONE_MINUS_SRC_COLOR:
477 case GL_DST_COLOR:
478 case GL_ONE_MINUS_DST_COLOR:
479 case GL_SRC_ALPHA:
480 case GL_ONE_MINUS_SRC_ALPHA:
481 case GL_DST_ALPHA:
482 case GL_ONE_MINUS_DST_ALPHA:
483 case GL_CONSTANT_COLOR:
484 case GL_ONE_MINUS_CONSTANT_COLOR:
485 case GL_CONSTANT_ALPHA:
486 case GL_ONE_MINUS_CONSTANT_ALPHA:
487 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000488
489 case GL_SRC_ALPHA_SATURATE:
490 if (!context || context->getClientVersion() < 3)
491 {
492 return gl::error(GL_INVALID_ENUM);
493 }
494 break;
495
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000496 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000497 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000498 }
499
500 switch (srcAlpha)
501 {
502 case GL_ZERO:
503 case GL_ONE:
504 case GL_SRC_COLOR:
505 case GL_ONE_MINUS_SRC_COLOR:
506 case GL_DST_COLOR:
507 case GL_ONE_MINUS_DST_COLOR:
508 case GL_SRC_ALPHA:
509 case GL_ONE_MINUS_SRC_ALPHA:
510 case GL_DST_ALPHA:
511 case GL_ONE_MINUS_DST_ALPHA:
512 case GL_CONSTANT_COLOR:
513 case GL_ONE_MINUS_CONSTANT_COLOR:
514 case GL_CONSTANT_ALPHA:
515 case GL_ONE_MINUS_CONSTANT_ALPHA:
516 case GL_SRC_ALPHA_SATURATE:
517 break;
518 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000519 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000520 }
521
522 switch (dstAlpha)
523 {
524 case GL_ZERO:
525 case GL_ONE:
526 case GL_SRC_COLOR:
527 case GL_ONE_MINUS_SRC_COLOR:
528 case GL_DST_COLOR:
529 case GL_ONE_MINUS_DST_COLOR:
530 case GL_SRC_ALPHA:
531 case GL_ONE_MINUS_SRC_ALPHA:
532 case GL_DST_ALPHA:
533 case GL_ONE_MINUS_DST_ALPHA:
534 case GL_CONSTANT_COLOR:
535 case GL_ONE_MINUS_CONSTANT_COLOR:
536 case GL_CONSTANT_ALPHA:
537 case GL_ONE_MINUS_CONSTANT_ALPHA:
538 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000539
540 case GL_SRC_ALPHA_SATURATE:
541 if (!context || context->getClientVersion() < 3)
542 {
543 return gl::error(GL_INVALID_ENUM);
544 }
545 break;
546
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000547 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000548 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000549 }
550
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000551 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
552 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
553
554 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
555 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
556
557 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000558 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000559 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 +0000560 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000561 }
562
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000563 if (context)
564 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000565 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000566 }
567 }
568 catch(std::bad_alloc&)
569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000570 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000571 }
572}
573
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000574void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000575{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000576 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 +0000577 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000578
579 try
580 {
581 if (size < 0)
582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000583 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000584 }
585
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000586 gl::Context *context = gl::getNonLostContext();
587
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000588 switch (usage)
589 {
590 case GL_STREAM_DRAW:
591 case GL_STATIC_DRAW:
592 case GL_DYNAMIC_DRAW:
593 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000594
595 case GL_STREAM_READ:
596 case GL_STREAM_COPY:
597 case GL_STATIC_READ:
598 case GL_STATIC_COPY:
599 case GL_DYNAMIC_READ:
600 case GL_DYNAMIC_COPY:
601 if (context && context->getClientVersion() < 3)
602 {
603 return gl::error(GL_INVALID_ENUM);
604 }
605 break;
606
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000607 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000608 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000609 }
610
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000611 if (context)
612 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000613 // Check ES3 specific targets
614 switch (target)
615 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000616 case GL_COPY_READ_BUFFER:
617 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000618 case GL_PIXEL_PACK_BUFFER:
619 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000620 case GL_UNIFORM_BUFFER:
621 case GL_TRANSFORM_FEEDBACK_BUFFER:
622 if (context->getClientVersion() < 3)
623 {
624 return gl::error(GL_INVALID_ENUM);
625 }
626 }
627
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000628 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000629
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000630 switch (target)
631 {
632 case GL_ARRAY_BUFFER:
633 buffer = context->getArrayBuffer();
634 break;
635 case GL_ELEMENT_ARRAY_BUFFER:
636 buffer = context->getElementArrayBuffer();
637 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000638 case GL_COPY_READ_BUFFER:
639 buffer = context->getCopyReadBuffer();
640 break;
641 case GL_COPY_WRITE_BUFFER:
642 buffer = context->getCopyWriteBuffer();
643 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000644 case GL_PIXEL_PACK_BUFFER:
645 buffer = context->getPixelPackBuffer();
646 break;
647 case GL_PIXEL_UNPACK_BUFFER:
648 buffer = context->getPixelUnpackBuffer();
649 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000650 case GL_TRANSFORM_FEEDBACK_BUFFER:
651 buffer = context->getGenericTransformFeedbackBuffer();
652 break;
653 case GL_UNIFORM_BUFFER:
654 buffer = context->getGenericUniformBuffer();
655 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000656 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000657 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000658 }
659
660 if (!buffer)
661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000662 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000663 }
664
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000665 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000666 }
667 }
668 catch(std::bad_alloc&)
669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000670 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000671 }
672}
673
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000674void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000675{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000676 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 +0000677 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000678
679 try
680 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000681 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000683 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000684 }
685
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000686 if (data == NULL)
687 {
688 return;
689 }
690
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000691 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000692
693 if (context)
694 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000695 // Check ES3 specific targets
696 switch (target)
697 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000698 case GL_COPY_READ_BUFFER:
699 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000700 case GL_PIXEL_PACK_BUFFER:
701 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000702 case GL_UNIFORM_BUFFER:
703 case GL_TRANSFORM_FEEDBACK_BUFFER:
704 if (context->getClientVersion() < 3)
705 {
706 return gl::error(GL_INVALID_ENUM);
707 }
708 }
709
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000710 gl::Buffer *buffer;
711
712 switch (target)
713 {
714 case GL_ARRAY_BUFFER:
715 buffer = context->getArrayBuffer();
716 break;
717 case GL_ELEMENT_ARRAY_BUFFER:
718 buffer = context->getElementArrayBuffer();
719 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000720 case GL_COPY_READ_BUFFER:
721 buffer = context->getCopyReadBuffer();
722 break;
723 case GL_COPY_WRITE_BUFFER:
724 buffer = context->getCopyWriteBuffer();
725 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000726 case GL_PIXEL_PACK_BUFFER:
727 buffer = context->getPixelPackBuffer();
728 break;
729 case GL_PIXEL_UNPACK_BUFFER:
730 buffer = context->getPixelUnpackBuffer();
731 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000732 case GL_TRANSFORM_FEEDBACK_BUFFER:
733 buffer = context->getGenericTransformFeedbackBuffer();
734 break;
735 case GL_UNIFORM_BUFFER:
736 buffer = context->getGenericUniformBuffer();
737 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000738 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000739 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000740 }
741
742 if (!buffer)
743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000744 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000745 }
746
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000747 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000749 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000750 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000751
752 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000753 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000754 }
755 catch(std::bad_alloc&)
756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000757 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000758 }
759}
760
761GLenum __stdcall glCheckFramebufferStatus(GLenum target)
762{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000763 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000764
765 try
766 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500767 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000769 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000770 }
771
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000772 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000773
774 if (context)
775 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500776 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
777 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000778 return framebuffer->completeness();
779 }
780 }
781 catch(std::bad_alloc&)
782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000783 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000784 }
785
786 return 0;
787}
788
789void __stdcall glClear(GLbitfield mask)
790{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000791 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000792
793 try
794 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000795 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000796
797 if (context)
798 {
Geoff Lang0b833232013-08-21 10:13:29 -0400799 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
800
801 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
802 {
803 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
804 }
805
806 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
807 {
808 return gl::error(GL_INVALID_VALUE);
809 }
810
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000811 context->clear(mask);
812 }
813 }
814 catch(std::bad_alloc&)
815 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000816 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000817 }
818}
819
820void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
821{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000822 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000823 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000824
825 try
826 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000827 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000828
829 if (context)
830 {
831 context->setClearColor(red, green, blue, alpha);
832 }
833 }
834 catch(std::bad_alloc&)
835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000836 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000837 }
838}
839
840void __stdcall glClearDepthf(GLclampf depth)
841{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000842 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000843
844 try
845 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000846 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000847
848 if (context)
849 {
850 context->setClearDepth(depth);
851 }
852 }
853 catch(std::bad_alloc&)
854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000855 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000856 }
857}
858
859void __stdcall glClearStencil(GLint s)
860{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000861 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000862
863 try
864 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000865 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000866
867 if (context)
868 {
869 context->setClearStencil(s);
870 }
871 }
872 catch(std::bad_alloc&)
873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000874 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000875 }
876}
877
878void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
879{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000880 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000881 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000882
883 try
884 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000885 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000886
887 if (context)
888 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000889 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000890 }
891 }
892 catch(std::bad_alloc&)
893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000894 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000895 }
896}
897
898void __stdcall glCompileShader(GLuint shader)
899{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000900 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000901
902 try
903 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000904 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000905
906 if (context)
907 {
908 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000909
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000910 if (!shaderObject)
911 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000912 if (context->getProgram(shader))
913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000914 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000915 }
916 else
917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000918 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000919 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000920 }
921
922 shaderObject->compile();
923 }
924 }
925 catch(std::bad_alloc&)
926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000927 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000928 }
929}
930
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000931void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
932 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000933{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000934 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000935 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000936 target, level, internalformat, width, height, border, imageSize, data);
937
938 try
939 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000940 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000941
942 if (context)
943 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000944 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400945 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000946 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
947 {
948 return;
949 }
950
951 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400952 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400953 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000954 {
955 return;
956 }
957
958 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000960 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000961 }
962
963 switch (target)
964 {
965 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000966 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000967 gl::Texture2D *texture = context->getTexture2D();
968 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000969 }
970 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000971
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000972 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
973 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
974 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
975 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
976 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
977 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000978 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000979 gl::TextureCubeMap *texture = context->getTextureCubeMap();
980 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000981 }
982 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000983
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000984 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000985 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000986 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000987 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000988 }
989 catch(std::bad_alloc&)
990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000991 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000992 }
993}
994
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000995void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
996 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000997{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000998 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000999 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001000 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001001 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1002
1003 try
1004 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001005 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001006
1007 if (context)
1008 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001009 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001010 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001011 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
1012 {
1013 return;
1014 }
1015
1016 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001017 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04001018 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001019 {
1020 return;
1021 }
1022
1023 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001025 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001026 }
1027
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001028 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +00001029 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001030 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001031 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001032 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001033 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001034 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001035 break;
1036
1037 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1038 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1039 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1040 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1041 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1042 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001043 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001044 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001045 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001046 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001047 break;
1048
1049 default:
1050 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001051 }
1052 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001053 }
1054 catch(std::bad_alloc&)
1055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001056 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001057 }
1058}
1059
1060void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1061{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001062 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001063 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001064 target, level, internalformat, x, y, width, height, border);
1065
1066 try
1067 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001068 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001069
1070 if (context)
1071 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001072 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001073 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001074 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001075 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001076 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001077 }
1078
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001079 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001080 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001081 0, 0, 0, x, y, width, height, border))
1082 {
1083 return;
1084 }
1085
1086 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
1087
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001088 switch (target)
1089 {
1090 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001091 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001092 gl::Texture2D *texture = context->getTexture2D();
1093 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001094 }
1095 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001096
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001097 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1098 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1099 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1100 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1101 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1102 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001103 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001104 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1105 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001106 }
1107 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001108
1109 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001110 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001111 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001112 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001113 }
1114 catch(std::bad_alloc&)
1115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001116 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001117 }
1118}
1119
1120void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1121{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001122 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001123 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001124 target, level, xoffset, yoffset, x, y, width, height);
1125
1126 try
1127 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001128 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001129
1130 if (context)
1131 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001132 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001133 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001134 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001135 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001136 return;
1137 }
1138
1139 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001140 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001141 xoffset, yoffset, 0, x, y, width, height, 0))
1142 {
1143 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001144 }
1145
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001146 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001147
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001148 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001149 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001150 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001151 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001152 gl::Texture2D *texture = context->getTexture2D();
1153 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001154 }
1155 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001156
1157 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1158 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1159 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1160 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1161 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1162 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001163 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001164 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1165 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001166 }
1167 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001168
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001169 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001170 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001171 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001172 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001173 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001174
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001175 catch(std::bad_alloc&)
1176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001177 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001178 }
1179}
1180
1181GLuint __stdcall glCreateProgram(void)
1182{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001183 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001184
1185 try
1186 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001187 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001188
1189 if (context)
1190 {
1191 return context->createProgram();
1192 }
1193 }
1194 catch(std::bad_alloc&)
1195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001196 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001197 }
1198
1199 return 0;
1200}
1201
1202GLuint __stdcall glCreateShader(GLenum type)
1203{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001204 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001205
1206 try
1207 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001208 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001209
1210 if (context)
1211 {
1212 switch (type)
1213 {
1214 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001215 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001216 return context->createShader(type);
1217 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001218 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001219 }
1220 }
1221 }
1222 catch(std::bad_alloc&)
1223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001224 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001225 }
1226
1227 return 0;
1228}
1229
1230void __stdcall glCullFace(GLenum mode)
1231{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001232 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001233
1234 try
1235 {
1236 switch (mode)
1237 {
1238 case GL_FRONT:
1239 case GL_BACK:
1240 case GL_FRONT_AND_BACK:
1241 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001242 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001243
1244 if (context)
1245 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001246 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001247 }
1248 }
1249 break;
1250 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001251 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001252 }
1253 }
1254 catch(std::bad_alloc&)
1255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001256 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001257 }
1258}
1259
1260void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1261{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001262 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001263
1264 try
1265 {
1266 if (n < 0)
1267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001268 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001269 }
1270
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001271 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001272
1273 if (context)
1274 {
1275 for (int i = 0; i < n; i++)
1276 {
1277 context->deleteBuffer(buffers[i]);
1278 }
1279 }
1280 }
1281 catch(std::bad_alloc&)
1282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001283 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001284 }
1285}
1286
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001287void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1288{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001289 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001290
1291 try
1292 {
1293 if (n < 0)
1294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001295 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001296 }
1297
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001298 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001299
1300 if (context)
1301 {
1302 for (int i = 0; i < n; i++)
1303 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001304 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001305 }
1306 }
1307 }
1308 catch(std::bad_alloc&)
1309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001310 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001311 }
1312}
1313
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001314void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1315{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001316 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001317
1318 try
1319 {
1320 if (n < 0)
1321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001322 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001323 }
1324
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001325 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001326
1327 if (context)
1328 {
1329 for (int i = 0; i < n; i++)
1330 {
1331 if (framebuffers[i] != 0)
1332 {
1333 context->deleteFramebuffer(framebuffers[i]);
1334 }
1335 }
1336 }
1337 }
1338 catch(std::bad_alloc&)
1339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001340 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001341 }
1342}
1343
1344void __stdcall glDeleteProgram(GLuint program)
1345{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001346 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001347
1348 try
1349 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001350 if (program == 0)
1351 {
1352 return;
1353 }
1354
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001355 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001356
1357 if (context)
1358 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001359 if (!context->getProgram(program))
1360 {
1361 if(context->getShader(program))
1362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001363 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001364 }
1365 else
1366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001367 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001368 }
1369 }
1370
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001371 context->deleteProgram(program);
1372 }
1373 }
1374 catch(std::bad_alloc&)
1375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001376 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001377 }
1378}
1379
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001380void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1381{
1382 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1383
1384 try
1385 {
1386 if (n < 0)
1387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001388 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001389 }
1390
1391 gl::Context *context = gl::getNonLostContext();
1392
1393 if (context)
1394 {
1395 for (int i = 0; i < n; i++)
1396 {
1397 context->deleteQuery(ids[i]);
1398 }
1399 }
1400 }
1401 catch(std::bad_alloc&)
1402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001403 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001404 }
1405}
1406
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001407void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1408{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001409 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001410
1411 try
1412 {
1413 if (n < 0)
1414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001415 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001416 }
1417
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001418 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001419
1420 if (context)
1421 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001422 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001423 {
1424 context->deleteRenderbuffer(renderbuffers[i]);
1425 }
1426 }
1427 }
1428 catch(std::bad_alloc&)
1429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001430 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001431 }
1432}
1433
1434void __stdcall glDeleteShader(GLuint shader)
1435{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001436 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001437
1438 try
1439 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001440 if (shader == 0)
1441 {
1442 return;
1443 }
1444
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001445 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001446
1447 if (context)
1448 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001449 if (!context->getShader(shader))
1450 {
1451 if(context->getProgram(shader))
1452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001453 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001454 }
1455 else
1456 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001457 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001458 }
1459 }
1460
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001461 context->deleteShader(shader);
1462 }
1463 }
1464 catch(std::bad_alloc&)
1465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001466 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001467 }
1468}
1469
1470void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1471{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001472 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001473
1474 try
1475 {
1476 if (n < 0)
1477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001478 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001479 }
1480
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001481 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001482
1483 if (context)
1484 {
1485 for (int i = 0; i < n; i++)
1486 {
1487 if (textures[i] != 0)
1488 {
1489 context->deleteTexture(textures[i]);
1490 }
1491 }
1492 }
1493 }
1494 catch(std::bad_alloc&)
1495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001496 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001497 }
1498}
1499
1500void __stdcall glDepthFunc(GLenum func)
1501{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001502 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001503
1504 try
1505 {
1506 switch (func)
1507 {
1508 case GL_NEVER:
1509 case GL_ALWAYS:
1510 case GL_LESS:
1511 case GL_LEQUAL:
1512 case GL_EQUAL:
1513 case GL_GREATER:
1514 case GL_GEQUAL:
1515 case GL_NOTEQUAL:
1516 break;
1517 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001518 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001519 }
1520
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001521 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001522
1523 if (context)
1524 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001525 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001526 }
1527 }
1528 catch(std::bad_alloc&)
1529 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001530 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001531 }
1532}
1533
1534void __stdcall glDepthMask(GLboolean flag)
1535{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001536 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001537
1538 try
1539 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001540 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001541
1542 if (context)
1543 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001544 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001545 }
1546 }
1547 catch(std::bad_alloc&)
1548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001549 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001550 }
1551}
1552
1553void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1554{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001555 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001556
1557 try
1558 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001559 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001560
1561 if (context)
1562 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001563 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001564 }
1565 }
1566 catch(std::bad_alloc&)
1567 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001568 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001569 }
1570}
1571
1572void __stdcall glDetachShader(GLuint program, GLuint shader)
1573{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001574 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001575
1576 try
1577 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001578 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001579
1580 if (context)
1581 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001582
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001583 gl::Program *programObject = context->getProgram(program);
1584 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001585
1586 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001587 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001588 gl::Shader *shaderByProgramHandle;
1589 shaderByProgramHandle = context->getShader(program);
1590 if (!shaderByProgramHandle)
1591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001592 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001593 }
1594 else
1595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001596 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001597 }
1598 }
1599
1600 if (!shaderObject)
1601 {
1602 gl::Program *programByShaderHandle = context->getProgram(shader);
1603 if (!programByShaderHandle)
1604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001605 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001606 }
1607 else
1608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001609 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001610 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001611 }
1612
1613 if (!programObject->detachShader(shaderObject))
1614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001615 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001616 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001617 }
1618 }
1619 catch(std::bad_alloc&)
1620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001621 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001622 }
1623}
1624
1625void __stdcall glDisable(GLenum cap)
1626{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001627 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001628
1629 try
1630 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001631 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001632
1633 if (context)
1634 {
Geoff Lang0550d032014-01-30 11:29:07 -05001635 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001637 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001638 }
Geoff Lang0550d032014-01-30 11:29:07 -05001639
1640 context->setCap(cap, false);
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 glDisableVertexAttribArray(GLuint index)
1650{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001651 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001652
1653 try
1654 {
1655 if (index >= gl::MAX_VERTEX_ATTRIBS)
1656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001657 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001658 }
1659
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001661
1662 if (context)
1663 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001664 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001665 }
1666 }
1667 catch(std::bad_alloc&)
1668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001669 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001670 }
1671}
1672
1673void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1674{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001675 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001676
1677 try
1678 {
1679 if (count < 0 || first < 0)
1680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001681 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001682 }
1683
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001684 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001685
1686 if (context)
1687 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001688 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001689 }
1690 }
1691 catch(std::bad_alloc&)
1692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001693 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001694 }
1695}
1696
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001697void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1698{
1699 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1700
1701 try
1702 {
1703 if (count < 0 || first < 0 || primcount < 0)
1704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001705 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001706 }
1707
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001708 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001709 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001710 gl::Context *context = gl::getNonLostContext();
1711
1712 if (context)
1713 {
1714 context->drawArrays(mode, first, count, primcount);
1715 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001716 }
1717 }
1718 catch(std::bad_alloc&)
1719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001720 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001721 }
1722}
1723
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001724void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001725{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001726 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 +00001727 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001728
1729 try
1730 {
1731 if (count < 0)
1732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001734 }
1735
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001736 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001737
1738 if (context)
1739 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001740 switch (type)
1741 {
1742 case GL_UNSIGNED_BYTE:
1743 case GL_UNSIGNED_SHORT:
1744 break;
1745 case GL_UNSIGNED_INT:
1746 if (!context->supports32bitIndices())
1747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001748 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001749 }
1750 break;
1751 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001752 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001753 }
1754
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001755 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001756 }
1757 }
1758 catch(std::bad_alloc&)
1759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001760 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001761 }
1762}
1763
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001764void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1765{
1766 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1767 mode, count, type, indices, primcount);
1768
1769 try
1770 {
1771 if (count < 0 || primcount < 0)
1772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001773 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001774 }
1775
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001776 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001777 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001778 gl::Context *context = gl::getNonLostContext();
1779
1780 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001781 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001782 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001783 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001784 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.com8ca9c6e2012-01-27 15:38:54 +00001791 }
1792 break;
1793 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001794 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001795 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001796
1797 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001798 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001799 }
1800 }
1801 catch(std::bad_alloc&)
1802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001803 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001804 }
1805}
1806
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001807void __stdcall glEnable(GLenum cap)
1808{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001809 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001810
1811 try
1812 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001813 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001814
1815 if (context)
1816 {
Geoff Lang0550d032014-01-30 11:29:07 -05001817 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001819 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001820 }
Geoff Lang0550d032014-01-30 11:29:07 -05001821
1822 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001823 }
1824 }
1825 catch(std::bad_alloc&)
1826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001827 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001828 }
1829}
1830
1831void __stdcall glEnableVertexAttribArray(GLuint index)
1832{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001833 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001834
1835 try
1836 {
1837 if (index >= gl::MAX_VERTEX_ATTRIBS)
1838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001839 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001840 }
1841
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001842 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001843
1844 if (context)
1845 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001846 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001847 }
1848 }
1849 catch(std::bad_alloc&)
1850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001851 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001852 }
1853}
1854
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001855void __stdcall glEndQueryEXT(GLenum target)
1856{
1857 EVENT("GLenum target = 0x%X)", target);
1858
1859 try
1860 {
1861 switch (target)
1862 {
1863 case GL_ANY_SAMPLES_PASSED_EXT:
1864 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
1865 break;
1866 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001867 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001868 }
1869
1870 gl::Context *context = gl::getNonLostContext();
1871
1872 if (context)
1873 {
1874 context->endQuery(target);
1875 }
1876 }
1877 catch(std::bad_alloc&)
1878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001879 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001880 }
1881}
1882
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001883void __stdcall glFinishFenceNV(GLuint fence)
1884{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001885 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001886
1887 try
1888 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001889 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001890
1891 if (context)
1892 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001893 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001894
1895 if (fenceObject == NULL)
1896 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001897 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001898 }
1899
Jamie Madillfb9a7402013-07-26 11:55:01 -04001900 if (fenceObject->isFence() != GL_TRUE)
1901 {
1902 return gl::error(GL_INVALID_OPERATION);
1903 }
1904
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001905 fenceObject->finishFence();
1906 }
1907 }
1908 catch(std::bad_alloc&)
1909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001910 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001911 }
1912}
1913
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001914void __stdcall glFinish(void)
1915{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001916 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001917
1918 try
1919 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001920 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001921
1922 if (context)
1923 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001924 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001925 }
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.com4f39fd92010-03-08 20:26:45 +00001930 }
1931}
1932
1933void __stdcall glFlush(void)
1934{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001935 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001936
1937 try
1938 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001939 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001940
1941 if (context)
1942 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001943 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001944 }
1945 }
1946 catch(std::bad_alloc&)
1947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001948 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001949 }
1950}
1951
1952void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1953{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001954 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001955 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001956
1957 try
1958 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001959 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001961 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001962 }
1963
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001964 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001965
1966 if (context)
1967 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001968 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001969 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001970 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001971 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001972
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001973 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1974 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001975
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001976 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001977 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001978 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001979 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001980 }
1981 else
1982 {
1983 switch (attachment)
1984 {
1985 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001986 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001987 break;
1988 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001989 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001990 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001991 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001992 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1993 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001994 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001995 UNREACHABLE();
1996 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001997 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001998 }
1999 }
2000 }
2001 catch(std::bad_alloc&)
2002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002003 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002004 }
2005}
2006
2007void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2008{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002009 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002010 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002011
2012 try
2013 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002014 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002015 if (context)
2016 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002017 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002018 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002019 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002020 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002021 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04002022
2023 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002024 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002025 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002026 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002027 }
2028
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002029 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002030 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002031 textarget = GL_NONE;
2032 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002033
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002034 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002035
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002036 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002037 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002038 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04002039 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002040 }
2041 else
2042 {
2043 switch (attachment)
2044 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002045 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2046 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2047 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002048 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002049 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002050 }
2051 }
2052 catch(std::bad_alloc&)
2053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002054 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002055 }
2056}
2057
2058void __stdcall glFrontFace(GLenum mode)
2059{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002060 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002061
2062 try
2063 {
2064 switch (mode)
2065 {
2066 case GL_CW:
2067 case GL_CCW:
2068 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002069 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002070
2071 if (context)
2072 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002073 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002074 }
2075 }
2076 break;
2077 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002078 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002079 }
2080 }
2081 catch(std::bad_alloc&)
2082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002083 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002084 }
2085}
2086
2087void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2088{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002089 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002090
2091 try
2092 {
2093 if (n < 0)
2094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002095 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002096 }
2097
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002098 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002099
2100 if (context)
2101 {
2102 for (int i = 0; i < n; i++)
2103 {
2104 buffers[i] = context->createBuffer();
2105 }
2106 }
2107 }
2108 catch(std::bad_alloc&)
2109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002110 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002111 }
2112}
2113
2114void __stdcall glGenerateMipmap(GLenum target)
2115{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002116 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002117
2118 try
2119 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002120 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002121
2122 if (context)
2123 {
Jamie Madill35d15012013-10-07 10:46:37 -04002124 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002126 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002127 }
Geoff Langae4852a2013-06-05 15:00:34 -04002128
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002129 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04002130
2131 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002132 {
2133 return gl::error(GL_INVALID_OPERATION);
2134 }
2135
Geoff Lang005df412013-10-16 14:12:50 -04002136 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002137
Geoff Langae4852a2013-06-05 15:00:34 -04002138 // Internally, all texture formats are sized so checking if the format
2139 // is color renderable and filterable will not fail.
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002140 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2141 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Geoff Langae4852a2013-06-05 15:00:34 -04002142 !gl::IsColorRenderingSupported(internalFormat, context) ||
2143 !gl::IsTextureFilteringSupported(internalFormat, context))
2144 {
2145 return gl::error(GL_INVALID_OPERATION);
2146 }
2147
Jamie Madillc1f8b162013-10-07 10:46:38 -04002148 // Non-power of 2 ES2 check
2149 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2150 {
2151 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2152 return gl::error(GL_INVALID_OPERATION);
2153 }
2154
2155 // Cube completeness check
2156 if (target == GL_TEXTURE_CUBE_MAP)
2157 {
2158 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2159 if (!textureCube->isCubeComplete())
2160 {
2161 return gl::error(GL_INVALID_OPERATION);
2162 }
2163 }
2164
Geoff Langae4852a2013-06-05 15:00:34 -04002165 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002166 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002167 }
2168 catch(std::bad_alloc&)
2169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002170 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002171 }
2172}
2173
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002174void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2175{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002176 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002177
2178 try
2179 {
2180 if (n < 0)
2181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002182 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002183 }
2184
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002185 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002186
2187 if (context)
2188 {
2189 for (int i = 0; i < n; i++)
2190 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002191 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002192 }
2193 }
2194 }
2195 catch(std::bad_alloc&)
2196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002197 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002198 }
2199}
2200
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002201void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2202{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002203 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002204
2205 try
2206 {
2207 if (n < 0)
2208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002209 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002210 }
2211
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002212 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002213
2214 if (context)
2215 {
2216 for (int i = 0; i < n; i++)
2217 {
2218 framebuffers[i] = context->createFramebuffer();
2219 }
2220 }
2221 }
2222 catch(std::bad_alloc&)
2223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002224 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002225 }
2226}
2227
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002228void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2229{
2230 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2231
2232 try
2233 {
2234 if (n < 0)
2235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002236 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002237 }
2238
2239 gl::Context *context = gl::getNonLostContext();
2240
2241 if (context)
2242 {
2243 for (int i = 0; i < n; i++)
2244 {
2245 ids[i] = context->createQuery();
2246 }
2247 }
2248 }
2249 catch(std::bad_alloc&)
2250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002251 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002252 }
2253}
2254
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002255void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2256{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002257 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002258
2259 try
2260 {
2261 if (n < 0)
2262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002263 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002264 }
2265
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002266 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002267
2268 if (context)
2269 {
2270 for (int i = 0; i < n; i++)
2271 {
2272 renderbuffers[i] = context->createRenderbuffer();
2273 }
2274 }
2275 }
2276 catch(std::bad_alloc&)
2277 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002278 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002279 }
2280}
2281
2282void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2283{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002284 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002285
2286 try
2287 {
2288 if (n < 0)
2289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002290 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002291 }
2292
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002293 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002294
2295 if (context)
2296 {
2297 for (int i = 0; i < n; i++)
2298 {
2299 textures[i] = context->createTexture();
2300 }
2301 }
2302 }
2303 catch(std::bad_alloc&)
2304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002305 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002306 }
2307}
2308
daniel@transgaming.com85423182010-04-22 13:35:27 +00002309void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002310{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002311 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002312 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002313 program, index, bufsize, length, size, type, name);
2314
2315 try
2316 {
2317 if (bufsize < 0)
2318 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002319 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002320 }
2321
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002322 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002323
2324 if (context)
2325 {
2326 gl::Program *programObject = context->getProgram(program);
2327
2328 if (!programObject)
2329 {
2330 if (context->getShader(program))
2331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002332 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002333 }
2334 else
2335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002336 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002337 }
2338 }
2339
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002340 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002342 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002343 }
2344
2345 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2346 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002347 }
2348 catch(std::bad_alloc&)
2349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002350 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002351 }
2352}
2353
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002354void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002355{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002356 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002357 "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 +00002358 program, index, bufsize, length, size, type, name);
2359
2360 try
2361 {
2362 if (bufsize < 0)
2363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002364 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002365 }
2366
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002367 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002368
2369 if (context)
2370 {
2371 gl::Program *programObject = context->getProgram(program);
2372
2373 if (!programObject)
2374 {
2375 if (context->getShader(program))
2376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002377 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002378 }
2379 else
2380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002381 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002382 }
2383 }
2384
2385 if (index >= (GLuint)programObject->getActiveUniformCount())
2386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002387 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002388 }
2389
2390 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2391 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002392 }
2393 catch(std::bad_alloc&)
2394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002396 }
2397}
2398
2399void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002401 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 +00002402 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002403
2404 try
2405 {
2406 if (maxcount < 0)
2407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002408 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002409 }
2410
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002411 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002412
2413 if (context)
2414 {
2415 gl::Program *programObject = context->getProgram(program);
2416
2417 if (!programObject)
2418 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002419 if (context->getShader(program))
2420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002421 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002422 }
2423 else
2424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002425 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002426 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002427 }
2428
2429 return programObject->getAttachedShaders(maxcount, count, shaders);
2430 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002431 }
2432 catch(std::bad_alloc&)
2433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002434 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002435 }
2436}
2437
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002438int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002439{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002440 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002441
2442 try
2443 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002444 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002445
2446 if (context)
2447 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002448
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002449 gl::Program *programObject = context->getProgram(program);
2450
2451 if (!programObject)
2452 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002453 if (context->getShader(program))
2454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002455 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002456 }
2457 else
2458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002459 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002460 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002461 }
2462
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002463 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002464 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002466 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002467 }
2468
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002469 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002470 }
2471 }
2472 catch(std::bad_alloc&)
2473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002474 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475 }
2476
2477 return -1;
2478}
2479
2480void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2481{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002482 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002483
2484 try
2485 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002486 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002487
2488 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002489 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002490 GLenum nativeType;
2491 unsigned int numParams = 0;
2492 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2493 return gl::error(GL_INVALID_ENUM);
2494
2495 // pname is valid, but there are no parameters to return
2496 if (numParams == 0)
2497 return;
2498
2499 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002500 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002501 context->getBooleanv(pname, params);
2502 }
Jamie Madill55856b12014-01-02 13:59:50 -05002503 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002504 {
Jamie Madill55856b12014-01-02 13:59:50 -05002505 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002506 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002507 }
2508 }
2509 catch(std::bad_alloc&)
2510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002511 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002512 }
2513}
2514
2515void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2516{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002517 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 +00002518
2519 try
2520 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002521 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002522
2523 if (context)
2524 {
2525 gl::Buffer *buffer;
2526
2527 switch (target)
2528 {
2529 case GL_ARRAY_BUFFER:
2530 buffer = context->getArrayBuffer();
2531 break;
2532 case GL_ELEMENT_ARRAY_BUFFER:
2533 buffer = context->getElementArrayBuffer();
2534 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002535 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002536 }
2537
2538 if (!buffer)
2539 {
2540 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002541 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002542 }
2543
2544 switch (pname)
2545 {
2546 case GL_BUFFER_USAGE:
2547 *params = buffer->usage();
2548 break;
2549 case GL_BUFFER_SIZE:
2550 *params = buffer->size();
2551 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002552 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002553 }
2554 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002555 }
2556 catch(std::bad_alloc&)
2557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002558 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002559 }
2560}
2561
2562GLenum __stdcall glGetError(void)
2563{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002564 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002565
2566 gl::Context *context = gl::getContext();
2567
2568 if (context)
2569 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002570 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002571 }
2572
2573 return GL_NO_ERROR;
2574}
2575
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002576void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2577{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002578 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002579
2580 try
2581 {
2582
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002583 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002584
2585 if (context)
2586 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002587 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002588
2589 if (fenceObject == NULL)
2590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002591 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002592 }
2593
Jamie Madillfb9a7402013-07-26 11:55:01 -04002594 if (fenceObject->isFence() != GL_TRUE)
2595 {
2596 return gl::error(GL_INVALID_OPERATION);
2597 }
2598
2599 switch (pname)
2600 {
2601 case GL_FENCE_STATUS_NV:
2602 case GL_FENCE_CONDITION_NV:
2603 break;
2604
2605 default: return gl::error(GL_INVALID_ENUM);
2606 }
2607
2608 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002609 }
2610 }
2611 catch(std::bad_alloc&)
2612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002613 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002614 }
2615}
2616
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002617void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2618{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002619 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002620
2621 try
2622 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002623 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002624
2625 if (context)
2626 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002627 GLenum nativeType;
2628 unsigned int numParams = 0;
2629 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2630 return gl::error(GL_INVALID_ENUM);
2631
2632 // pname is valid, but that there are no parameters to return.
2633 if (numParams == 0)
2634 return;
2635
2636 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002637 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002638 context->getFloatv(pname, params);
2639 }
Jamie Madill55856b12014-01-02 13:59:50 -05002640 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002641 {
Jamie Madill55856b12014-01-02 13:59:50 -05002642 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002643 }
2644 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002645 }
2646 catch(std::bad_alloc&)
2647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002648 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002649 }
2650}
2651
2652void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2653{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002654 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 +00002655 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002656
2657 try
2658 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002659 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002660
2661 if (context)
2662 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002663 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002665 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002666 }
2667
Geoff Lang646559f2013-08-15 11:08:15 -04002668 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002669 {
Geoff Lang646559f2013-08-15 11:08:15 -04002670 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2671 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2672 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2673 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2674 break;
2675 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2676 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2677 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2678 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2679 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2680 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2681 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2682 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2683 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2684 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002685 {
Geoff Lang646559f2013-08-15 11:08:15 -04002686 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002687 }
Geoff Lang646559f2013-08-15 11:08:15 -04002688 default:
2689 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002690 }
Geoff Lang646559f2013-08-15 11:08:15 -04002691
2692 // Determine if the attachment is a valid enum
2693 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002694 {
Geoff Lang646559f2013-08-15 11:08:15 -04002695 case GL_BACK:
2696 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002697 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002698 case GL_STENCIL:
2699 case GL_DEPTH_STENCIL_ATTACHMENT:
2700 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002701 {
Geoff Lang646559f2013-08-15 11:08:15 -04002702 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002703 }
Geoff Lang646559f2013-08-15 11:08:15 -04002704 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002705
Geoff Lang646559f2013-08-15 11:08:15 -04002706 case GL_DEPTH_ATTACHMENT:
2707 case GL_STENCIL_ATTACHMENT:
2708 break;
2709
2710 default:
2711 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2712 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2713 {
2714 return gl::error(GL_INVALID_ENUM);
2715 }
2716 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002717 }
2718
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002719 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2720 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002721 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2722
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002723 GLenum attachmentType;
2724 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002725 GLuint attachmentLevel;
2726 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002727 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002728
Geoff Lang646559f2013-08-15 11:08:15 -04002729 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002730 {
Geoff Lang646559f2013-08-15 11:08:15 -04002731 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002732 {
Geoff Lang646559f2013-08-15 11:08:15 -04002733 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002734 }
2735
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002736 switch (attachment)
2737 {
Geoff Lang646559f2013-08-15 11:08:15 -04002738 case GL_BACK:
2739 attachmentType = framebuffer->getColorbufferType(0);
2740 attachmentHandle = framebuffer->getColorbufferHandle(0);
2741 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2742 attachmentLayer = framebuffer->getColorbufferLayer(0);
2743 renderbuffer = framebuffer->getColorbuffer(0);
2744 break;
2745 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002746 attachmentType = framebuffer->getDepthbufferType();
2747 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002748 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2749 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002750 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002751 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002752 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002753 attachmentType = framebuffer->getStencilbufferType();
2754 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002755 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2756 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002757 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002758 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002759 default:
2760 return gl::error(GL_INVALID_OPERATION);
2761 }
2762 }
2763 else
2764 {
2765 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2766 {
2767 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2768 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2769 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2770 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2771 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2772 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2773 }
2774 else
2775 {
2776 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002777 {
Geoff Lang646559f2013-08-15 11:08:15 -04002778 case GL_DEPTH_ATTACHMENT:
2779 attachmentType = framebuffer->getDepthbufferType();
2780 attachmentHandle = framebuffer->getDepthbufferHandle();
2781 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2782 attachmentLayer = framebuffer->getDepthbufferLayer();
2783 renderbuffer = framebuffer->getDepthbuffer();
2784 break;
2785 case GL_STENCIL_ATTACHMENT:
2786 attachmentType = framebuffer->getStencilbufferType();
2787 attachmentHandle = framebuffer->getStencilbufferHandle();
2788 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2789 attachmentLayer = framebuffer->getStencilbufferLayer();
2790 renderbuffer = framebuffer->getStencilbuffer();
2791 break;
2792 case GL_DEPTH_STENCIL_ATTACHMENT:
2793 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2794 {
2795 return gl::error(GL_INVALID_OPERATION);
2796 }
2797 attachmentType = framebuffer->getDepthStencilbufferType();
2798 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2799 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2800 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2801 renderbuffer = framebuffer->getDepthStencilBuffer();
2802 break;
2803 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002804 return gl::error(GL_INVALID_OPERATION);
2805 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002806 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002807 }
2808
2809 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002810 if (framebufferHandle == 0)
2811 {
2812 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2813 }
2814 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002815 {
2816 attachmentObjectType = attachmentType;
2817 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002818 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002819 {
2820 attachmentObjectType = GL_TEXTURE;
2821 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002822 else
2823 {
2824 UNREACHABLE();
2825 return;
2826 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002827
Geoff Lang646559f2013-08-15 11:08:15 -04002828 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002829 {
Geoff Lang646559f2013-08-15 11:08:15 -04002830 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2831 // is NONE, then querying any other pname will generate INVALID_ENUM.
2832
2833 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2834 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2835 // INVALID_OPERATION for all other pnames
2836
2837 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002838 {
Geoff Lang646559f2013-08-15 11:08:15 -04002839 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2840 *params = attachmentObjectType;
2841 break;
2842
2843 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2844 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002845 {
Geoff Lang646559f2013-08-15 11:08:15 -04002846 return gl::error(GL_INVALID_ENUM);
2847 }
2848 *params = 0;
2849 break;
2850
2851 default:
2852 if (context->getClientVersion() < 3)
2853 {
2854 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002855 }
2856 else
2857 {
Geoff Lang646559f2013-08-15 11:08:15 -04002858 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002859 }
2860 }
Geoff Lang646559f2013-08-15 11:08:15 -04002861 }
2862 else
2863 {
2864 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2865 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2866 ASSERT(renderbuffer != NULL);
2867
2868 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002869 {
Geoff Lang646559f2013-08-15 11:08:15 -04002870 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2871 *params = attachmentObjectType;
2872 break;
2873
2874 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2875 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2876 {
2877 return gl::error(GL_INVALID_ENUM);
2878 }
2879 *params = attachmentHandle;
2880 break;
2881
2882 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2883 if (attachmentObjectType != GL_TEXTURE)
2884 {
2885 return gl::error(GL_INVALID_ENUM);
2886 }
2887 *params = attachmentLevel;
2888 break;
2889
2890 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2891 if (attachmentObjectType != GL_TEXTURE)
2892 {
2893 return gl::error(GL_INVALID_ENUM);
2894 }
2895 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2896 break;
2897
2898 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2899 *params = renderbuffer->getRedSize();
2900 break;
2901
2902 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2903 *params = renderbuffer->getGreenSize();
2904 break;
2905
2906 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2907 *params = renderbuffer->getBlueSize();
2908 break;
2909
2910 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2911 *params = renderbuffer->getAlphaSize();
2912 break;
2913
2914 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2915 *params = renderbuffer->getDepthSize();
2916 break;
2917
2918 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2919 *params = renderbuffer->getStencilSize();
2920 break;
2921
2922 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2923 if (attachment == GL_DEPTH_STENCIL)
2924 {
2925 gl::error(GL_INVALID_OPERATION);
2926 }
2927 *params = renderbuffer->getComponentType();
2928 break;
2929
2930 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2931 *params = renderbuffer->getColorEncoding();
2932 break;
2933
2934 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2935 if (attachmentObjectType != GL_TEXTURE)
2936 {
2937 return gl::error(GL_INVALID_ENUM);
2938 }
2939 *params = attachmentLayer;
2940 break;
2941
2942 default:
2943 UNREACHABLE();
2944 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002945 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002946 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002947 }
2948 }
2949 catch(std::bad_alloc&)
2950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002951 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002952 }
2953}
2954
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002955GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2956{
2957 EVENT("()");
2958
2959 try
2960 {
2961 gl::Context *context = gl::getContext();
2962
2963 if (context)
2964 {
2965 return context->getResetStatus();
2966 }
2967
2968 return GL_NO_ERROR;
2969 }
2970 catch(std::bad_alloc&)
2971 {
2972 return GL_OUT_OF_MEMORY;
2973 }
2974}
2975
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002976void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2977{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002978 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002979
2980 try
2981 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002982 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002983
2984 if (context)
2985 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002986 GLenum nativeType;
2987 unsigned int numParams = 0;
2988 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2989 return gl::error(GL_INVALID_ENUM);
2990
2991 // pname is valid, but there are no parameters to return
2992 if (numParams == 0)
2993 return;
2994
2995 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002996 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002997 context->getIntegerv(pname, params);
2998 }
Jamie Madill55856b12014-01-02 13:59:50 -05002999 else
Jamie Madill79f2f452013-12-19 11:13:02 -05003000 {
Jamie Madill55856b12014-01-02 13:59:50 -05003001 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003002 }
3003 }
3004 }
3005 catch(std::bad_alloc&)
3006 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003007 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003008 }
3009}
3010
3011void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3012{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003013 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003014
3015 try
3016 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003017 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003018
3019 if (context)
3020 {
3021 gl::Program *programObject = context->getProgram(program);
3022
3023 if (!programObject)
3024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003025 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003026 }
3027
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003028 if (context->getClientVersion() < 3)
3029 {
3030 switch (pname)
3031 {
3032 case GL_ACTIVE_UNIFORM_BLOCKS:
3033 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3034 return gl::error(GL_INVALID_ENUM);
3035 }
3036 }
3037
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003038 switch (pname)
3039 {
3040 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003041 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003042 return;
3043 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003044 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003045 return;
3046 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003047 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003048 return;
3049 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003050 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003051 return;
3052 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003053 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003054 return;
3055 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003056 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003057 return;
3058 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003059 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003060 return;
3061 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003062 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003063 return;
3064 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003065 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003066 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003067 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003068 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003069 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003070 case GL_ACTIVE_UNIFORM_BLOCKS:
3071 *params = programObject->getActiveUniformBlockCount();
3072 return;
3073 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3074 *params = programObject->getActiveUniformBlockMaxLength();
3075 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003076 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003077 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003078 }
3079 }
3080 }
3081 catch(std::bad_alloc&)
3082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003083 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003084 }
3085}
3086
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003087void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003088{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003089 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 +00003090 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003091
3092 try
3093 {
3094 if (bufsize < 0)
3095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003096 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003097 }
3098
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003099 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003100
3101 if (context)
3102 {
3103 gl::Program *programObject = context->getProgram(program);
3104
3105 if (!programObject)
3106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003107 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003108 }
3109
3110 programObject->getInfoLog(bufsize, length, infolog);
3111 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003112 }
3113 catch(std::bad_alloc&)
3114 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003115 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003116 }
3117}
3118
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003119void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3120{
3121 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3122
3123 try
3124 {
3125 switch (pname)
3126 {
3127 case GL_CURRENT_QUERY_EXT:
3128 break;
3129 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003130 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003131 }
3132
3133 gl::Context *context = gl::getNonLostContext();
3134
3135 if (context)
3136 {
3137 params[0] = context->getActiveQuery(target);
3138 }
3139 }
3140 catch(std::bad_alloc&)
3141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003142 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003143 }
3144}
3145
3146void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3147{
3148 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3149
3150 try
3151 {
3152 switch (pname)
3153 {
3154 case GL_QUERY_RESULT_EXT:
3155 case GL_QUERY_RESULT_AVAILABLE_EXT:
3156 break;
3157 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003158 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003159 }
3160 gl::Context *context = gl::getNonLostContext();
3161
3162 if (context)
3163 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003164 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3165
3166 if (!queryObject)
3167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003168 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003169 }
3170
3171 if (context->getActiveQuery(queryObject->getType()) == id)
3172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003173 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003174 }
3175
3176 switch(pname)
3177 {
3178 case GL_QUERY_RESULT_EXT:
3179 params[0] = queryObject->getResult();
3180 break;
3181 case GL_QUERY_RESULT_AVAILABLE_EXT:
3182 params[0] = queryObject->isResultAvailable();
3183 break;
3184 default:
3185 ASSERT(false);
3186 }
3187 }
3188 }
3189 catch(std::bad_alloc&)
3190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003191 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003192 }
3193}
3194
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003195void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3196{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003197 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 +00003198
3199 try
3200 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003201 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003202
3203 if (context)
3204 {
3205 if (target != GL_RENDERBUFFER)
3206 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003207 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003208 }
3209
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003210 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003212 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003213 }
3214
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003215 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003216
3217 switch (pname)
3218 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003219 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3220 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3221 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3222 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3223 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3224 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3225 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3226 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3227 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003228 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003229 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003230 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003231 *params = renderbuffer->getSamples();
3232 }
3233 else
3234 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003235 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003236 }
3237 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003238 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003239 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003240 }
3241 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003242 }
3243 catch(std::bad_alloc&)
3244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003245 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003246 }
3247}
3248
3249void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3250{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003251 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003252
3253 try
3254 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003255 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003256
3257 if (context)
3258 {
3259 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003260
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003261 if (!shaderObject)
3262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003263 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003264 }
3265
3266 switch (pname)
3267 {
3268 case GL_SHADER_TYPE:
3269 *params = shaderObject->getType();
3270 return;
3271 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003272 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003273 return;
3274 case GL_COMPILE_STATUS:
3275 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3276 return;
3277 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003278 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003279 return;
3280 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003281 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003282 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003283 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3284 *params = shaderObject->getTranslatedSourceLength();
3285 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003286 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003287 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003288 }
3289 }
3290 }
3291 catch(std::bad_alloc&)
3292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003293 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003294 }
3295}
3296
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003297void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003298{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003299 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 +00003300 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003301
3302 try
3303 {
3304 if (bufsize < 0)
3305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003306 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003307 }
3308
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003309 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003310
3311 if (context)
3312 {
3313 gl::Shader *shaderObject = context->getShader(shader);
3314
3315 if (!shaderObject)
3316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003317 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003318 }
3319
3320 shaderObject->getInfoLog(bufsize, length, infolog);
3321 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003322 }
3323 catch(std::bad_alloc&)
3324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003325 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003326 }
3327}
3328
3329void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3330{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003331 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 +00003332 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003333
3334 try
3335 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003336 switch (shadertype)
3337 {
3338 case GL_VERTEX_SHADER:
3339 case GL_FRAGMENT_SHADER:
3340 break;
3341 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003342 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003343 }
3344
3345 switch (precisiontype)
3346 {
3347 case GL_LOW_FLOAT:
3348 case GL_MEDIUM_FLOAT:
3349 case GL_HIGH_FLOAT:
3350 // Assume IEEE 754 precision
3351 range[0] = 127;
3352 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003353 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003354 break;
3355 case GL_LOW_INT:
3356 case GL_MEDIUM_INT:
3357 case GL_HIGH_INT:
3358 // Some (most) hardware only supports single-precision floating-point numbers,
3359 // which can accurately represent integers up to +/-16777216
3360 range[0] = 24;
3361 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003362 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003363 break;
3364 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003365 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003366 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003367 }
3368 catch(std::bad_alloc&)
3369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003370 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003371 }
3372}
3373
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003374void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003376 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 +00003377 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003378
3379 try
3380 {
3381 if (bufsize < 0)
3382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003383 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003384 }
3385
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003386 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003387
3388 if (context)
3389 {
3390 gl::Shader *shaderObject = context->getShader(shader);
3391
3392 if (!shaderObject)
3393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003394 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003395 }
3396
3397 shaderObject->getSource(bufsize, length, source);
3398 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003399 }
3400 catch(std::bad_alloc&)
3401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003402 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003403 }
3404}
3405
zmo@google.coma574f782011-10-03 21:45:23 +00003406void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3407{
3408 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3409 shader, bufsize, length, source);
3410
3411 try
3412 {
3413 if (bufsize < 0)
3414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003415 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003416 }
3417
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003418 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003419
3420 if (context)
3421 {
3422 gl::Shader *shaderObject = context->getShader(shader);
3423
3424 if (!shaderObject)
3425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003426 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003427 }
3428
3429 shaderObject->getTranslatedSource(bufsize, length, source);
3430 }
3431 }
3432 catch(std::bad_alloc&)
3433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003434 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003435 }
3436}
3437
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003438const GLubyte* __stdcall glGetString(GLenum name)
3439{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003440 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003441
3442 try
3443 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003444 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003445
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003446 switch (name)
3447 {
3448 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003449 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003450 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003451 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003452 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003453 if (context->getClientVersion() == 2)
3454 {
3455 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
3456 }
3457 else
3458 {
3459 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
3460 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003461 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003462 if (context->getClientVersion() == 2)
3463 {
3464 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
3465 }
3466 else
3467 {
3468 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
3469 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003470 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003471 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003472 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003473 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003474 }
3475 }
3476 catch(std::bad_alloc&)
3477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003478 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003479 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003480}
3481
3482void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3483{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003484 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 +00003485
3486 try
3487 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003488 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003489
3490 if (context)
3491 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003492 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003493
Jamie Madillfb8a8302013-07-03 14:24:12 -04003494 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003496 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003497 }
3498
3499 switch (pname)
3500 {
3501 case GL_TEXTURE_MAG_FILTER:
3502 *params = (GLfloat)texture->getMagFilter();
3503 break;
3504 case GL_TEXTURE_MIN_FILTER:
3505 *params = (GLfloat)texture->getMinFilter();
3506 break;
3507 case GL_TEXTURE_WRAP_S:
3508 *params = (GLfloat)texture->getWrapS();
3509 break;
3510 case GL_TEXTURE_WRAP_T:
3511 *params = (GLfloat)texture->getWrapT();
3512 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003513 case GL_TEXTURE_WRAP_R:
3514 if (context->getClientVersion() < 3)
3515 {
3516 return gl::error(GL_INVALID_ENUM);
3517 }
3518 *params = (GLfloat)texture->getWrapR();
3519 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003520 case GL_TEXTURE_IMMUTABLE_FORMAT:
3521 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003522 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3523 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003524 case GL_TEXTURE_IMMUTABLE_LEVELS:
3525 if (context->getClientVersion() < 3)
3526 {
3527 return gl::error(GL_INVALID_ENUM);
3528 }
Jamie Madill51a94372013-10-24 17:49:43 -04003529 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003530 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003531 case GL_TEXTURE_USAGE_ANGLE:
3532 *params = (GLfloat)texture->getUsage();
3533 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003534 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3535 if (!context->supportsTextureFilterAnisotropy())
3536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003537 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003538 }
3539 *params = (GLfloat)texture->getMaxAnisotropy();
3540 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003541 case GL_TEXTURE_SWIZZLE_R:
3542 if (context->getClientVersion() < 3)
3543 {
3544 return gl::error(GL_INVALID_ENUM);
3545 }
3546 *params = (GLfloat)texture->getSwizzleRed();
3547 break;
3548 case GL_TEXTURE_SWIZZLE_G:
3549 if (context->getClientVersion() < 3)
3550 {
3551 return gl::error(GL_INVALID_ENUM);
3552 }
3553 *params = (GLfloat)texture->getSwizzleGreen();
3554 break;
3555 case GL_TEXTURE_SWIZZLE_B:
3556 if (context->getClientVersion() < 3)
3557 {
3558 return gl::error(GL_INVALID_ENUM);
3559 }
3560 *params = (GLfloat)texture->getSwizzleBlue();
3561 break;
3562 case GL_TEXTURE_SWIZZLE_A:
3563 if (context->getClientVersion() < 3)
3564 {
3565 return gl::error(GL_INVALID_ENUM);
3566 }
3567 *params = (GLfloat)texture->getSwizzleAlpha();
3568 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003569 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003570 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003571 }
3572 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003573 }
3574 catch(std::bad_alloc&)
3575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003576 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003577 }
3578}
3579
3580void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3581{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003582 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 +00003583
3584 try
3585 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003586 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003587
3588 if (context)
3589 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003590 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003591
Jamie Madillfb8a8302013-07-03 14:24:12 -04003592 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003594 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003595 }
3596
3597 switch (pname)
3598 {
3599 case GL_TEXTURE_MAG_FILTER:
3600 *params = texture->getMagFilter();
3601 break;
3602 case GL_TEXTURE_MIN_FILTER:
3603 *params = texture->getMinFilter();
3604 break;
3605 case GL_TEXTURE_WRAP_S:
3606 *params = texture->getWrapS();
3607 break;
3608 case GL_TEXTURE_WRAP_T:
3609 *params = texture->getWrapT();
3610 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003611 case GL_TEXTURE_WRAP_R:
3612 if (context->getClientVersion() < 3)
3613 {
3614 return gl::error(GL_INVALID_ENUM);
3615 }
3616 *params = texture->getWrapR();
3617 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003618 case GL_TEXTURE_IMMUTABLE_FORMAT:
3619 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003620 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3621 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003622 case GL_TEXTURE_IMMUTABLE_LEVELS:
3623 if (context->getClientVersion() < 3)
3624 {
3625 return gl::error(GL_INVALID_ENUM);
3626 }
Jamie Madill51a94372013-10-24 17:49:43 -04003627 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003628 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003629 case GL_TEXTURE_USAGE_ANGLE:
3630 *params = texture->getUsage();
3631 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003632 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3633 if (!context->supportsTextureFilterAnisotropy())
3634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003635 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003636 }
3637 *params = (GLint)texture->getMaxAnisotropy();
3638 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003639 case GL_TEXTURE_SWIZZLE_R:
3640 if (context->getClientVersion() < 3)
3641 {
3642 return gl::error(GL_INVALID_ENUM);
3643 }
3644 *params = texture->getSwizzleRed();
3645 break;
3646 case GL_TEXTURE_SWIZZLE_G:
3647 if (context->getClientVersion() < 3)
3648 {
3649 return gl::error(GL_INVALID_ENUM);
3650 }
3651 *params = texture->getSwizzleGreen();
3652 break;
3653 case GL_TEXTURE_SWIZZLE_B:
3654 if (context->getClientVersion() < 3)
3655 {
3656 return gl::error(GL_INVALID_ENUM);
3657 }
3658 *params = texture->getSwizzleBlue();
3659 break;
3660 case GL_TEXTURE_SWIZZLE_A:
3661 if (context->getClientVersion() < 3)
3662 {
3663 return gl::error(GL_INVALID_ENUM);
3664 }
3665 *params = texture->getSwizzleAlpha();
3666 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003667
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003668 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003669 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003670 }
3671 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003672 }
3673 catch(std::bad_alloc&)
3674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003675 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003676 }
3677}
3678
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003679void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3680{
3681 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3682 program, location, bufSize, params);
3683
3684 try
3685 {
3686 if (bufSize < 0)
3687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003688 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003689 }
3690
3691 gl::Context *context = gl::getNonLostContext();
3692
3693 if (context)
3694 {
3695 if (program == 0)
3696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003697 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003698 }
3699
3700 gl::Program *programObject = context->getProgram(program);
3701
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003702 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003704 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003705 }
3706
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003707 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3708 if (!programBinary)
3709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003710 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003711 }
3712
3713 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003715 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003716 }
3717 }
3718 }
3719 catch(std::bad_alloc&)
3720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003722 }
3723}
3724
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003725void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003727 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003728
3729 try
3730 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003731 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003732
3733 if (context)
3734 {
3735 if (program == 0)
3736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003737 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003738 }
3739
3740 gl::Program *programObject = context->getProgram(program);
3741
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003742 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003744 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003745 }
3746
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003747 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3748 if (!programBinary)
3749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003750 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003751 }
3752
3753 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003755 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003756 }
3757 }
3758 }
3759 catch(std::bad_alloc&)
3760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003761 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003762 }
3763}
3764
3765void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3766{
3767 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3768 program, location, bufSize, params);
3769
3770 try
3771 {
3772 if (bufSize < 0)
3773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003774 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003775 }
3776
3777 gl::Context *context = gl::getNonLostContext();
3778
3779 if (context)
3780 {
3781 if (program == 0)
3782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003783 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003784 }
3785
3786 gl::Program *programObject = context->getProgram(program);
3787
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003788 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003790 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003791 }
3792
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003793 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3794 if (!programBinary)
3795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003796 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003797 }
3798
3799 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003801 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003802 }
3803 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003804 }
3805 catch(std::bad_alloc&)
3806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003807 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003808 }
3809}
3810
3811void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3812{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003813 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003814
3815 try
3816 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003817 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003818
3819 if (context)
3820 {
3821 if (program == 0)
3822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003823 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003824 }
3825
3826 gl::Program *programObject = context->getProgram(program);
3827
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003828 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003830 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003831 }
3832
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003833 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3834 if (!programBinary)
3835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003836 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003837 }
3838
3839 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003840 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003841 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003842 }
3843 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003844 }
3845 catch(std::bad_alloc&)
3846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003847 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003848 }
3849}
3850
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003851int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003852{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003853 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003854
3855 try
3856 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003857 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003858
3859 if (strstr(name, "gl_") == name)
3860 {
3861 return -1;
3862 }
3863
3864 if (context)
3865 {
3866 gl::Program *programObject = context->getProgram(program);
3867
3868 if (!programObject)
3869 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003870 if (context->getShader(program))
3871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003872 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003873 }
3874 else
3875 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003876 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003877 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003878 }
3879
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003880 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003881 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003883 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003884 }
3885
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003886 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003887 }
3888 }
3889 catch(std::bad_alloc&)
3890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003891 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003892 }
3893
3894 return -1;
3895}
3896
3897void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3898{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003899 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003900
3901 try
3902 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003903 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003904
daniel@transgaming.come0078962010-04-15 20:45:08 +00003905 if (context)
3906 {
3907 if (index >= gl::MAX_VERTEX_ATTRIBS)
3908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003909 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003910 }
3911
daniel@transgaming.com83921382011-01-08 05:46:00 +00003912 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003913
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003914 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003915 {
Jamie Madillaff71502013-07-02 11:57:05 -04003916 return;
3917 }
3918
3919 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3920 {
3921 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3922 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003923 {
Jamie Madillaff71502013-07-02 11:57:05 -04003924 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003925 }
Jamie Madillaff71502013-07-02 11:57:05 -04003926 }
3927 else
3928 {
3929 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003930 }
3931 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003932 }
3933 catch(std::bad_alloc&)
3934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003935 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003936 }
3937}
3938
3939void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3940{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003941 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003942
3943 try
3944 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003945 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003946
daniel@transgaming.come0078962010-04-15 20:45:08 +00003947 if (context)
3948 {
3949 if (index >= gl::MAX_VERTEX_ATTRIBS)
3950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003951 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003952 }
3953
daniel@transgaming.com83921382011-01-08 05:46:00 +00003954 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003955
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003956 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003957 {
Jamie Madillaff71502013-07-02 11:57:05 -04003958 return;
3959 }
3960
3961 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3962 {
3963 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3964 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003965 {
Jamie Madillaff71502013-07-02 11:57:05 -04003966 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003967 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003968 }
Jamie Madillaff71502013-07-02 11:57:05 -04003969 }
3970 else
3971 {
3972 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003973 }
3974 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003975 }
3976 catch(std::bad_alloc&)
3977 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003978 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003979 }
3980}
3981
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003982void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003983{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003984 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003985
3986 try
3987 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003988 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003989
daniel@transgaming.come0078962010-04-15 20:45:08 +00003990 if (context)
3991 {
3992 if (index >= gl::MAX_VERTEX_ATTRIBS)
3993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003994 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003995 }
3996
3997 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3998 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003999 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004000 }
4001
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004002 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004003 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004004 }
4005 catch(std::bad_alloc&)
4006 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004007 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004008 }
4009}
4010
4011void __stdcall glHint(GLenum target, GLenum mode)
4012{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004013 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004014
4015 try
4016 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004017 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004018 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004019 case GL_FASTEST:
4020 case GL_NICEST:
4021 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004022 break;
4023 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004024 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004025 }
4026
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004027 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004028 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004029 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004030 case GL_GENERATE_MIPMAP_HINT:
4031 if (context) context->setGenerateMipmapHint(mode);
4032 break;
4033 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4034 if (context) context->setFragmentShaderDerivativeHint(mode);
4035 break;
4036 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004037 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004038 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004039 }
4040 catch(std::bad_alloc&)
4041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004042 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004043 }
4044}
4045
4046GLboolean __stdcall glIsBuffer(GLuint buffer)
4047{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004048 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004049
4050 try
4051 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004052 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004053
4054 if (context && buffer)
4055 {
4056 gl::Buffer *bufferObject = context->getBuffer(buffer);
4057
4058 if (bufferObject)
4059 {
4060 return GL_TRUE;
4061 }
4062 }
4063 }
4064 catch(std::bad_alloc&)
4065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004066 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004067 }
4068
4069 return GL_FALSE;
4070}
4071
4072GLboolean __stdcall glIsEnabled(GLenum cap)
4073{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004074 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004075
4076 try
4077 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004078 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004079
4080 if (context)
4081 {
Geoff Lang0550d032014-01-30 11:29:07 -05004082 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004083 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004084 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004085 }
Geoff Lang0550d032014-01-30 11:29:07 -05004086
4087 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004088 }
4089 }
4090 catch(std::bad_alloc&)
4091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004092 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004093 }
4094
4095 return false;
4096}
4097
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004098GLboolean __stdcall glIsFenceNV(GLuint fence)
4099{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004100 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004101
4102 try
4103 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004104 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004105
4106 if (context)
4107 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004108 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004109
4110 if (fenceObject == NULL)
4111 {
4112 return GL_FALSE;
4113 }
4114
4115 return fenceObject->isFence();
4116 }
4117 }
4118 catch(std::bad_alloc&)
4119 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004120 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004121 }
4122
4123 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004124}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004125
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004126GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4127{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004128 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004129
4130 try
4131 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004132 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004133
4134 if (context && framebuffer)
4135 {
4136 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4137
4138 if (framebufferObject)
4139 {
4140 return GL_TRUE;
4141 }
4142 }
4143 }
4144 catch(std::bad_alloc&)
4145 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004146 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004147 }
4148
4149 return GL_FALSE;
4150}
4151
4152GLboolean __stdcall glIsProgram(GLuint program)
4153{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004154 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004155
4156 try
4157 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004158 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004159
4160 if (context && program)
4161 {
4162 gl::Program *programObject = context->getProgram(program);
4163
4164 if (programObject)
4165 {
4166 return GL_TRUE;
4167 }
4168 }
4169 }
4170 catch(std::bad_alloc&)
4171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004172 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004173 }
4174
4175 return GL_FALSE;
4176}
4177
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004178GLboolean __stdcall glIsQueryEXT(GLuint id)
4179{
4180 EVENT("(GLuint id = %d)", id);
4181
4182 try
4183 {
4184 if (id == 0)
4185 {
4186 return GL_FALSE;
4187 }
4188
4189 gl::Context *context = gl::getNonLostContext();
4190
4191 if (context)
4192 {
4193 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4194
4195 if (queryObject)
4196 {
4197 return GL_TRUE;
4198 }
4199 }
4200 }
4201 catch(std::bad_alloc&)
4202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004203 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004204 }
4205
4206 return GL_FALSE;
4207}
4208
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004209GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4210{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004211 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004212
4213 try
4214 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004215 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004216
4217 if (context && renderbuffer)
4218 {
4219 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4220
4221 if (renderbufferObject)
4222 {
4223 return GL_TRUE;
4224 }
4225 }
4226 }
4227 catch(std::bad_alloc&)
4228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004229 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004230 }
4231
4232 return GL_FALSE;
4233}
4234
4235GLboolean __stdcall glIsShader(GLuint shader)
4236{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004237 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004238
4239 try
4240 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004241 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004242
4243 if (context && shader)
4244 {
4245 gl::Shader *shaderObject = context->getShader(shader);
4246
4247 if (shaderObject)
4248 {
4249 return GL_TRUE;
4250 }
4251 }
4252 }
4253 catch(std::bad_alloc&)
4254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004255 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004256 }
4257
4258 return GL_FALSE;
4259}
4260
4261GLboolean __stdcall glIsTexture(GLuint texture)
4262{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004263 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004264
4265 try
4266 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004268
4269 if (context && texture)
4270 {
4271 gl::Texture *textureObject = context->getTexture(texture);
4272
4273 if (textureObject)
4274 {
4275 return GL_TRUE;
4276 }
4277 }
4278 }
4279 catch(std::bad_alloc&)
4280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004281 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004282 }
4283
4284 return GL_FALSE;
4285}
4286
4287void __stdcall glLineWidth(GLfloat width)
4288{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004289 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004290
4291 try
4292 {
4293 if (width <= 0.0f)
4294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004295 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004296 }
4297
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004298 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004299
4300 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004301 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004302 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004303 }
4304 }
4305 catch(std::bad_alloc&)
4306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004307 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004308 }
4309}
4310
4311void __stdcall glLinkProgram(GLuint program)
4312{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004313 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004314
4315 try
4316 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004317 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004318
4319 if (context)
4320 {
4321 gl::Program *programObject = context->getProgram(program);
4322
4323 if (!programObject)
4324 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004325 if (context->getShader(program))
4326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004327 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004328 }
4329 else
4330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004331 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004332 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004333 }
4334
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004335 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004336 }
4337 }
4338 catch(std::bad_alloc&)
4339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004340 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004341 }
4342}
4343
4344void __stdcall glPixelStorei(GLenum pname, GLint param)
4345{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004346 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004347
4348 try
4349 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004350 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004351
4352 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004353 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004354 switch (pname)
4355 {
4356 case GL_UNPACK_ALIGNMENT:
4357 if (param != 1 && param != 2 && param != 4 && param != 8)
4358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004359 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004360 }
4361
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004362 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004363 break;
4364
4365 case GL_PACK_ALIGNMENT:
4366 if (param != 1 && param != 2 && param != 4 && param != 8)
4367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004368 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004369 }
4370
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004371 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004372 break;
4373
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004374 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4375 context->setPackReverseRowOrder(param != 0);
4376 break;
4377
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004378 case GL_UNPACK_IMAGE_HEIGHT:
4379 case GL_UNPACK_SKIP_IMAGES:
4380 case GL_UNPACK_ROW_LENGTH:
4381 case GL_UNPACK_SKIP_ROWS:
4382 case GL_UNPACK_SKIP_PIXELS:
4383 case GL_PACK_ROW_LENGTH:
4384 case GL_PACK_SKIP_ROWS:
4385 case GL_PACK_SKIP_PIXELS:
4386 if (context->getClientVersion() < 3)
4387 {
4388 return gl::error(GL_INVALID_ENUM);
4389 }
4390 UNIMPLEMENTED();
4391 break;
4392
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004393 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004394 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004395 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004396 }
4397 }
4398 catch(std::bad_alloc&)
4399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004400 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004401 }
4402}
4403
4404void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4405{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004406 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004407
4408 try
4409 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004410 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004411
4412 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004413 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004414 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004415 }
4416 }
4417 catch(std::bad_alloc&)
4418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004419 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004420 }
4421}
4422
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004423void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4424 GLenum format, GLenum type, GLsizei bufSize,
4425 GLvoid *data)
4426{
4427 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4428 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4429 x, y, width, height, format, type, bufSize, data);
4430
4431 try
4432 {
4433 if (width < 0 || height < 0 || bufSize < 0)
4434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004435 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004436 }
4437
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004438 gl::Context *context = gl::getNonLostContext();
4439
4440 if (context)
4441 {
Geoff Lang005df412013-10-16 14:12:50 -04004442 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004443
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004444 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4445 // and attempting to read back if that's the case is an error. The error will be registered
4446 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004447 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004448 return;
4449
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004450 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4451 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004452
4453 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004455 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004456 }
4457
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004458 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4459 }
4460 }
4461 catch(std::bad_alloc&)
4462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004463 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004464 }
4465}
4466
4467void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4468 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004469{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004470 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004471 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004472 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004473
4474 try
4475 {
4476 if (width < 0 || height < 0)
4477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004478 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004479 }
4480
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004481 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004482
4483 if (context)
4484 {
Geoff Lang005df412013-10-16 14:12:50 -04004485 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004486
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004487 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4488 // and attempting to read back if that's the case is an error. The error will be registered
4489 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004490 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004491 return;
4492
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004493 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4494 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004495
4496 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004498 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004499 }
4500
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004501 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004502 }
4503 }
4504 catch(std::bad_alloc&)
4505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004506 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004507 }
4508}
4509
4510void __stdcall glReleaseShaderCompiler(void)
4511{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004512 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004513
4514 try
4515 {
4516 gl::Shader::releaseCompiler();
4517 }
4518 catch(std::bad_alloc&)
4519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004520 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004521 }
4522}
4523
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004524void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004526 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 +00004527 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004528
4529 try
4530 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004531 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004532
4533 if (context)
4534 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004535 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004536 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004537 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004538 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004539 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004540
4541 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004542 }
4543 }
4544 catch(std::bad_alloc&)
4545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004546 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004547 }
4548}
4549
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004550void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4551{
4552 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4553}
4554
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004555void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4556{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004557 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004558
4559 try
4560 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004561 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004562
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004563 if (context)
4564 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004565 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004566 }
4567 }
4568 catch(std::bad_alloc&)
4569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004570 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004571 }
4572}
4573
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004574void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4575{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004576 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004577
4578 try
4579 {
4580 if (condition != GL_ALL_COMPLETED_NV)
4581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004582 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004583 }
4584
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004585 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004586
4587 if (context)
4588 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004589 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004590
4591 if (fenceObject == NULL)
4592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004593 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004594 }
4595
4596 fenceObject->setFence(condition);
4597 }
4598 }
4599 catch(std::bad_alloc&)
4600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004601 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004602 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004603}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004604
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004605void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4606{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004607 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 +00004608
4609 try
4610 {
4611 if (width < 0 || height < 0)
4612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004613 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004614 }
4615
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004616 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004617
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004618 if (context)
4619 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004620 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004621 }
4622 }
4623 catch(std::bad_alloc&)
4624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004625 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004626 }
4627}
4628
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004629void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004630{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004631 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004632 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004633 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004634
4635 try
4636 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004637 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004638 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004639 }
4640 catch(std::bad_alloc&)
4641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004642 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004643 }
4644}
4645
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004646void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004647{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004648 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 +00004649 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004650
4651 try
4652 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004653 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004655 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004656 }
4657
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004658 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004659
4660 if (context)
4661 {
4662 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004663
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004664 if (!shaderObject)
4665 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004666 if (context->getProgram(shader))
4667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004668 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004669 }
4670 else
4671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004672 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004673 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004674 }
4675
4676 shaderObject->setSource(count, string, length);
4677 }
4678 }
4679 catch(std::bad_alloc&)
4680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004681 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004682 }
4683}
4684
4685void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4686{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004687 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004688}
4689
4690void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4691{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004692 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 +00004693
4694 try
4695 {
4696 switch (face)
4697 {
4698 case GL_FRONT:
4699 case GL_BACK:
4700 case GL_FRONT_AND_BACK:
4701 break;
4702 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004703 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004704 }
4705
4706 switch (func)
4707 {
4708 case GL_NEVER:
4709 case GL_ALWAYS:
4710 case GL_LESS:
4711 case GL_LEQUAL:
4712 case GL_EQUAL:
4713 case GL_GEQUAL:
4714 case GL_GREATER:
4715 case GL_NOTEQUAL:
4716 break;
4717 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004718 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004719 }
4720
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004721 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004722
4723 if (context)
4724 {
4725 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4726 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004727 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004728 }
4729
4730 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4731 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004732 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004733 }
4734 }
4735 }
4736 catch(std::bad_alloc&)
4737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004738 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004739 }
4740}
4741
4742void __stdcall glStencilMask(GLuint mask)
4743{
4744 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4745}
4746
4747void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4748{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004749 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004750
4751 try
4752 {
4753 switch (face)
4754 {
4755 case GL_FRONT:
4756 case GL_BACK:
4757 case GL_FRONT_AND_BACK:
4758 break;
4759 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004760 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004761 }
4762
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004763 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004764
4765 if (context)
4766 {
4767 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4768 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004769 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004770 }
4771
4772 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4773 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004774 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004775 }
4776 }
4777 }
4778 catch(std::bad_alloc&)
4779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004780 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004781 }
4782}
4783
4784void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4785{
4786 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4787}
4788
4789void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4790{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004791 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 +00004792 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004793
4794 try
4795 {
4796 switch (face)
4797 {
4798 case GL_FRONT:
4799 case GL_BACK:
4800 case GL_FRONT_AND_BACK:
4801 break;
4802 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004803 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004804 }
4805
4806 switch (fail)
4807 {
4808 case GL_ZERO:
4809 case GL_KEEP:
4810 case GL_REPLACE:
4811 case GL_INCR:
4812 case GL_DECR:
4813 case GL_INVERT:
4814 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004815 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004816 break;
4817 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004818 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004819 }
4820
4821 switch (zfail)
4822 {
4823 case GL_ZERO:
4824 case GL_KEEP:
4825 case GL_REPLACE:
4826 case GL_INCR:
4827 case GL_DECR:
4828 case GL_INVERT:
4829 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004830 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004831 break;
4832 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004833 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004834 }
4835
4836 switch (zpass)
4837 {
4838 case GL_ZERO:
4839 case GL_KEEP:
4840 case GL_REPLACE:
4841 case GL_INCR:
4842 case GL_DECR:
4843 case GL_INVERT:
4844 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004845 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004846 break;
4847 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004848 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004849 }
4850
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004851 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004852
4853 if (context)
4854 {
4855 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4856 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004857 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004858 }
4859
4860 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4861 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004862 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004863 }
4864 }
4865 }
4866 catch(std::bad_alloc&)
4867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004868 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004869 }
4870}
4871
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004872GLboolean __stdcall glTestFenceNV(GLuint fence)
4873{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004874 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004875
4876 try
4877 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004878 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004879
4880 if (context)
4881 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004882 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004883
4884 if (fenceObject == NULL)
4885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004886 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004887 }
4888
Jamie Madillfb9a7402013-07-26 11:55:01 -04004889 if (fenceObject->isFence() != GL_TRUE)
4890 {
4891 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4892 }
4893
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004894 return fenceObject->testFence();
4895 }
4896 }
4897 catch(std::bad_alloc&)
4898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004899 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004900 }
4901
4902 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004903}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004904
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004905void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4906 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004907{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004908 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004909 "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 +00004910 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004911
4912 try
4913 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004914 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004915
4916 if (context)
4917 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004918 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004919 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004920 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004921 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004922 return;
4923 }
4924
4925 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004926 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004927 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004928 {
4929 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004930 }
4931
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004932 switch (target)
4933 {
4934 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004935 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004936 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004937 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004938 }
4939 break;
4940 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004941 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004942 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004943 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004944 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004945 break;
4946 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4947 {
4948 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004949 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004950 }
4951 break;
4952 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4953 {
4954 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004955 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004956 }
4957 break;
4958 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4959 {
4960 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004961 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004962 }
4963 break;
4964 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4965 {
4966 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004967 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004968 }
4969 break;
4970 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4971 {
4972 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004973 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004974 }
4975 break;
4976 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004977 }
4978 }
4979 }
4980 catch(std::bad_alloc&)
4981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004982 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004983 }
4984}
4985
4986void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4987{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004988 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4989
4990 try
4991 {
4992 gl::Context *context = gl::getNonLostContext();
4993
4994 if (context)
4995 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004996 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004997 {
4998 return;
4999 }
5000
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005001 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005002
Jamie Madillfb8a8302013-07-03 14:24:12 -04005003 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005004 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005005 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005006 }
5007
5008 switch (pname)
5009 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005010 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5011 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5012 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5013 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5014 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5015 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
5016 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
5017 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5018 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005019 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
5020 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
5021 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
5022 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005023
Jamie Madill478fdb22013-07-19 16:36:59 -04005024 case GL_TEXTURE_BASE_LEVEL:
5025 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005026 case GL_TEXTURE_MIN_LOD:
5027 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005028 UNIMPLEMENTED();
5029 break;
5030
Jamie Madill478fdb22013-07-19 16:36:59 -04005031 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005032 }
5033 }
5034 }
5035 catch(std::bad_alloc&)
5036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005037 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005038 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005039}
5040
5041void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5042{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005043 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005044}
5045
5046void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5047{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005048 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005049
5050 try
5051 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005052 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005053
5054 if (context)
5055 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005056 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005057 {
5058 return;
5059 }
5060
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005061 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005062
Jamie Madillfb8a8302013-07-03 14:24:12 -04005063 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005064 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005065 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005066 }
5067
5068 switch (pname)
5069 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005070 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5071 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5072 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5073 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5074 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5075 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5076 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5077 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5078 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005079 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5080 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5081 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5082 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005083
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005084 case GL_TEXTURE_BASE_LEVEL:
5085 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005086 case GL_TEXTURE_MIN_LOD:
5087 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005088 UNIMPLEMENTED();
5089 break;
5090
Jamie Madill478fdb22013-07-19 16:36:59 -04005091 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005092 }
5093 }
5094 }
5095 catch(std::bad_alloc&)
5096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005097 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005098 }
5099}
5100
5101void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5102{
5103 glTexParameteri(target, pname, *params);
5104}
5105
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005106void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5107{
5108 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5109 target, levels, internalformat, width, height);
5110
5111 try
5112 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005113 gl::Context *context = gl::getNonLostContext();
5114
5115 if (context)
5116 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005117 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005118 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005119 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005120 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005121 }
5122
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005123 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005124 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005125 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005126 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005127 }
5128
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005129 switch (target)
5130 {
5131 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005132 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005133 gl::Texture2D *texture2d = context->getTexture2D();
5134 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005135 }
5136 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005137
Geoff Lang01c21d22013-09-24 11:52:16 -04005138 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005139 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005140 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5141 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005142 }
5143 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005144
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005145 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005146 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005147 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005148 }
5149 }
5150 catch(std::bad_alloc&)
5151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005152 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005153 }
5154}
5155
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005156void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5157 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005158{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005159 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005160 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005161 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005162 target, level, xoffset, yoffset, width, height, format, type, pixels);
5163
5164 try
5165 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005166 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005167
5168 if (context)
5169 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005170 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005171 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005172 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005173 {
5174 return;
5175 }
5176
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005177 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005178 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005179 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005180 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005181 return;
5182 }
5183
5184 switch (target)
5185 {
5186 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005187 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005188 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005189 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005190 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005191 break;
5192
5193 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5194 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5195 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5196 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5197 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5198 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005199 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005200 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005201 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005202 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005203 break;
5204
5205 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005206 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005207 }
5208 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005209 }
5210 catch(std::bad_alloc&)
5211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005212 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005213 }
5214}
5215
5216void __stdcall glUniform1f(GLint location, GLfloat x)
5217{
5218 glUniform1fv(location, 1, &x);
5219}
5220
5221void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5222{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005223 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005224
5225 try
5226 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005227 if (count < 0)
5228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005229 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005230 }
5231
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005232 if (location == -1)
5233 {
5234 return;
5235 }
5236
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005237 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005238
5239 if (context)
5240 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005241 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005242 if (!programBinary)
5243 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005244 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005245 }
5246
5247 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005249 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005250 }
5251 }
5252 }
5253 catch(std::bad_alloc&)
5254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005255 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005256 }
5257}
5258
5259void __stdcall glUniform1i(GLint location, GLint x)
5260{
5261 glUniform1iv(location, 1, &x);
5262}
5263
5264void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5265{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005266 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005267
5268 try
5269 {
5270 if (count < 0)
5271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005272 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005273 }
5274
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005275 if (location == -1)
5276 {
5277 return;
5278 }
5279
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005280 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005281
5282 if (context)
5283 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005284 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005285 if (!programBinary)
5286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005287 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005288 }
5289
5290 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005292 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005293 }
5294 }
5295 }
5296 catch(std::bad_alloc&)
5297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005298 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005299 }
5300}
5301
5302void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5303{
5304 GLfloat xy[2] = {x, y};
5305
5306 glUniform2fv(location, 1, (GLfloat*)&xy);
5307}
5308
5309void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5310{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005311 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005312
5313 try
5314 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005315 if (count < 0)
5316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005317 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005318 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005319
5320 if (location == -1)
5321 {
5322 return;
5323 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005324
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005325 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005326
5327 if (context)
5328 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005329 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005330 if (!programBinary)
5331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005332 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005333 }
5334
5335 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005337 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005338 }
5339 }
5340 }
5341 catch(std::bad_alloc&)
5342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005343 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005344 }
5345}
5346
5347void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5348{
5349 GLint xy[4] = {x, y};
5350
5351 glUniform2iv(location, 1, (GLint*)&xy);
5352}
5353
5354void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5355{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005356 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005357
5358 try
5359 {
5360 if (count < 0)
5361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005362 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005363 }
5364
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005365 if (location == -1)
5366 {
5367 return;
5368 }
5369
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005370 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005371
5372 if (context)
5373 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005374 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005375 if (!programBinary)
5376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005377 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005378 }
5379
5380 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005382 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005383 }
5384 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005385 }
5386 catch(std::bad_alloc&)
5387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005388 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005389 }
5390}
5391
5392void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5393{
5394 GLfloat xyz[3] = {x, y, z};
5395
5396 glUniform3fv(location, 1, (GLfloat*)&xyz);
5397}
5398
5399void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005401 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005402
5403 try
5404 {
5405 if (count < 0)
5406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005407 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005408 }
5409
5410 if (location == -1)
5411 {
5412 return;
5413 }
5414
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005415 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005416
5417 if (context)
5418 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005419 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005420 if (!programBinary)
5421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005422 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005423 }
5424
5425 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005427 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005428 }
5429 }
5430 }
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 glUniform3i(GLint location, GLint x, GLint y, GLint z)
5438{
5439 GLint xyz[3] = {x, y, z};
5440
5441 glUniform3iv(location, 1, (GLint*)&xyz);
5442}
5443
5444void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5445{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005446 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005447
5448 try
5449 {
5450 if (count < 0)
5451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005452 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005453 }
5454
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005455 if (location == -1)
5456 {
5457 return;
5458 }
5459
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005460 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005461
5462 if (context)
5463 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005464 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005465 if (!programBinary)
5466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005467 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005468 }
5469
5470 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005472 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005473 }
5474 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005475 }
5476 catch(std::bad_alloc&)
5477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005478 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005479 }
5480}
5481
5482void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5483{
5484 GLfloat xyzw[4] = {x, y, z, w};
5485
5486 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5487}
5488
5489void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5490{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005491 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005492
5493 try
5494 {
5495 if (count < 0)
5496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005497 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005498 }
5499
5500 if (location == -1)
5501 {
5502 return;
5503 }
5504
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005505 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005506
5507 if (context)
5508 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005509 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005510 if (!programBinary)
5511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005512 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005513 }
5514
5515 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005517 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005518 }
5519 }
5520 }
5521 catch(std::bad_alloc&)
5522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005523 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005524 }
5525}
5526
5527void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5528{
5529 GLint xyzw[4] = {x, y, z, w};
5530
5531 glUniform4iv(location, 1, (GLint*)&xyzw);
5532}
5533
5534void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5535{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005536 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005537
5538 try
5539 {
5540 if (count < 0)
5541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005542 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005543 }
5544
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005545 if (location == -1)
5546 {
5547 return;
5548 }
5549
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005550 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005551
5552 if (context)
5553 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005554 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005555 if (!programBinary)
5556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005557 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005558 }
5559
5560 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005562 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005563 }
5564 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005565 }
5566 catch(std::bad_alloc&)
5567 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005568 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005569 }
5570}
5571
5572void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5573{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005574 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005575 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005576
5577 try
5578 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005579 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005581 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005582 }
5583
5584 if (location == -1)
5585 {
5586 return;
5587 }
5588
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005589 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005590
5591 if (context)
5592 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005593 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5594 {
5595 return gl::error(GL_INVALID_VALUE);
5596 }
5597
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005598 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005599 if (!programBinary)
5600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005601 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005602 }
5603
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005604 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005606 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005607 }
5608 }
5609 }
5610 catch(std::bad_alloc&)
5611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005612 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005613 }
5614}
5615
5616void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5617{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005618 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005619 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005620
5621 try
5622 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005623 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005625 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005626 }
5627
5628 if (location == -1)
5629 {
5630 return;
5631 }
5632
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005633 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005634
5635 if (context)
5636 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005637 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5638 {
5639 return gl::error(GL_INVALID_VALUE);
5640 }
5641
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005642 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005643 if (!programBinary)
5644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005645 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005646 }
5647
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005648 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005650 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005651 }
5652 }
5653 }
5654 catch(std::bad_alloc&)
5655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005656 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005657 }
5658}
5659
5660void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5661{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005662 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005663 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005664
5665 try
5666 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005667 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005669 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005670 }
5671
5672 if (location == -1)
5673 {
5674 return;
5675 }
5676
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005677 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005678
5679 if (context)
5680 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005681 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5682 {
5683 return gl::error(GL_INVALID_VALUE);
5684 }
5685
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005686 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005687 if (!programBinary)
5688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005689 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005690 }
5691
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005692 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005694 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005695 }
5696 }
5697 }
5698 catch(std::bad_alloc&)
5699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005700 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005701 }
5702}
5703
5704void __stdcall glUseProgram(GLuint program)
5705{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005706 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005707
5708 try
5709 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005710 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005711
5712 if (context)
5713 {
5714 gl::Program *programObject = context->getProgram(program);
5715
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005716 if (!programObject && program != 0)
5717 {
5718 if (context->getShader(program))
5719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005720 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005721 }
5722 else
5723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005724 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005725 }
5726 }
5727
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005728 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005730 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005731 }
5732
5733 context->useProgram(program);
5734 }
5735 }
5736 catch(std::bad_alloc&)
5737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005738 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005739 }
5740}
5741
5742void __stdcall glValidateProgram(GLuint program)
5743{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005744 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005745
5746 try
5747 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005748 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005749
5750 if (context)
5751 {
5752 gl::Program *programObject = context->getProgram(program);
5753
5754 if (!programObject)
5755 {
5756 if (context->getShader(program))
5757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005758 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005759 }
5760 else
5761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005762 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005763 }
5764 }
5765
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005766 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005767 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005768 }
5769 catch(std::bad_alloc&)
5770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005771 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005772 }
5773}
5774
5775void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5776{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005777 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005778
5779 try
5780 {
5781 if (index >= gl::MAX_VERTEX_ATTRIBS)
5782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005783 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005784 }
5785
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005786 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005787
5788 if (context)
5789 {
5790 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005791 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005792 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005793 }
5794 catch(std::bad_alloc&)
5795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005796 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005797 }
5798}
5799
5800void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5801{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005802 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005803
5804 try
5805 {
5806 if (index >= gl::MAX_VERTEX_ATTRIBS)
5807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005808 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005809 }
5810
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005811 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005812
5813 if (context)
5814 {
5815 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005816 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005817 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005818 }
5819 catch(std::bad_alloc&)
5820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005821 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005822 }
5823}
5824
5825void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5826{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005827 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005828
5829 try
5830 {
5831 if (index >= gl::MAX_VERTEX_ATTRIBS)
5832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005833 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005834 }
5835
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005836 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005837
5838 if (context)
5839 {
5840 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005841 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005842 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005843 }
5844 catch(std::bad_alloc&)
5845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005846 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005847 }
5848}
5849
5850void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5851{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005852 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005853
5854 try
5855 {
5856 if (index >= gl::MAX_VERTEX_ATTRIBS)
5857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005858 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005859 }
5860
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005861 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005862
5863 if (context)
5864 {
5865 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005866 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005867 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005868 }
5869 catch(std::bad_alloc&)
5870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005871 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005872 }
5873}
5874
5875void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5876{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005877 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 +00005878
5879 try
5880 {
5881 if (index >= gl::MAX_VERTEX_ATTRIBS)
5882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005883 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005884 }
5885
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005886 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005887
5888 if (context)
5889 {
5890 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005891 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005892 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005893 }
5894 catch(std::bad_alloc&)
5895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005896 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005897 }
5898}
5899
5900void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5901{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005902 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005903
5904 try
5905 {
5906 if (index >= gl::MAX_VERTEX_ATTRIBS)
5907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005908 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005909 }
5910
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005911 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005912
5913 if (context)
5914 {
5915 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005916 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005917 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005918 }
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 glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5926{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005927 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 +00005928
5929 try
5930 {
5931 if (index >= gl::MAX_VERTEX_ATTRIBS)
5932 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005933 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005934 }
5935
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005936 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005937
5938 if (context)
5939 {
5940 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005941 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005942 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005943 }
5944 catch(std::bad_alloc&)
5945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005946 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005947 }
5948}
5949
5950void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5951{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005952 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005953
5954 try
5955 {
5956 if (index >= gl::MAX_VERTEX_ATTRIBS)
5957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005958 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005959 }
5960
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005961 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005962
5963 if (context)
5964 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005965 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005966 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005967 }
5968 catch(std::bad_alloc&)
5969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005970 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005971 }
5972}
5973
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005974void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5975{
5976 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5977
5978 try
5979 {
5980 if (index >= gl::MAX_VERTEX_ATTRIBS)
5981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005982 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005983 }
5984
5985 gl::Context *context = gl::getNonLostContext();
5986
5987 if (context)
5988 {
5989 context->setVertexAttribDivisor(index, divisor);
5990 }
5991 }
5992 catch(std::bad_alloc&)
5993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005994 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005995 }
5996}
5997
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005998void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005999{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006000 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006001 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006002 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006003
6004 try
6005 {
6006 if (index >= gl::MAX_VERTEX_ATTRIBS)
6007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006008 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006009 }
6010
6011 if (size < 1 || size > 4)
6012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006013 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006014 }
6015
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006016 gl::Context *context = gl::getNonLostContext();
6017
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006018 switch (type)
6019 {
6020 case GL_BYTE:
6021 case GL_UNSIGNED_BYTE:
6022 case GL_SHORT:
6023 case GL_UNSIGNED_SHORT:
6024 case GL_FIXED:
6025 case GL_FLOAT:
6026 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006027 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006028 case GL_INT:
6029 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006030 case GL_INT_2_10_10_10_REV:
6031 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006032 if (context && context->getClientVersion() < 3)
6033 {
6034 return gl::error(GL_INVALID_ENUM);
6035 }
6036 else
6037 {
6038 break;
6039 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006040 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006041 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006042 }
6043
6044 if (stride < 0)
6045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006046 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006047 }
6048
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006049 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6050 {
6051 return gl::error(GL_INVALID_OPERATION);
6052 }
6053
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006054 if (context)
6055 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006056 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6057 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6058 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6059 // and the pointer argument is not NULL.
6060 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6061 {
6062 return gl::error(GL_INVALID_OPERATION);
6063 }
6064
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006065 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6066 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006067 }
6068 }
6069 catch(std::bad_alloc&)
6070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006071 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006072 }
6073}
6074
6075void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6076{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006077 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 +00006078
6079 try
6080 {
6081 if (width < 0 || height < 0)
6082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006083 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006084 }
6085
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006086 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006087
6088 if (context)
6089 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006090 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006091 }
6092 }
6093 catch(std::bad_alloc&)
6094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006095 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006096 }
6097}
6098
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006099// OpenGL ES 3.0 functions
6100
6101void __stdcall glReadBuffer(GLenum mode)
6102{
6103 EVENT("(GLenum mode = 0x%X)", mode);
6104
6105 try
6106 {
6107 gl::Context *context = gl::getNonLostContext();
6108
6109 if (context)
6110 {
6111 if (context->getClientVersion() < 3)
6112 {
6113 return gl::error(GL_INVALID_OPERATION);
6114 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006115
Jamie Madill54133512013-06-21 09:33:07 -04006116 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006117 UNIMPLEMENTED();
6118 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006119 }
6120 catch(std::bad_alloc&)
6121 {
6122 return gl::error(GL_OUT_OF_MEMORY);
6123 }
6124}
6125
6126void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6127{
6128 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6129 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6130
6131 try
6132 {
6133 gl::Context *context = gl::getNonLostContext();
6134
6135 if (context)
6136 {
6137 if (context->getClientVersion() < 3)
6138 {
6139 return gl::error(GL_INVALID_OPERATION);
6140 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006141
Jamie Madill54133512013-06-21 09:33:07 -04006142 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006143 UNIMPLEMENTED();
6144 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006145 }
6146 catch(std::bad_alloc&)
6147 {
6148 return gl::error(GL_OUT_OF_MEMORY);
6149 }
6150}
6151
6152void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6153{
6154 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6155 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6156 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6157 target, level, internalformat, width, height, depth, border, format, type, pixels);
6158
6159 try
6160 {
6161 gl::Context *context = gl::getNonLostContext();
6162
6163 if (context)
6164 {
6165 if (context->getClientVersion() < 3)
6166 {
6167 return gl::error(GL_INVALID_OPERATION);
6168 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006169
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006170 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006171 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006172 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006173 {
6174 return;
6175 }
6176
6177 switch(target)
6178 {
6179 case GL_TEXTURE_3D:
6180 {
6181 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006182 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006183 }
6184 break;
6185
6186 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006187 {
6188 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006189 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006190 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006191 break;
6192
6193 default:
6194 return gl::error(GL_INVALID_ENUM);
6195 }
6196 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006197 }
6198 catch(std::bad_alloc&)
6199 {
6200 return gl::error(GL_OUT_OF_MEMORY);
6201 }
6202}
6203
6204void __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)
6205{
6206 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6207 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6208 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6209 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6210
6211 try
6212 {
6213 gl::Context *context = gl::getNonLostContext();
6214
6215 if (context)
6216 {
6217 if (context->getClientVersion() < 3)
6218 {
6219 return gl::error(GL_INVALID_OPERATION);
6220 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006221
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006222 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006223 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006224 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006225 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006226 {
6227 return;
6228 }
6229
6230 switch(target)
6231 {
6232 case GL_TEXTURE_3D:
6233 {
6234 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006235 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 +00006236 }
6237 break;
6238
6239 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006240 {
6241 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006242 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 +00006243 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006244 break;
6245
6246 default:
6247 return gl::error(GL_INVALID_ENUM);
6248 }
6249 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006250 }
6251 catch(std::bad_alloc&)
6252 {
6253 return gl::error(GL_OUT_OF_MEMORY);
6254 }
6255}
6256
6257void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6258{
6259 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6260 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6261 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6262
6263 try
6264 {
6265 gl::Context *context = gl::getNonLostContext();
6266
6267 if (context)
6268 {
6269 if (context->getClientVersion() < 3)
6270 {
6271 return gl::error(GL_INVALID_OPERATION);
6272 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006273
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006274 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006275 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006276 {
6277 return;
6278 }
6279
6280 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6281 gl::Texture *texture = NULL;
6282 switch (target)
6283 {
6284 case GL_TEXTURE_3D:
6285 texture = context->getTexture3D();
6286 break;
6287
6288 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006289 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006290 break;
6291
6292 default:
6293 return gl::error(GL_INVALID_ENUM);
6294 }
6295
6296 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6297 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006298 }
6299 catch(std::bad_alloc&)
6300 {
6301 return gl::error(GL_OUT_OF_MEMORY);
6302 }
6303}
6304
6305void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6306{
Geoff Langeef52cc2013-10-16 15:07:39 -04006307 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 +00006308 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6309 "const GLvoid* data = 0x%0.8p)",
6310 target, level, internalformat, width, height, depth, border, imageSize, data);
6311
6312 try
6313 {
6314 gl::Context *context = gl::getNonLostContext();
6315
6316 if (context)
6317 {
6318 if (context->getClientVersion() < 3)
6319 {
6320 return gl::error(GL_INVALID_OPERATION);
6321 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006322
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006323 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 +00006324 {
6325 return gl::error(GL_INVALID_VALUE);
6326 }
6327
6328 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006329 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006330 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006331 {
6332 return;
6333 }
6334
6335 switch(target)
6336 {
6337 case GL_TEXTURE_3D:
6338 {
6339 gl::Texture3D *texture = context->getTexture3D();
6340 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6341 }
6342 break;
6343
6344 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006345 {
6346 gl::Texture2DArray *texture = context->getTexture2DArray();
6347 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6348 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006349 break;
6350
6351 default:
6352 return gl::error(GL_INVALID_ENUM);
6353 }
6354 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006355 }
6356 catch(std::bad_alloc&)
6357 {
6358 return gl::error(GL_OUT_OF_MEMORY);
6359 }
6360}
6361
6362void __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)
6363{
6364 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6365 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6366 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6367 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6368
6369 try
6370 {
6371 gl::Context *context = gl::getNonLostContext();
6372
6373 if (context)
6374 {
6375 if (context->getClientVersion() < 3)
6376 {
6377 return gl::error(GL_INVALID_OPERATION);
6378 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006379
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006380 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 +00006381 {
6382 return gl::error(GL_INVALID_VALUE);
6383 }
6384
6385 if (!data)
6386 {
6387 return gl::error(GL_INVALID_VALUE);
6388 }
6389
6390 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006391 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006392 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006393 {
6394 return;
6395 }
6396
6397 switch(target)
6398 {
6399 case GL_TEXTURE_3D:
6400 {
6401 gl::Texture3D *texture = context->getTexture3D();
6402 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6403 format, imageSize, data);
6404 }
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();
6410 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6411 format, imageSize, data);
6412 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006413 break;
6414
6415 default:
6416 return gl::error(GL_INVALID_ENUM);
6417 }
6418 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006419 }
6420 catch(std::bad_alloc&)
6421 {
6422 return gl::error(GL_OUT_OF_MEMORY);
6423 }
6424}
6425
6426void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6427{
6428 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6429
6430 try
6431 {
6432 gl::Context *context = gl::getNonLostContext();
6433
6434 if (context)
6435 {
6436 if (context->getClientVersion() < 3)
6437 {
6438 return gl::error(GL_INVALID_OPERATION);
6439 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006440
Jamie Madill3641b4b2013-07-26 12:54:59 -04006441 glGenQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006442 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006443 }
6444 catch(std::bad_alloc&)
6445 {
6446 return gl::error(GL_OUT_OF_MEMORY);
6447 }
6448}
6449
6450void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6451{
6452 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6453
6454 try
6455 {
6456 gl::Context *context = gl::getNonLostContext();
6457
6458 if (context)
6459 {
6460 if (context->getClientVersion() < 3)
6461 {
6462 return gl::error(GL_INVALID_OPERATION);
6463 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006464
Jamie Madill3641b4b2013-07-26 12:54:59 -04006465 glDeleteQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006466 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006467 }
6468 catch(std::bad_alloc&)
6469 {
6470 return gl::error(GL_OUT_OF_MEMORY);
6471 }
6472}
6473
6474GLboolean __stdcall glIsQuery(GLuint id)
6475{
6476 EVENT("(GLuint id = %u)", id);
6477
6478 try
6479 {
6480 gl::Context *context = gl::getNonLostContext();
6481
6482 if (context)
6483 {
6484 if (context->getClientVersion() < 3)
6485 {
6486 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6487 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006488
Jamie Madill3641b4b2013-07-26 12:54:59 -04006489 // TODO: XFB queries
6490 return glIsQueryEXT(id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006491 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006492 }
6493 catch(std::bad_alloc&)
6494 {
6495 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6496 }
6497
6498 return GL_FALSE;
6499}
6500
6501void __stdcall glBeginQuery(GLenum target, GLuint id)
6502{
6503 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6504
6505 try
6506 {
6507 gl::Context *context = gl::getNonLostContext();
6508
6509 if (context)
6510 {
6511 if (context->getClientVersion() < 3)
6512 {
6513 return gl::error(GL_INVALID_OPERATION);
6514 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006515
Jamie Madill3641b4b2013-07-26 12:54:59 -04006516 switch (target)
6517 {
6518 case GL_ANY_SAMPLES_PASSED:
6519 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
6520 case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
6521 break;
6522 default:
6523 return gl::error(GL_INVALID_ENUM);
6524 }
6525
6526 if (id == 0)
6527 {
6528 return gl::error(GL_INVALID_OPERATION);
6529 }
6530
6531 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6532 {
6533 // TODO: XFB queries
6534 UNIMPLEMENTED();
6535 }
6536 else
6537 {
6538 context->beginQuery(target, id);
6539 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006540 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006541 }
6542 catch(std::bad_alloc&)
6543 {
6544 return gl::error(GL_OUT_OF_MEMORY);
6545 }
6546}
6547
6548void __stdcall glEndQuery(GLenum target)
6549{
6550 EVENT("(GLenum target = 0x%X)", target);
6551
6552 try
6553 {
6554 gl::Context *context = gl::getNonLostContext();
6555
6556 if (context)
6557 {
6558 if (context->getClientVersion() < 3)
6559 {
6560 return gl::error(GL_INVALID_OPERATION);
6561 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006562
Jamie Madill3641b4b2013-07-26 12:54:59 -04006563 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6564 {
6565 // TODO: XFB queries
6566 UNIMPLEMENTED();
6567 }
6568 else
6569 {
6570 glEndQueryEXT(target);
6571 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006572 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006573 }
6574 catch(std::bad_alloc&)
6575 {
6576 return gl::error(GL_OUT_OF_MEMORY);
6577 }
6578}
6579
6580void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6581{
6582 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6583
6584 try
6585 {
6586 gl::Context *context = gl::getNonLostContext();
6587
6588 if (context)
6589 {
6590 if (context->getClientVersion() < 3)
6591 {
6592 return gl::error(GL_INVALID_OPERATION);
6593 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006594
Jamie Madill3641b4b2013-07-26 12:54:59 -04006595 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6596 {
6597 // TODO: XFB queries
6598 UNIMPLEMENTED();
6599 }
6600 else
6601 {
6602 glGetQueryivEXT(target, pname, params);
6603 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006604 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006605 }
6606 catch(std::bad_alloc&)
6607 {
6608 return gl::error(GL_OUT_OF_MEMORY);
6609 }
6610}
6611
6612void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6613{
6614 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6615
6616 try
6617 {
6618 gl::Context *context = gl::getNonLostContext();
6619
6620 if (context)
6621 {
6622 if (context->getClientVersion() < 3)
6623 {
6624 return gl::error(GL_INVALID_OPERATION);
6625 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006626
Jamie Madill3641b4b2013-07-26 12:54:59 -04006627 // TODO: XFB queries
6628 glGetQueryObjectuivEXT(id, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006629 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006630 }
6631 catch(std::bad_alloc&)
6632 {
6633 return gl::error(GL_OUT_OF_MEMORY);
6634 }
6635}
6636
6637GLboolean __stdcall glUnmapBuffer(GLenum target)
6638{
6639 EVENT("(GLenum target = 0x%X)", target);
6640
6641 try
6642 {
6643 gl::Context *context = gl::getNonLostContext();
6644
6645 if (context)
6646 {
6647 if (context->getClientVersion() < 3)
6648 {
6649 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6650 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006651
Jamie Madill54133512013-06-21 09:33:07 -04006652 // glUnmapBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006653 UNIMPLEMENTED();
6654 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006655 }
6656 catch(std::bad_alloc&)
6657 {
6658 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6659 }
6660
6661 return GL_FALSE;
6662}
6663
6664void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6665{
6666 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6667
6668 try
6669 {
6670 gl::Context *context = gl::getNonLostContext();
6671
6672 if (context)
6673 {
6674 if (context->getClientVersion() < 3)
6675 {
6676 return gl::error(GL_INVALID_OPERATION);
6677 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006678
Jamie Madill54133512013-06-21 09:33:07 -04006679 // glGetBufferPointerv
shannonwoods@chromium.org2d2190a2013-05-30 00:17:35 +00006680 UNIMPLEMENTED();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006681 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006682 }
6683 catch(std::bad_alloc&)
6684 {
6685 return gl::error(GL_OUT_OF_MEMORY);
6686 }
6687}
6688
6689void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6690{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006691 try
6692 {
6693 gl::Context *context = gl::getNonLostContext();
6694
6695 if (context)
6696 {
6697 if (context->getClientVersion() < 3)
6698 {
6699 return gl::error(GL_INVALID_OPERATION);
6700 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006701
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006702 glDrawBuffersEXT(n, bufs);
6703 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006704 }
6705 catch(std::bad_alloc&)
6706 {
6707 return gl::error(GL_OUT_OF_MEMORY);
6708 }
6709}
6710
6711void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6712{
6713 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6714 location, count, transpose, value);
6715
6716 try
6717 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006718 if (count < 0)
6719 {
6720 return gl::error(GL_INVALID_VALUE);
6721 }
6722
6723 if (location == -1)
6724 {
6725 return;
6726 }
6727
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006728 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
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006737 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6738 if (!programBinary)
6739 {
6740 return gl::error(GL_INVALID_OPERATION);
6741 }
6742
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006743 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006744 {
6745 return gl::error(GL_INVALID_OPERATION);
6746 }
6747 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006748 }
6749 catch(std::bad_alloc&)
6750 {
6751 return gl::error(GL_OUT_OF_MEMORY);
6752 }
6753}
6754
6755void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6756{
6757 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6758 location, count, transpose, value);
6759
6760 try
6761 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006762 if (count < 0)
6763 {
6764 return gl::error(GL_INVALID_VALUE);
6765 }
6766
6767 if (location == -1)
6768 {
6769 return;
6770 }
6771
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006772 gl::Context *context = gl::getNonLostContext();
6773
6774 if (context)
6775 {
6776 if (context->getClientVersion() < 3)
6777 {
6778 return gl::error(GL_INVALID_OPERATION);
6779 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006780
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006781 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6782 if (!programBinary)
6783 {
6784 return gl::error(GL_INVALID_OPERATION);
6785 }
6786
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006787 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006788 {
6789 return gl::error(GL_INVALID_OPERATION);
6790 }
6791 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006792 }
6793 catch(std::bad_alloc&)
6794 {
6795 return gl::error(GL_OUT_OF_MEMORY);
6796 }
6797}
6798
6799void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6800{
6801 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6802 location, count, transpose, value);
6803
6804 try
6805 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006806 if (count < 0)
6807 {
6808 return gl::error(GL_INVALID_VALUE);
6809 }
6810
6811 if (location == -1)
6812 {
6813 return;
6814 }
6815
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006816 gl::Context *context = gl::getNonLostContext();
6817
6818 if (context)
6819 {
6820 if (context->getClientVersion() < 3)
6821 {
6822 return gl::error(GL_INVALID_OPERATION);
6823 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006824
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006825 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6826 if (!programBinary)
6827 {
6828 return gl::error(GL_INVALID_OPERATION);
6829 }
6830
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006831 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006832 {
6833 return gl::error(GL_INVALID_OPERATION);
6834 }
6835 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006836 }
6837 catch(std::bad_alloc&)
6838 {
6839 return gl::error(GL_OUT_OF_MEMORY);
6840 }
6841}
6842
6843void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6844{
6845 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6846 location, count, transpose, value);
6847
6848 try
6849 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006850 if (count < 0)
6851 {
6852 return gl::error(GL_INVALID_VALUE);
6853 }
6854
6855 if (location == -1)
6856 {
6857 return;
6858 }
6859
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006860 gl::Context *context = gl::getNonLostContext();
6861
6862 if (context)
6863 {
6864 if (context->getClientVersion() < 3)
6865 {
6866 return gl::error(GL_INVALID_OPERATION);
6867 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006868
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006869 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6870 if (!programBinary)
6871 {
6872 return gl::error(GL_INVALID_OPERATION);
6873 }
6874
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006875 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006876 {
6877 return gl::error(GL_INVALID_OPERATION);
6878 }
6879 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006880 }
6881 catch(std::bad_alloc&)
6882 {
6883 return gl::error(GL_OUT_OF_MEMORY);
6884 }
6885}
6886
6887void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6888{
6889 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6890 location, count, transpose, value);
6891
6892 try
6893 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006894 if (count < 0)
6895 {
6896 return gl::error(GL_INVALID_VALUE);
6897 }
6898
6899 if (location == -1)
6900 {
6901 return;
6902 }
6903
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006904 gl::Context *context = gl::getNonLostContext();
6905
6906 if (context)
6907 {
6908 if (context->getClientVersion() < 3)
6909 {
6910 return gl::error(GL_INVALID_OPERATION);
6911 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006912
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006913 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6914 if (!programBinary)
6915 {
6916 return gl::error(GL_INVALID_OPERATION);
6917 }
6918
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006919 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006920 {
6921 return gl::error(GL_INVALID_OPERATION);
6922 }
6923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006924 }
6925 catch(std::bad_alloc&)
6926 {
6927 return gl::error(GL_OUT_OF_MEMORY);
6928 }
6929}
6930
6931void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6932{
6933 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6934 location, count, transpose, value);
6935
6936 try
6937 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006938 if (count < 0)
6939 {
6940 return gl::error(GL_INVALID_VALUE);
6941 }
6942
6943 if (location == -1)
6944 {
6945 return;
6946 }
6947
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006948 gl::Context *context = gl::getNonLostContext();
6949
6950 if (context)
6951 {
6952 if (context->getClientVersion() < 3)
6953 {
6954 return gl::error(GL_INVALID_OPERATION);
6955 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006956
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006957 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6958 if (!programBinary)
6959 {
6960 return gl::error(GL_INVALID_OPERATION);
6961 }
6962
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006963 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006964 {
6965 return gl::error(GL_INVALID_OPERATION);
6966 }
6967 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006968 }
6969 catch(std::bad_alloc&)
6970 {
6971 return gl::error(GL_OUT_OF_MEMORY);
6972 }
6973}
6974
6975void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6976{
6977 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6978 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6979 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6980
6981 try
6982 {
6983 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006984 if (context)
6985 {
6986 if (context->getClientVersion() < 3)
6987 {
6988 return gl::error(GL_INVALID_OPERATION);
6989 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006990
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006991 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006992 dstX0, dstY0, dstX1, dstY1, mask, filter,
6993 false))
6994 {
6995 return;
6996 }
6997
6998 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6999 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007000 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007001 }
7002 catch(std::bad_alloc&)
7003 {
7004 return gl::error(GL_OUT_OF_MEMORY);
7005 }
7006}
7007
7008void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7009{
7010 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7011 target, samples, internalformat, width, height);
7012
7013 try
7014 {
7015 gl::Context *context = gl::getNonLostContext();
7016
7017 if (context)
7018 {
7019 if (context->getClientVersion() < 3)
7020 {
7021 return gl::error(GL_INVALID_OPERATION);
7022 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007023
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007024 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007025 width, height, false))
7026 {
7027 return;
7028 }
7029
7030 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007031 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007032 }
7033 catch(std::bad_alloc&)
7034 {
7035 return gl::error(GL_OUT_OF_MEMORY);
7036 }
7037}
7038
7039void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7040{
7041 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7042 target, attachment, texture, level, layer);
7043
7044 try
7045 {
7046 gl::Context *context = gl::getNonLostContext();
7047
7048 if (context)
7049 {
7050 if (context->getClientVersion() < 3)
7051 {
7052 return gl::error(GL_INVALID_OPERATION);
7053 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007054
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007055 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007056 {
7057 return;
7058 }
7059
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05007060 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
7061 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04007062
7063 gl::Texture *textureObject = context->getTexture(texture);
7064 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7065
7066 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7067 {
7068 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7069 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7070 }
7071 else
7072 {
7073 switch (attachment)
7074 {
7075 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7076 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7077 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7078 }
7079 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007080 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007081 }
7082 catch(std::bad_alloc&)
7083 {
7084 return gl::error(GL_OUT_OF_MEMORY);
7085 }
7086}
7087
7088GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7089{
7090 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7091 target, offset, length, access);
7092
7093 try
7094 {
7095 gl::Context *context = gl::getNonLostContext();
7096
7097 if (context)
7098 {
7099 if (context->getClientVersion() < 3)
7100 {
7101 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7102 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007103
Jamie Madill54133512013-06-21 09:33:07 -04007104 // glMapBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007105 UNIMPLEMENTED();
7106 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007107 }
7108 catch(std::bad_alloc&)
7109 {
7110 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7111 }
7112
7113 return NULL;
7114}
7115
7116void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7117{
7118 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7119
7120 try
7121 {
7122 gl::Context *context = gl::getNonLostContext();
7123
7124 if (context)
7125 {
7126 if (context->getClientVersion() < 3)
7127 {
7128 return gl::error(GL_INVALID_OPERATION);
7129 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007130
Jamie Madill54133512013-06-21 09:33:07 -04007131 // glFlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007132 UNIMPLEMENTED();
7133 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007134 }
7135 catch(std::bad_alloc&)
7136 {
7137 return gl::error(GL_OUT_OF_MEMORY);
7138 }
7139}
7140
7141void __stdcall glBindVertexArray(GLuint array)
7142{
7143 EVENT("(GLuint array = %u)", array);
7144
7145 try
7146 {
7147 gl::Context *context = gl::getNonLostContext();
7148
7149 if (context)
7150 {
7151 if (context->getClientVersion() < 3)
7152 {
7153 return gl::error(GL_INVALID_OPERATION);
7154 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007155
Jamie Madilld1028542013-07-02 11:57:04 -04007156 gl::VertexArray *vao = context->getVertexArray(array);
7157
7158 if (!vao)
7159 {
7160 // The default VAO should always exist
7161 ASSERT(array != 0);
7162 return gl::error(GL_INVALID_OPERATION);
7163 }
7164
7165 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007166 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007167 }
7168 catch(std::bad_alloc&)
7169 {
7170 return gl::error(GL_OUT_OF_MEMORY);
7171 }
7172}
7173
7174void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7175{
7176 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7177
7178 try
7179 {
7180 gl::Context *context = gl::getNonLostContext();
7181
7182 if (context)
7183 {
7184 if (context->getClientVersion() < 3)
7185 {
7186 return gl::error(GL_INVALID_OPERATION);
7187 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007188
Jamie Madilld1028542013-07-02 11:57:04 -04007189 if (n < 0)
7190 {
7191 return gl::error(GL_INVALID_VALUE);
7192 }
7193
7194 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7195 {
7196 if (arrays[arrayIndex] != 0)
7197 {
7198 context->deleteVertexArray(arrays[arrayIndex]);
7199 }
7200 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007201 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007202 }
7203 catch(std::bad_alloc&)
7204 {
7205 return gl::error(GL_OUT_OF_MEMORY);
7206 }
7207}
7208
7209void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7210{
7211 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7212
7213 try
7214 {
7215 gl::Context *context = gl::getNonLostContext();
7216
7217 if (context)
7218 {
7219 if (context->getClientVersion() < 3)
7220 {
7221 return gl::error(GL_INVALID_OPERATION);
7222 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007223
Jamie Madilld1028542013-07-02 11:57:04 -04007224 if (n < 0)
7225 {
7226 return gl::error(GL_INVALID_VALUE);
7227 }
7228
7229 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7230 {
7231 arrays[arrayIndex] = context->createVertexArray();
7232 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007233 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007234 }
7235 catch(std::bad_alloc&)
7236 {
7237 return gl::error(GL_OUT_OF_MEMORY);
7238 }
7239}
7240
7241GLboolean __stdcall glIsVertexArray(GLuint array)
7242{
7243 EVENT("(GLuint array = %u)", array);
7244
7245 try
7246 {
7247 gl::Context *context = gl::getNonLostContext();
7248
7249 if (context)
7250 {
7251 if (context->getClientVersion() < 3)
7252 {
7253 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7254 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007255
Jamie Madilld1028542013-07-02 11:57:04 -04007256 if (array == 0)
7257 {
7258 return GL_FALSE;
7259 }
7260
7261 gl::VertexArray *vao = context->getVertexArray(array);
7262
7263 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007264 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007265 }
7266 catch(std::bad_alloc&)
7267 {
7268 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7269 }
7270
7271 return GL_FALSE;
7272}
7273
7274void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7275{
7276 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7277 target, index, data);
7278
7279 try
7280 {
7281 gl::Context *context = gl::getNonLostContext();
7282
7283 if (context)
7284 {
7285 if (context->getClientVersion() < 3)
7286 {
7287 return gl::error(GL_INVALID_OPERATION);
7288 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007289
Shannon Woods15934d52013-08-19 14:28:49 -04007290 switch (target)
7291 {
7292 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7293 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7294 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7295 if (index >= context->getMaxTransformFeedbackBufferBindings())
7296 return gl::error(GL_INVALID_VALUE);
7297 break;
7298 case GL_UNIFORM_BUFFER_START:
7299 case GL_UNIFORM_BUFFER_SIZE:
7300 case GL_UNIFORM_BUFFER_BINDING:
7301 if (index >= context->getMaximumCombinedUniformBufferBindings())
7302 return gl::error(GL_INVALID_VALUE);
7303 break;
7304 default:
7305 return gl::error(GL_INVALID_ENUM);
7306 }
7307
7308 if (!(context->getIndexedIntegerv(target, index, data)))
7309 {
7310 GLenum nativeType;
7311 unsigned int numParams = 0;
7312 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7313 return gl::error(GL_INVALID_ENUM);
7314
7315 if (numParams == 0)
7316 return; // it is known that pname is valid, but there are no parameters to return
7317
7318 if (nativeType == GL_INT_64_ANGLEX)
7319 {
7320 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7321 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7322 GLint64 *int64Params = new GLint64[numParams];
7323
7324 context->getIndexedInteger64v(target, index, int64Params);
7325
7326 for (unsigned int i = 0; i < numParams; ++i)
7327 {
7328 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7329 data[i] = static_cast<GLint>(clampedValue);
7330 }
7331
7332 delete [] int64Params;
7333 }
7334 else
7335 {
7336 UNREACHABLE();
7337 }
7338 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007339 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007340 }
7341 catch(std::bad_alloc&)
7342 {
7343 return gl::error(GL_OUT_OF_MEMORY);
7344 }
7345}
7346
7347void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7348{
7349 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7350
7351 try
7352 {
7353 gl::Context *context = gl::getNonLostContext();
7354
7355 if (context)
7356 {
7357 if (context->getClientVersion() < 3)
7358 {
7359 return gl::error(GL_INVALID_OPERATION);
7360 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007361
Jamie Madill54133512013-06-21 09:33:07 -04007362 // glBeginTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007363 UNIMPLEMENTED();
7364 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007365 }
7366 catch(std::bad_alloc&)
7367 {
7368 return gl::error(GL_OUT_OF_MEMORY);
7369 }
7370}
7371
7372void __stdcall glEndTransformFeedback(void)
7373{
7374 EVENT("(void)");
7375
7376 try
7377 {
7378 gl::Context *context = gl::getNonLostContext();
7379
7380 if (context)
7381 {
7382 if (context->getClientVersion() < 3)
7383 {
7384 return gl::error(GL_INVALID_OPERATION);
7385 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007386
Jamie Madill54133512013-06-21 09:33:07 -04007387 // glEndTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007388 UNIMPLEMENTED();
7389 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007390 }
7391 catch(std::bad_alloc&)
7392 {
7393 return gl::error(GL_OUT_OF_MEMORY);
7394 }
7395}
7396
7397void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7398{
7399 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7400 target, index, buffer, offset, size);
7401
7402 try
7403 {
7404 gl::Context *context = gl::getNonLostContext();
7405
7406 if (context)
7407 {
7408 if (context->getClientVersion() < 3)
7409 {
7410 return gl::error(GL_INVALID_OPERATION);
7411 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007412
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007413 switch (target)
7414 {
7415 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007416 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007417 {
7418 return gl::error(GL_INVALID_VALUE);
7419 }
7420 break;
7421
7422 case GL_UNIFORM_BUFFER:
7423 if (index >= context->getMaximumCombinedUniformBufferBindings())
7424 {
7425 return gl::error(GL_INVALID_VALUE);
7426 }
7427 break;
7428
7429 default:
7430 return gl::error(GL_INVALID_ENUM);
7431 }
7432
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007433 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007434 {
7435 return gl::error(GL_INVALID_VALUE);
7436 }
7437
7438 switch (target)
7439 {
7440 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007441
7442 // size and offset must be a multiple of 4
7443 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7444 {
7445 return gl::error(GL_INVALID_VALUE);
7446 }
7447
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007448 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7449 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007450 break;
7451
7452 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007453
7454 // it is an error to bind an offset not a multiple of the alignment
7455 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7456 {
7457 return gl::error(GL_INVALID_VALUE);
7458 }
7459
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007460 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7461 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007462 break;
7463
7464 default:
7465 UNREACHABLE();
7466 }
7467 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007468 }
7469 catch(std::bad_alloc&)
7470 {
7471 return gl::error(GL_OUT_OF_MEMORY);
7472 }
7473}
7474
7475void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7476{
7477 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7478 target, index, buffer);
7479
7480 try
7481 {
7482 gl::Context *context = gl::getNonLostContext();
7483
7484 if (context)
7485 {
7486 if (context->getClientVersion() < 3)
7487 {
7488 return gl::error(GL_INVALID_OPERATION);
7489 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007490
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007491 switch (target)
7492 {
7493 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007494 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007495 {
7496 return gl::error(GL_INVALID_VALUE);
7497 }
7498 break;
7499
7500 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007501 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007502 {
7503 return gl::error(GL_INVALID_VALUE);
7504 }
7505 break;
7506
7507 default:
7508 return gl::error(GL_INVALID_ENUM);
7509 }
7510
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007511 switch (target)
7512 {
7513 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007514 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007515 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007516 break;
7517
7518 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007519 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007520 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007521 break;
7522
7523 default:
7524 UNREACHABLE();
7525 }
7526 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007527 }
7528 catch(std::bad_alloc&)
7529 {
7530 return gl::error(GL_OUT_OF_MEMORY);
7531 }
7532}
7533
7534void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7535{
7536 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7537 program, count, varyings, bufferMode);
7538
7539 try
7540 {
7541 gl::Context *context = gl::getNonLostContext();
7542
7543 if (context)
7544 {
7545 if (context->getClientVersion() < 3)
7546 {
7547 return gl::error(GL_INVALID_OPERATION);
7548 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007549
Jamie Madill54133512013-06-21 09:33:07 -04007550 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007551 UNIMPLEMENTED();
7552 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007553 }
7554 catch(std::bad_alloc&)
7555 {
7556 return gl::error(GL_OUT_OF_MEMORY);
7557 }
7558}
7559
7560void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7561{
7562 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7563 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7564 program, index, bufSize, length, size, type, name);
7565
7566 try
7567 {
7568 gl::Context *context = gl::getNonLostContext();
7569
7570 if (context)
7571 {
7572 if (context->getClientVersion() < 3)
7573 {
7574 return gl::error(GL_INVALID_OPERATION);
7575 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007576
Jamie Madill54133512013-06-21 09:33:07 -04007577 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007578 UNIMPLEMENTED();
7579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007580 }
7581 catch(std::bad_alloc&)
7582 {
7583 return gl::error(GL_OUT_OF_MEMORY);
7584 }
7585}
7586
7587void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7588{
7589 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7590 index, size, type, stride, pointer);
7591
7592 try
7593 {
7594 gl::Context *context = gl::getNonLostContext();
7595
7596 if (context)
7597 {
7598 if (context->getClientVersion() < 3)
7599 {
7600 return gl::error(GL_INVALID_OPERATION);
7601 }
7602 }
7603
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007604 if (index >= gl::MAX_VERTEX_ATTRIBS)
7605 {
7606 return gl::error(GL_INVALID_VALUE);
7607 }
7608
7609 if (size < 1 || size > 4)
7610 {
7611 return gl::error(GL_INVALID_VALUE);
7612 }
7613
7614 switch (type)
7615 {
7616 case GL_BYTE:
7617 case GL_UNSIGNED_BYTE:
7618 case GL_SHORT:
7619 case GL_UNSIGNED_SHORT:
7620 case GL_INT:
7621 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007622 case GL_INT_2_10_10_10_REV:
7623 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007624 break;
7625 default:
7626 return gl::error(GL_INVALID_ENUM);
7627 }
7628
7629 if (stride < 0)
7630 {
7631 return gl::error(GL_INVALID_VALUE);
7632 }
7633
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007634 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7635 {
7636 return gl::error(GL_INVALID_OPERATION);
7637 }
7638
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007639 if (context)
7640 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007641 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7642 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7643 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7644 // and the pointer argument is not NULL.
7645 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7646 {
7647 return gl::error(GL_INVALID_OPERATION);
7648 }
7649
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007650 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7651 stride, pointer);
7652 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007653 }
7654 catch(std::bad_alloc&)
7655 {
7656 return gl::error(GL_OUT_OF_MEMORY);
7657 }
7658}
7659
7660void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7661{
7662 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7663 index, pname, params);
7664
7665 try
7666 {
7667 gl::Context *context = gl::getNonLostContext();
7668
7669 if (context)
7670 {
7671 if (context->getClientVersion() < 3)
7672 {
7673 return gl::error(GL_INVALID_OPERATION);
7674 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007675
Jamie Madilla7d05862013-07-02 11:57:06 -04007676 if (index >= gl::MAX_VERTEX_ATTRIBS)
7677 {
7678 return gl::error(GL_INVALID_VALUE);
7679 }
7680
7681 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7682
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007683 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007684 {
7685 return;
7686 }
7687
7688 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7689 {
7690 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7691 for (int i = 0; i < 4; ++i)
7692 {
7693 params[i] = currentValueData.IntValues[i];
7694 }
7695 }
7696 else
7697 {
7698 *params = attribState.querySingleParameter<GLint>(pname);
7699 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007700 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007701 }
7702 catch(std::bad_alloc&)
7703 {
7704 return gl::error(GL_OUT_OF_MEMORY);
7705 }
7706}
7707
7708void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7709{
7710 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7711 index, pname, params);
7712
7713 try
7714 {
7715 gl::Context *context = gl::getNonLostContext();
7716
7717 if (context)
7718 {
7719 if (context->getClientVersion() < 3)
7720 {
7721 return gl::error(GL_INVALID_OPERATION);
7722 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007723
Jamie Madilla7d05862013-07-02 11:57:06 -04007724 if (index >= gl::MAX_VERTEX_ATTRIBS)
7725 {
7726 return gl::error(GL_INVALID_VALUE);
7727 }
7728
7729 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7730
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007731 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007732 {
7733 return;
7734 }
7735
7736 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7737 {
7738 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7739 for (int i = 0; i < 4; ++i)
7740 {
7741 params[i] = currentValueData.UnsignedIntValues[i];
7742 }
7743 }
7744 else
7745 {
7746 *params = attribState.querySingleParameter<GLuint>(pname);
7747 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007748 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007749 }
7750 catch(std::bad_alloc&)
7751 {
7752 return gl::error(GL_OUT_OF_MEMORY);
7753 }
7754}
7755
7756void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7757{
7758 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7759 index, x, y, z, w);
7760
7761 try
7762 {
7763 gl::Context *context = gl::getNonLostContext();
7764
7765 if (context)
7766 {
7767 if (context->getClientVersion() < 3)
7768 {
7769 return gl::error(GL_INVALID_OPERATION);
7770 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007771
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007772 if (index >= gl::MAX_VERTEX_ATTRIBS)
7773 {
7774 return gl::error(GL_INVALID_VALUE);
7775 }
7776
7777 GLint vals[4] = { x, y, z, w };
7778 context->setVertexAttribi(index, vals);
7779 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007780 }
7781 catch(std::bad_alloc&)
7782 {
7783 return gl::error(GL_OUT_OF_MEMORY);
7784 }
7785}
7786
7787void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7788{
7789 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7790 index, x, y, z, w);
7791
7792 try
7793 {
7794 gl::Context *context = gl::getNonLostContext();
7795
7796 if (context)
7797 {
7798 if (context->getClientVersion() < 3)
7799 {
7800 return gl::error(GL_INVALID_OPERATION);
7801 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007802
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007803 if (index >= gl::MAX_VERTEX_ATTRIBS)
7804 {
7805 return gl::error(GL_INVALID_VALUE);
7806 }
7807
7808 GLuint vals[4] = { x, y, z, w };
7809 context->setVertexAttribu(index, vals);
7810 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007811 }
7812 catch(std::bad_alloc&)
7813 {
7814 return gl::error(GL_OUT_OF_MEMORY);
7815 }
7816}
7817
7818void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7819{
7820 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7821
7822 try
7823 {
7824 gl::Context *context = gl::getNonLostContext();
7825
7826 if (context)
7827 {
7828 if (context->getClientVersion() < 3)
7829 {
7830 return gl::error(GL_INVALID_OPERATION);
7831 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007832
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007833 if (index >= gl::MAX_VERTEX_ATTRIBS)
7834 {
7835 return gl::error(GL_INVALID_VALUE);
7836 }
7837
7838 context->setVertexAttribi(index, v);
7839 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007840 }
7841 catch(std::bad_alloc&)
7842 {
7843 return gl::error(GL_OUT_OF_MEMORY);
7844 }
7845}
7846
7847void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7848{
7849 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7850
7851 try
7852 {
7853 gl::Context *context = gl::getNonLostContext();
7854
7855 if (context)
7856 {
7857 if (context->getClientVersion() < 3)
7858 {
7859 return gl::error(GL_INVALID_OPERATION);
7860 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007861
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007862 if (index >= gl::MAX_VERTEX_ATTRIBS)
7863 {
7864 return gl::error(GL_INVALID_VALUE);
7865 }
7866
7867 context->setVertexAttribu(index, v);
7868 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007869 }
7870 catch(std::bad_alloc&)
7871 {
7872 return gl::error(GL_OUT_OF_MEMORY);
7873 }
7874}
7875
7876void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7877{
7878 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7879 program, location, params);
7880
7881 try
7882 {
7883 gl::Context *context = gl::getNonLostContext();
7884
7885 if (context)
7886 {
7887 if (context->getClientVersion() < 3)
7888 {
7889 return gl::error(GL_INVALID_OPERATION);
7890 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007891
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007892 if (program == 0)
7893 {
7894 return gl::error(GL_INVALID_VALUE);
7895 }
7896
7897 gl::Program *programObject = context->getProgram(program);
7898
7899 if (!programObject || !programObject->isLinked())
7900 {
7901 return gl::error(GL_INVALID_OPERATION);
7902 }
7903
7904 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7905 if (!programBinary)
7906 {
7907 return gl::error(GL_INVALID_OPERATION);
7908 }
7909
7910 if (!programBinary->getUniformuiv(location, NULL, params))
7911 {
7912 return gl::error(GL_INVALID_OPERATION);
7913 }
7914 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007915 }
7916 catch(std::bad_alloc&)
7917 {
7918 return gl::error(GL_OUT_OF_MEMORY);
7919 }
7920}
7921
7922GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7923{
7924 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7925 program, name);
7926
7927 try
7928 {
7929 gl::Context *context = gl::getNonLostContext();
7930
7931 if (context)
7932 {
7933 if (context->getClientVersion() < 3)
7934 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007935 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007936 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007937
Jamie Madilld1e78c92013-06-20 11:55:50 -04007938 if (program == 0)
7939 {
7940 return gl::error(GL_INVALID_VALUE, -1);
7941 }
7942
7943 gl::Program *programObject = context->getProgram(program);
7944
7945 if (!programObject || !programObject->isLinked())
7946 {
7947 return gl::error(GL_INVALID_OPERATION, -1);
7948 }
7949
7950 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7951 if (!programBinary)
7952 {
7953 return gl::error(GL_INVALID_OPERATION, -1);
7954 }
7955
7956 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007957 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007958 }
7959 catch(std::bad_alloc&)
7960 {
7961 return gl::error(GL_OUT_OF_MEMORY, 0);
7962 }
7963
7964 return 0;
7965}
7966
7967void __stdcall glUniform1ui(GLint location, GLuint v0)
7968{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007969 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007970}
7971
7972void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
7973{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007974 const GLuint xy[] = { v0, v1 };
7975 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007976}
7977
7978void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
7979{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007980 const GLuint xyz[] = { v0, v1, v2 };
7981 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007982}
7983
7984void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
7985{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007986 const GLuint xyzw[] = { v0, v1, v2, v3 };
7987 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007988}
7989
7990void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
7991{
7992 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7993 location, count, value);
7994
7995 try
7996 {
7997 gl::Context *context = gl::getNonLostContext();
7998
7999 if (context)
8000 {
8001 if (context->getClientVersion() < 3)
8002 {
8003 return gl::error(GL_INVALID_OPERATION);
8004 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008005
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008006 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8007 if (!programBinary)
8008 {
8009 return gl::error(GL_INVALID_OPERATION);
8010 }
8011
8012 if (!programBinary->setUniform1uiv(location, count, value))
8013 {
8014 return gl::error(GL_INVALID_OPERATION);
8015 }
8016 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008017 }
8018 catch(std::bad_alloc&)
8019 {
8020 return gl::error(GL_OUT_OF_MEMORY);
8021 }
8022}
8023
8024void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8025{
8026 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8027 location, count, value);
8028
8029 try
8030 {
8031 gl::Context *context = gl::getNonLostContext();
8032
8033 if (context)
8034 {
8035 if (context->getClientVersion() < 3)
8036 {
8037 return gl::error(GL_INVALID_OPERATION);
8038 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008039
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008040 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8041 if (!programBinary)
8042 {
8043 return gl::error(GL_INVALID_OPERATION);
8044 }
8045
8046 if (!programBinary->setUniform2uiv(location, count, value))
8047 {
8048 return gl::error(GL_INVALID_OPERATION);
8049 }
8050 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008051 }
8052 catch(std::bad_alloc&)
8053 {
8054 return gl::error(GL_OUT_OF_MEMORY);
8055 }
8056}
8057
8058void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8059{
8060 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8061 location, count, value);
8062
8063 try
8064 {
8065 gl::Context *context = gl::getNonLostContext();
8066
8067 if (context)
8068 {
8069 if (context->getClientVersion() < 3)
8070 {
8071 return gl::error(GL_INVALID_OPERATION);
8072 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008073
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008074 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8075 if (!programBinary)
8076 {
8077 return gl::error(GL_INVALID_OPERATION);
8078 }
8079
8080 if (!programBinary->setUniform3uiv(location, count, value))
8081 {
8082 return gl::error(GL_INVALID_OPERATION);
8083 }
8084 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008085 }
8086 catch(std::bad_alloc&)
8087 {
8088 return gl::error(GL_OUT_OF_MEMORY);
8089 }
8090}
8091
8092void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8093{
8094 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8095 location, count, value);
8096
8097 try
8098 {
8099 gl::Context *context = gl::getNonLostContext();
8100
8101 if (context)
8102 {
8103 if (context->getClientVersion() < 3)
8104 {
8105 return gl::error(GL_INVALID_OPERATION);
8106 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008107
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008108 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8109 if (!programBinary)
8110 {
8111 return gl::error(GL_INVALID_OPERATION);
8112 }
8113
8114 if (!programBinary->setUniform4uiv(location, count, value))
8115 {
8116 return gl::error(GL_INVALID_OPERATION);
8117 }
8118 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008119 }
8120 catch(std::bad_alloc&)
8121 {
8122 return gl::error(GL_OUT_OF_MEMORY);
8123 }
8124}
8125
8126void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8127{
8128 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8129 buffer, drawbuffer, value);
8130
8131 try
8132 {
8133 gl::Context *context = gl::getNonLostContext();
8134
8135 if (context)
8136 {
8137 if (context->getClientVersion() < 3)
8138 {
8139 return gl::error(GL_INVALID_OPERATION);
8140 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008141
Geoff Lang42359ca2013-08-21 13:25:17 -04008142 switch (buffer)
8143 {
8144 case GL_COLOR:
8145 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8146 {
8147 return gl::error(GL_INVALID_VALUE);
8148 }
8149 break;
8150 case GL_STENCIL:
8151 if (drawbuffer != 0)
8152 {
8153 return gl::error(GL_INVALID_VALUE);
8154 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05008155 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04008156 default:
8157 return gl::error(GL_INVALID_ENUM);
8158 }
8159
8160 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008161 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008162 }
8163 catch(std::bad_alloc&)
8164 {
8165 return gl::error(GL_OUT_OF_MEMORY);
8166 }
8167}
8168
8169void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8170{
8171 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8172 buffer, drawbuffer, value);
8173
8174 try
8175 {
8176 gl::Context *context = gl::getNonLostContext();
8177
8178 if (context)
8179 {
8180 if (context->getClientVersion() < 3)
8181 {
8182 return gl::error(GL_INVALID_OPERATION);
8183 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008184
Geoff Lang42359ca2013-08-21 13:25:17 -04008185 switch (buffer)
8186 {
8187 case GL_COLOR:
8188 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8189 {
8190 return gl::error(GL_INVALID_VALUE);
8191 }
8192 break;
8193 default:
8194 return gl::error(GL_INVALID_ENUM);
8195 }
8196
8197 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008198 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008199 }
8200 catch(std::bad_alloc&)
8201 {
8202 return gl::error(GL_OUT_OF_MEMORY);
8203 }
8204}
8205
8206void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8207{
8208 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8209 buffer, drawbuffer, value);
8210
8211 try
8212 {
8213 gl::Context *context = gl::getNonLostContext();
8214
8215 if (context)
8216 {
8217 if (context->getClientVersion() < 3)
8218 {
8219 return gl::error(GL_INVALID_OPERATION);
8220 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008221
Geoff Lang42359ca2013-08-21 13:25:17 -04008222 switch (buffer)
8223 {
8224 case GL_COLOR:
8225 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8226 {
8227 return gl::error(GL_INVALID_VALUE);
8228 }
8229 break;
8230 case GL_DEPTH:
8231 if (drawbuffer != 0)
8232 {
8233 return gl::error(GL_INVALID_VALUE);
8234 }
8235 break;
8236 default:
8237 return gl::error(GL_INVALID_ENUM);
8238 }
8239
8240 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008241 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008242 }
8243 catch(std::bad_alloc&)
8244 {
8245 return gl::error(GL_OUT_OF_MEMORY);
8246 }
8247}
8248
8249void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8250{
8251 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8252 buffer, drawbuffer, depth, stencil);
8253
8254 try
8255 {
8256 gl::Context *context = gl::getNonLostContext();
8257
8258 if (context)
8259 {
8260 if (context->getClientVersion() < 3)
8261 {
8262 return gl::error(GL_INVALID_OPERATION);
8263 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008264
Geoff Lang42359ca2013-08-21 13:25:17 -04008265 switch (buffer)
8266 {
8267 case GL_DEPTH_STENCIL:
8268 if (drawbuffer != 0)
8269 {
8270 return gl::error(GL_INVALID_VALUE);
8271 }
8272 break;
8273 default:
8274 return gl::error(GL_INVALID_ENUM);
8275 }
8276
8277 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008278 }
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
8286const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8287{
8288 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8289
8290 try
8291 {
8292 gl::Context *context = gl::getNonLostContext();
8293
8294 if (context)
8295 {
8296 if (context->getClientVersion() < 3)
8297 {
8298 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8299 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008300
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008301 if (name != GL_EXTENSIONS)
8302 {
8303 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8304 }
8305
8306 if (index >= context->getNumExtensions())
8307 {
8308 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8309 }
8310
8311 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
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, reinterpret_cast<GLubyte*>(NULL));
8317 }
8318
8319 return NULL;
8320}
8321
8322void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8323{
8324 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8325 readTarget, writeTarget, readOffset, writeOffset, size);
8326
8327 try
8328 {
8329 gl::Context *context = gl::getNonLostContext();
8330
8331 if (context)
8332 {
8333 if (context->getClientVersion() < 3)
8334 {
8335 return gl::error(GL_INVALID_OPERATION);
8336 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008337
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008338 gl::Buffer *readBuffer = NULL;
8339 switch (readTarget)
8340 {
8341 case GL_ARRAY_BUFFER:
8342 readBuffer = context->getArrayBuffer();
8343 break;
8344 case GL_COPY_READ_BUFFER:
8345 readBuffer = context->getCopyReadBuffer();
8346 break;
8347 case GL_COPY_WRITE_BUFFER:
8348 readBuffer = context->getCopyWriteBuffer();
8349 break;
8350 case GL_ELEMENT_ARRAY_BUFFER:
8351 readBuffer = context->getElementArrayBuffer();
8352 break;
8353 case GL_PIXEL_PACK_BUFFER:
8354 readBuffer = context->getPixelPackBuffer();
8355 break;
8356 case GL_PIXEL_UNPACK_BUFFER:
8357 readBuffer = context->getPixelUnpackBuffer();
8358 break;
8359 case GL_TRANSFORM_FEEDBACK_BUFFER:
8360 readBuffer = context->getGenericTransformFeedbackBuffer();
8361 break;
8362 case GL_UNIFORM_BUFFER:
8363 readBuffer = context->getGenericUniformBuffer();
8364 break;
8365 default:
8366 return gl::error(GL_INVALID_ENUM);
8367 }
8368
8369 gl::Buffer *writeBuffer = NULL;
8370 switch (writeTarget)
8371 {
8372 case GL_ARRAY_BUFFER:
8373 writeBuffer = context->getArrayBuffer();
8374 break;
8375 case GL_COPY_READ_BUFFER:
8376 writeBuffer = context->getCopyReadBuffer();
8377 break;
8378 case GL_COPY_WRITE_BUFFER:
8379 writeBuffer = context->getCopyWriteBuffer();
8380 break;
8381 case GL_ELEMENT_ARRAY_BUFFER:
8382 writeBuffer = context->getElementArrayBuffer();
8383 break;
8384 case GL_PIXEL_PACK_BUFFER:
8385 writeBuffer = context->getPixelPackBuffer();
8386 break;
8387 case GL_PIXEL_UNPACK_BUFFER:
8388 writeBuffer = context->getPixelUnpackBuffer();
8389 break;
8390 case GL_TRANSFORM_FEEDBACK_BUFFER:
8391 writeBuffer = context->getGenericTransformFeedbackBuffer();
8392 break;
8393 case GL_UNIFORM_BUFFER:
8394 writeBuffer = context->getGenericUniformBuffer();
8395 break;
8396 default:
8397 return gl::error(GL_INVALID_ENUM);
8398 }
8399
8400 if (!readBuffer || !writeBuffer)
8401 {
8402 return gl::error(GL_INVALID_OPERATION);
8403 }
8404
8405 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8406 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8407 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8408 {
8409 return gl::error(GL_INVALID_VALUE);
8410 }
8411
8412 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8413 {
8414 return gl::error(GL_INVALID_VALUE);
8415 }
8416
8417 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8418
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008419 // if size is zero, the copy is a successful no-op
8420 if (size > 0)
8421 {
8422 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8423 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008424 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008425 }
8426 catch(std::bad_alloc&)
8427 {
8428 return gl::error(GL_OUT_OF_MEMORY);
8429 }
8430}
8431
8432void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8433{
8434 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8435 program, uniformCount, uniformNames, uniformIndices);
8436
8437 try
8438 {
8439 gl::Context *context = gl::getNonLostContext();
8440
8441 if (context)
8442 {
8443 if (context->getClientVersion() < 3)
8444 {
8445 return gl::error(GL_INVALID_OPERATION);
8446 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008447
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008448 if (uniformCount < 0)
8449 {
8450 return gl::error(GL_INVALID_VALUE);
8451 }
8452
8453 gl::Program *programObject = context->getProgram(program);
8454
8455 if (!programObject)
8456 {
8457 if (context->getShader(program))
8458 {
8459 return gl::error(GL_INVALID_OPERATION);
8460 }
8461 else
8462 {
8463 return gl::error(GL_INVALID_VALUE);
8464 }
8465 }
8466
8467 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8468 if (!programObject->isLinked() || !programBinary)
8469 {
8470 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8471 {
8472 uniformIndices[uniformId] = GL_INVALID_INDEX;
8473 }
8474 }
8475 else
8476 {
8477 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8478 {
8479 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8480 }
8481 }
8482 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008483 }
8484 catch(std::bad_alloc&)
8485 {
8486 return gl::error(GL_OUT_OF_MEMORY);
8487 }
8488}
8489
8490void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8491{
8492 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8493 program, uniformCount, uniformIndices, pname, params);
8494
8495 try
8496 {
8497 gl::Context *context = gl::getNonLostContext();
8498
8499 if (context)
8500 {
8501 if (context->getClientVersion() < 3)
8502 {
8503 return gl::error(GL_INVALID_OPERATION);
8504 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008505
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008506 if (uniformCount < 0)
8507 {
8508 return gl::error(GL_INVALID_VALUE);
8509 }
8510
8511 gl::Program *programObject = context->getProgram(program);
8512
8513 if (!programObject)
8514 {
8515 if (context->getShader(program))
8516 {
8517 return gl::error(GL_INVALID_OPERATION);
8518 }
8519 else
8520 {
8521 return gl::error(GL_INVALID_VALUE);
8522 }
8523 }
8524
8525 switch (pname)
8526 {
8527 case GL_UNIFORM_TYPE:
8528 case GL_UNIFORM_SIZE:
8529 case GL_UNIFORM_NAME_LENGTH:
8530 case GL_UNIFORM_BLOCK_INDEX:
8531 case GL_UNIFORM_OFFSET:
8532 case GL_UNIFORM_ARRAY_STRIDE:
8533 case GL_UNIFORM_MATRIX_STRIDE:
8534 case GL_UNIFORM_IS_ROW_MAJOR:
8535 break;
8536 default:
8537 return gl::error(GL_INVALID_ENUM);
8538 }
8539
8540 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8541
8542 if (!programBinary && uniformCount > 0)
8543 {
8544 return gl::error(GL_INVALID_VALUE);
8545 }
8546
8547 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8548 {
8549 const GLuint index = uniformIndices[uniformId];
8550
8551 if (index >= (GLuint)programBinary->getActiveUniformCount())
8552 {
8553 return gl::error(GL_INVALID_VALUE);
8554 }
8555 }
8556
8557 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8558 {
8559 const GLuint index = uniformIndices[uniformId];
8560 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8561 }
8562 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008563 }
8564 catch(std::bad_alloc&)
8565 {
8566 return gl::error(GL_OUT_OF_MEMORY);
8567 }
8568}
8569
8570GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8571{
8572 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8573
8574 try
8575 {
8576 gl::Context *context = gl::getNonLostContext();
8577
8578 if (context)
8579 {
8580 if (context->getClientVersion() < 3)
8581 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008582 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008583 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008584
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008585 gl::Program *programObject = context->getProgram(program);
8586
8587 if (!programObject)
8588 {
8589 if (context->getShader(program))
8590 {
8591 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8592 }
8593 else
8594 {
8595 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8596 }
8597 }
8598
8599 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8600 if (!programBinary)
8601 {
8602 return GL_INVALID_INDEX;
8603 }
8604
8605 return programBinary->getUniformBlockIndex(uniformBlockName);
8606 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008607 }
8608 catch(std::bad_alloc&)
8609 {
8610 return gl::error(GL_OUT_OF_MEMORY, 0);
8611 }
8612
8613 return 0;
8614}
8615
8616void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8617{
8618 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8619 program, uniformBlockIndex, pname, params);
8620
8621 try
8622 {
8623 gl::Context *context = gl::getNonLostContext();
8624
8625 if (context)
8626 {
8627 if (context->getClientVersion() < 3)
8628 {
8629 return gl::error(GL_INVALID_OPERATION);
8630 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008631 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008632
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008633 if (!programObject)
8634 {
8635 if (context->getShader(program))
8636 {
8637 return gl::error(GL_INVALID_OPERATION);
8638 }
8639 else
8640 {
8641 return gl::error(GL_INVALID_VALUE);
8642 }
8643 }
8644
8645 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8646
8647 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8648 {
8649 return gl::error(GL_INVALID_VALUE);
8650 }
8651
8652 switch (pname)
8653 {
8654 case GL_UNIFORM_BLOCK_BINDING:
8655 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8656 break;
8657
8658 case GL_UNIFORM_BLOCK_DATA_SIZE:
8659 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8660 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8661 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8662 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8663 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8664 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8665 break;
8666
8667 default:
8668 return gl::error(GL_INVALID_ENUM);
8669 }
8670 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008671 }
8672 catch(std::bad_alloc&)
8673 {
8674 return gl::error(GL_OUT_OF_MEMORY);
8675 }
8676}
8677
8678void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8679{
8680 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8681 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8682
8683 try
8684 {
8685 gl::Context *context = gl::getNonLostContext();
8686
8687 if (context)
8688 {
8689 if (context->getClientVersion() < 3)
8690 {
8691 return gl::error(GL_INVALID_OPERATION);
8692 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008693
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008694 gl::Program *programObject = context->getProgram(program);
8695
8696 if (!programObject)
8697 {
8698 if (context->getShader(program))
8699 {
8700 return gl::error(GL_INVALID_OPERATION);
8701 }
8702 else
8703 {
8704 return gl::error(GL_INVALID_VALUE);
8705 }
8706 }
8707
8708 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8709
8710 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8711 {
8712 return gl::error(GL_INVALID_VALUE);
8713 }
8714
8715 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8716 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008717 }
8718 catch(std::bad_alloc&)
8719 {
8720 return gl::error(GL_OUT_OF_MEMORY);
8721 }
8722}
8723
8724void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8725{
8726 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8727 program, uniformBlockIndex, uniformBlockBinding);
8728
8729 try
8730 {
8731 gl::Context *context = gl::getNonLostContext();
8732
8733 if (context)
8734 {
8735 if (context->getClientVersion() < 3)
8736 {
8737 return gl::error(GL_INVALID_OPERATION);
8738 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008739
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008740 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8741 {
8742 return gl::error(GL_INVALID_VALUE);
8743 }
8744
8745 gl::Program *programObject = context->getProgram(program);
8746
8747 if (!programObject)
8748 {
8749 if (context->getShader(program))
8750 {
8751 return gl::error(GL_INVALID_OPERATION);
8752 }
8753 else
8754 {
8755 return gl::error(GL_INVALID_VALUE);
8756 }
8757 }
8758
8759 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8760
8761 // if never linked, there won't be any uniform blocks
8762 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8763 {
8764 return gl::error(GL_INVALID_VALUE);
8765 }
8766
8767 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8768 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008769 }
8770 catch(std::bad_alloc&)
8771 {
8772 return gl::error(GL_OUT_OF_MEMORY);
8773 }
8774}
8775
8776void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8777{
8778 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8779 mode, first, count, instanceCount);
8780
8781 try
8782 {
8783 gl::Context *context = gl::getNonLostContext();
8784
8785 if (context)
8786 {
8787 if (context->getClientVersion() < 3)
8788 {
8789 return gl::error(GL_INVALID_OPERATION);
8790 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008791
Jamie Madill54133512013-06-21 09:33:07 -04008792 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008793 UNIMPLEMENTED();
8794 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008795 }
8796 catch(std::bad_alloc&)
8797 {
8798 return gl::error(GL_OUT_OF_MEMORY);
8799 }
8800}
8801
8802void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8803{
8804 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8805 mode, count, type, indices, instanceCount);
8806
8807 try
8808 {
8809 gl::Context *context = gl::getNonLostContext();
8810
8811 if (context)
8812 {
8813 if (context->getClientVersion() < 3)
8814 {
8815 return gl::error(GL_INVALID_OPERATION);
8816 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008817
Jamie Madill54133512013-06-21 09:33:07 -04008818 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008819 UNIMPLEMENTED();
8820 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008821 }
8822 catch(std::bad_alloc&)
8823 {
8824 return gl::error(GL_OUT_OF_MEMORY);
8825 }
8826}
8827
8828GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8829{
8830 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8831
8832 try
8833 {
8834 gl::Context *context = gl::getNonLostContext();
8835
8836 if (context)
8837 {
8838 if (context->getClientVersion() < 3)
8839 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008840 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008842
Jamie Madill5215e1a2013-07-26 11:55:19 -04008843 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8844 {
8845 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8846 }
8847
8848 if (flags != 0)
8849 {
8850 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8851 }
8852
8853 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008854 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008855 }
8856 catch(std::bad_alloc&)
8857 {
8858 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8859 }
8860
8861 return NULL;
8862}
8863
8864GLboolean __stdcall glIsSync(GLsync sync)
8865{
8866 EVENT("(GLsync sync = 0x%0.8p)", sync);
8867
8868 try
8869 {
8870 gl::Context *context = gl::getNonLostContext();
8871
8872 if (context)
8873 {
8874 if (context->getClientVersion() < 3)
8875 {
8876 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8877 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008878
Jamie Madill5215e1a2013-07-26 11:55:19 -04008879 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008880 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008881 }
8882 catch(std::bad_alloc&)
8883 {
8884 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8885 }
8886
8887 return GL_FALSE;
8888}
8889
8890void __stdcall glDeleteSync(GLsync sync)
8891{
8892 EVENT("(GLsync sync = 0x%0.8p)", sync);
8893
8894 try
8895 {
8896 gl::Context *context = gl::getNonLostContext();
8897
8898 if (context)
8899 {
8900 if (context->getClientVersion() < 3)
8901 {
8902 return gl::error(GL_INVALID_OPERATION);
8903 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008904
Jamie Madill5215e1a2013-07-26 11:55:19 -04008905 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8906 {
8907 return gl::error(GL_INVALID_VALUE);
8908 }
8909
8910 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008911 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008912 }
8913 catch(std::bad_alloc&)
8914 {
8915 return gl::error(GL_OUT_OF_MEMORY);
8916 }
8917}
8918
8919GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8920{
8921 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8922 sync, flags, timeout);
8923
8924 try
8925 {
8926 gl::Context *context = gl::getNonLostContext();
8927
8928 if (context)
8929 {
8930 if (context->getClientVersion() < 3)
8931 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008932 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008933 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008934
Jamie Madill5215e1a2013-07-26 11:55:19 -04008935 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8936 {
8937 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8938 }
8939
8940 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8941
8942 if (!fenceSync)
8943 {
8944 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8945 }
8946
8947 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008948 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008949 }
8950 catch(std::bad_alloc&)
8951 {
8952 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8953 }
8954
8955 return GL_FALSE;
8956}
8957
8958void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8959{
8960 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8961 sync, flags, timeout);
8962
8963 try
8964 {
8965 gl::Context *context = gl::getNonLostContext();
8966
8967 if (context)
8968 {
8969 if (context->getClientVersion() < 3)
8970 {
8971 return gl::error(GL_INVALID_OPERATION);
8972 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008973
Jamie Madill5215e1a2013-07-26 11:55:19 -04008974 if (flags != 0)
8975 {
8976 return gl::error(GL_INVALID_VALUE);
8977 }
8978
8979 if (timeout != GL_TIMEOUT_IGNORED)
8980 {
8981 return gl::error(GL_INVALID_VALUE);
8982 }
8983
8984 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8985
8986 if (!fenceSync)
8987 {
8988 return gl::error(GL_INVALID_VALUE);
8989 }
8990
8991 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008992 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008993 }
8994 catch(std::bad_alloc&)
8995 {
8996 return gl::error(GL_OUT_OF_MEMORY);
8997 }
8998}
8999
9000void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9001{
9002 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9003 pname, params);
9004
9005 try
9006 {
9007 gl::Context *context = gl::getNonLostContext();
9008
9009 if (context)
9010 {
9011 if (context->getClientVersion() < 3)
9012 {
9013 return gl::error(GL_INVALID_OPERATION);
9014 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009015
Jamie Madill79f2f452013-12-19 11:13:02 -05009016 GLenum nativeType;
9017 unsigned int numParams = 0;
9018 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9019 return gl::error(GL_INVALID_ENUM);
9020
9021 // pname is valid, but that there are no parameters to return.
9022 if (numParams == 0)
9023 return;
9024
9025 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009026 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009027 context->getInteger64v(pname, params);
9028 }
Jamie Madill55856b12014-01-02 13:59:50 -05009029 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009030 {
Jamie Madill55856b12014-01-02 13:59:50 -05009031 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009032 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009033 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009034 }
9035 catch(std::bad_alloc&)
9036 {
9037 return gl::error(GL_OUT_OF_MEMORY);
9038 }
9039}
9040
9041void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9042{
9043 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9044 sync, pname, bufSize, length, values);
9045
9046 try
9047 {
9048 gl::Context *context = gl::getNonLostContext();
9049
9050 if (context)
9051 {
9052 if (context->getClientVersion() < 3)
9053 {
9054 return gl::error(GL_INVALID_OPERATION);
9055 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009056
Jamie Madill5215e1a2013-07-26 11:55:19 -04009057 if (bufSize < 0)
9058 {
9059 return gl::error(GL_INVALID_VALUE);
9060 }
9061
9062 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9063
9064 if (!fenceSync)
9065 {
9066 return gl::error(GL_INVALID_VALUE);
9067 }
9068
9069 switch (pname)
9070 {
9071 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9072 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9073 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9074 case GL_SYNC_FLAGS: values[0] = 0; break;
9075
9076 default:
9077 return gl::error(GL_INVALID_ENUM);
9078 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009079 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009080 }
9081 catch(std::bad_alloc&)
9082 {
9083 return gl::error(GL_OUT_OF_MEMORY);
9084 }
9085}
9086
9087void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9088{
9089 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9090 target, index, data);
9091
9092 try
9093 {
9094 gl::Context *context = gl::getNonLostContext();
9095
9096 if (context)
9097 {
9098 if (context->getClientVersion() < 3)
9099 {
9100 return gl::error(GL_INVALID_OPERATION);
9101 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009102
Shannon Woods15934d52013-08-19 14:28:49 -04009103 switch (target)
9104 {
9105 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9106 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9107 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9108 if (index >= context->getMaxTransformFeedbackBufferBindings())
9109 return gl::error(GL_INVALID_VALUE);
9110 break;
9111 case GL_UNIFORM_BUFFER_START:
9112 case GL_UNIFORM_BUFFER_SIZE:
9113 case GL_UNIFORM_BUFFER_BINDING:
9114 if (index >= context->getMaximumCombinedUniformBufferBindings())
9115 return gl::error(GL_INVALID_VALUE);
9116 break;
9117 default:
9118 return gl::error(GL_INVALID_ENUM);
9119 }
9120
9121 if (!(context->getIndexedInteger64v(target, index, data)))
9122 {
9123 GLenum nativeType;
9124 unsigned int numParams = 0;
9125 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9126 return gl::error(GL_INVALID_ENUM);
9127
9128 if (numParams == 0)
9129 return; // it is known that pname is valid, but there are no parameters to return
9130
9131 if (nativeType == GL_INT)
9132 {
9133 GLint *intParams = new GLint[numParams];
9134
9135 context->getIndexedIntegerv(target, index, intParams);
9136
9137 for (unsigned int i = 0; i < numParams; ++i)
9138 {
9139 data[i] = static_cast<GLint64>(intParams[i]);
9140 }
9141
9142 delete [] intParams;
9143 }
9144 else
9145 {
9146 UNREACHABLE();
9147 }
9148 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009149 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009150 }
9151 catch(std::bad_alloc&)
9152 {
9153 return gl::error(GL_OUT_OF_MEMORY);
9154 }
9155}
9156
9157void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9158{
9159 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9160 target, pname, params);
9161
9162 try
9163 {
9164 gl::Context *context = gl::getNonLostContext();
9165
9166 if (context)
9167 {
9168 if (context->getClientVersion() < 3)
9169 {
9170 return gl::error(GL_INVALID_OPERATION);
9171 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009172
Jamie Madill54133512013-06-21 09:33:07 -04009173 // glGetBufferParameteri64v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009174 UNIMPLEMENTED();
9175 }
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);
9180 }
9181}
9182
9183void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9184{
9185 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9186
9187 try
9188 {
9189 gl::Context *context = gl::getNonLostContext();
9190
9191 if (context)
9192 {
9193 if (context->getClientVersion() < 3)
9194 {
9195 return gl::error(GL_INVALID_OPERATION);
9196 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009197
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009198 if (count < 0)
9199 {
9200 return gl::error(GL_INVALID_VALUE);
9201 }
9202
9203 for (int i = 0; i < count; i++)
9204 {
9205 samplers[i] = context->createSampler();
9206 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009207 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009208 }
9209 catch(std::bad_alloc&)
9210 {
9211 return gl::error(GL_OUT_OF_MEMORY);
9212 }
9213}
9214
9215void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9216{
9217 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9218
9219 try
9220 {
9221 gl::Context *context = gl::getNonLostContext();
9222
9223 if (context)
9224 {
9225 if (context->getClientVersion() < 3)
9226 {
9227 return gl::error(GL_INVALID_OPERATION);
9228 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009229
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009230 if (count < 0)
9231 {
9232 return gl::error(GL_INVALID_VALUE);
9233 }
9234
9235 for (int i = 0; i < count; i++)
9236 {
9237 context->deleteSampler(samplers[i]);
9238 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009239 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009240 }
9241 catch(std::bad_alloc&)
9242 {
9243 return gl::error(GL_OUT_OF_MEMORY);
9244 }
9245}
9246
9247GLboolean __stdcall glIsSampler(GLuint sampler)
9248{
9249 EVENT("(GLuint sampler = %u)", sampler);
9250
9251 try
9252 {
9253 gl::Context *context = gl::getNonLostContext();
9254
9255 if (context)
9256 {
9257 if (context->getClientVersion() < 3)
9258 {
9259 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9260 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009261
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009262 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009263 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009264 }
9265 catch(std::bad_alloc&)
9266 {
9267 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9268 }
9269
9270 return GL_FALSE;
9271}
9272
9273void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9274{
9275 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9276
9277 try
9278 {
9279 gl::Context *context = gl::getNonLostContext();
9280
9281 if (context)
9282 {
9283 if (context->getClientVersion() < 3)
9284 {
9285 return gl::error(GL_INVALID_OPERATION);
9286 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009287
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009288 if (sampler != 0 && !context->isSampler(sampler))
9289 {
9290 return gl::error(GL_INVALID_OPERATION);
9291 }
9292
9293 if (unit >= context->getMaximumCombinedTextureImageUnits())
9294 {
9295 return gl::error(GL_INVALID_VALUE);
9296 }
9297
9298 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009299 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009300 }
9301 catch(std::bad_alloc&)
9302 {
9303 return gl::error(GL_OUT_OF_MEMORY);
9304 }
9305}
9306
9307void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9308{
9309 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9310
9311 try
9312 {
9313 gl::Context *context = gl::getNonLostContext();
9314
9315 if (context)
9316 {
9317 if (context->getClientVersion() < 3)
9318 {
9319 return gl::error(GL_INVALID_OPERATION);
9320 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009321
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009322 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009323 {
9324 return;
9325 }
9326
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009327 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009328 {
9329 return;
9330 }
9331
9332 if (!context->isSampler(sampler))
9333 {
9334 return gl::error(GL_INVALID_OPERATION);
9335 }
9336
9337 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009338 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009339 }
9340 catch(std::bad_alloc&)
9341 {
9342 return gl::error(GL_OUT_OF_MEMORY);
9343 }
9344}
9345
9346void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9347{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009348 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009349}
9350
9351void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9352{
9353 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9354
9355 try
9356 {
9357 gl::Context *context = gl::getNonLostContext();
9358
9359 if (context)
9360 {
9361 if (context->getClientVersion() < 3)
9362 {
9363 return gl::error(GL_INVALID_OPERATION);
9364 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009365
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009366 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009367 {
9368 return;
9369 }
9370
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009371 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009372 {
9373 return;
9374 }
9375
9376 if (!context->isSampler(sampler))
9377 {
9378 return gl::error(GL_INVALID_OPERATION);
9379 }
9380
9381 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009382 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009383 }
9384 catch(std::bad_alloc&)
9385 {
9386 return gl::error(GL_OUT_OF_MEMORY);
9387 }
9388}
9389
9390void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9391{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009392 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009393}
9394
9395void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9396{
9397 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9398
9399 try
9400 {
9401 gl::Context *context = gl::getNonLostContext();
9402
9403 if (context)
9404 {
9405 if (context->getClientVersion() < 3)
9406 {
9407 return gl::error(GL_INVALID_OPERATION);
9408 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009409
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009410 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009411 {
9412 return;
9413 }
9414
9415 if (!context->isSampler(sampler))
9416 {
9417 return gl::error(GL_INVALID_OPERATION);
9418 }
9419
9420 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009421 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009422 }
9423 catch(std::bad_alloc&)
9424 {
9425 return gl::error(GL_OUT_OF_MEMORY);
9426 }
9427}
9428
9429void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9430{
9431 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9432
9433 try
9434 {
9435 gl::Context *context = gl::getNonLostContext();
9436
9437 if (context)
9438 {
9439 if (context->getClientVersion() < 3)
9440 {
9441 return gl::error(GL_INVALID_OPERATION);
9442 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009443
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009444 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009445 {
9446 return;
9447 }
9448
9449 if (!context->isSampler(sampler))
9450 {
9451 return gl::error(GL_INVALID_OPERATION);
9452 }
9453
9454 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009455 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009456 }
9457 catch(std::bad_alloc&)
9458 {
9459 return gl::error(GL_OUT_OF_MEMORY);
9460 }
9461}
9462
9463void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9464{
9465 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9466
9467 try
9468 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009469 if (index >= gl::MAX_VERTEX_ATTRIBS)
9470 {
9471 return gl::error(GL_INVALID_VALUE);
9472 }
9473
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009474 gl::Context *context = gl::getNonLostContext();
9475
9476 if (context)
9477 {
9478 if (context->getClientVersion() < 3)
9479 {
9480 return gl::error(GL_INVALID_OPERATION);
9481 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009482
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009483 context->setVertexAttribDivisor(index, divisor);
9484 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009485 }
9486 catch(std::bad_alloc&)
9487 {
9488 return gl::error(GL_OUT_OF_MEMORY);
9489 }
9490}
9491
9492void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9493{
9494 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9495
9496 try
9497 {
9498 gl::Context *context = gl::getNonLostContext();
9499
9500 if (context)
9501 {
9502 if (context->getClientVersion() < 3)
9503 {
9504 return gl::error(GL_INVALID_OPERATION);
9505 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009506
Jamie Madill54133512013-06-21 09:33:07 -04009507 // glBindTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009508 UNIMPLEMENTED();
9509 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009510 }
9511 catch(std::bad_alloc&)
9512 {
9513 return gl::error(GL_OUT_OF_MEMORY);
9514 }
9515}
9516
9517void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9518{
9519 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9520
9521 try
9522 {
9523 gl::Context *context = gl::getNonLostContext();
9524
9525 if (context)
9526 {
9527 if (context->getClientVersion() < 3)
9528 {
9529 return gl::error(GL_INVALID_OPERATION);
9530 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009531
Jamie Madill54133512013-06-21 09:33:07 -04009532 // glDeleteTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009533 UNIMPLEMENTED();
9534 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009535 }
9536 catch(std::bad_alloc&)
9537 {
9538 return gl::error(GL_OUT_OF_MEMORY);
9539 }
9540}
9541
9542void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9543{
9544 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9545
9546 try
9547 {
9548 gl::Context *context = gl::getNonLostContext();
9549
9550 if (context)
9551 {
9552 if (context->getClientVersion() < 3)
9553 {
9554 return gl::error(GL_INVALID_OPERATION);
9555 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009556
Jamie Madill54133512013-06-21 09:33:07 -04009557 // glGenTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009558 UNIMPLEMENTED();
9559 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009560 }
9561 catch(std::bad_alloc&)
9562 {
9563 return gl::error(GL_OUT_OF_MEMORY);
9564 }
9565}
9566
9567GLboolean __stdcall glIsTransformFeedback(GLuint id)
9568{
9569 EVENT("(GLuint id = %u)", id);
9570
9571 try
9572 {
9573 gl::Context *context = gl::getNonLostContext();
9574
9575 if (context)
9576 {
9577 if (context->getClientVersion() < 3)
9578 {
9579 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9580 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009581
Jamie Madill54133512013-06-21 09:33:07 -04009582 // glIsTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009583 UNIMPLEMENTED();
9584 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009585 }
9586 catch(std::bad_alloc&)
9587 {
9588 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9589 }
9590
9591 return GL_FALSE;
9592}
9593
9594void __stdcall glPauseTransformFeedback(void)
9595{
9596 EVENT("(void)");
9597
9598 try
9599 {
9600 gl::Context *context = gl::getNonLostContext();
9601
9602 if (context)
9603 {
9604 if (context->getClientVersion() < 3)
9605 {
9606 return gl::error(GL_INVALID_OPERATION);
9607 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009608
Jamie Madill54133512013-06-21 09:33:07 -04009609 // glPauseTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009610 UNIMPLEMENTED();
9611 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009612 }
9613 catch(std::bad_alloc&)
9614 {
9615 return gl::error(GL_OUT_OF_MEMORY);
9616 }
9617}
9618
9619void __stdcall glResumeTransformFeedback(void)
9620{
9621 EVENT("(void)");
9622
9623 try
9624 {
9625 gl::Context *context = gl::getNonLostContext();
9626
9627 if (context)
9628 {
9629 if (context->getClientVersion() < 3)
9630 {
9631 return gl::error(GL_INVALID_OPERATION);
9632 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009633
Jamie Madill54133512013-06-21 09:33:07 -04009634 // glResumeTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009635 UNIMPLEMENTED();
9636 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009637 }
9638 catch(std::bad_alloc&)
9639 {
9640 return gl::error(GL_OUT_OF_MEMORY);
9641 }
9642}
9643
9644void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9645{
9646 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9647 program, bufSize, length, binaryFormat, binary);
9648
9649 try
9650 {
9651 gl::Context *context = gl::getNonLostContext();
9652
9653 if (context)
9654 {
9655 if (context->getClientVersion() < 3)
9656 {
9657 return gl::error(GL_INVALID_OPERATION);
9658 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009659
Jamie Madill54133512013-06-21 09:33:07 -04009660 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009661 UNIMPLEMENTED();
9662 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009663 }
9664 catch(std::bad_alloc&)
9665 {
9666 return gl::error(GL_OUT_OF_MEMORY);
9667 }
9668}
9669
9670void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9671{
9672 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9673 program, binaryFormat, binary, length);
9674
9675 try
9676 {
9677 gl::Context *context = gl::getNonLostContext();
9678
9679 if (context)
9680 {
9681 if (context->getClientVersion() < 3)
9682 {
9683 return gl::error(GL_INVALID_OPERATION);
9684 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009685
Jamie Madill54133512013-06-21 09:33:07 -04009686 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009687 UNIMPLEMENTED();
9688 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009689 }
9690 catch(std::bad_alloc&)
9691 {
9692 return gl::error(GL_OUT_OF_MEMORY);
9693 }
9694}
9695
9696void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9697{
9698 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9699 program, pname, value);
9700
9701 try
9702 {
9703 gl::Context *context = gl::getNonLostContext();
9704
9705 if (context)
9706 {
9707 if (context->getClientVersion() < 3)
9708 {
9709 return gl::error(GL_INVALID_OPERATION);
9710 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009711
Jamie Madill54133512013-06-21 09:33:07 -04009712 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009713 UNIMPLEMENTED();
9714 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009715 }
9716 catch(std::bad_alloc&)
9717 {
9718 return gl::error(GL_OUT_OF_MEMORY);
9719 }
9720}
9721
9722void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9723{
9724 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9725 target, numAttachments, attachments);
9726
9727 try
9728 {
9729 gl::Context *context = gl::getNonLostContext();
9730
9731 if (context)
9732 {
9733 if (context->getClientVersion() < 3)
9734 {
9735 return gl::error(GL_INVALID_OPERATION);
9736 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009737
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009738 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009739 {
9740 return;
9741 }
9742
9743 int maxDimension = context->getMaximumRenderbufferDimension();
9744 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9745 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009746 }
9747 catch(std::bad_alloc&)
9748 {
9749 return gl::error(GL_OUT_OF_MEMORY);
9750 }
9751}
9752
9753void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9754{
9755 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9756 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9757 target, numAttachments, attachments, x, y, width, height);
9758
9759 try
9760 {
9761 gl::Context *context = gl::getNonLostContext();
9762
9763 if (context)
9764 {
9765 if (context->getClientVersion() < 3)
9766 {
9767 return gl::error(GL_INVALID_OPERATION);
9768 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009769
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009770 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009771 {
9772 return;
9773 }
9774
9775 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9776 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009777 }
9778 catch(std::bad_alloc&)
9779 {
9780 return gl::error(GL_OUT_OF_MEMORY);
9781 }
9782}
9783
9784void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9785{
9786 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9787 target, levels, internalformat, width, height);
9788
9789 try
9790 {
9791 gl::Context *context = gl::getNonLostContext();
9792
9793 if (context)
9794 {
9795 if (context->getClientVersion() < 3)
9796 {
9797 return gl::error(GL_INVALID_OPERATION);
9798 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009799
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009800 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009801 {
9802 return;
9803 }
9804
9805 switch (target)
9806 {
9807 case GL_TEXTURE_2D:
9808 {
9809 gl::Texture2D *texture2d = context->getTexture2D();
9810 texture2d->storage(levels, internalformat, width, height);
9811 }
9812 break;
9813
Geoff Lang01c21d22013-09-24 11:52:16 -04009814 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009815 {
9816 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9817 textureCube->storage(levels, internalformat, width);
9818 }
9819 break;
9820
9821 default:
9822 return gl::error(GL_INVALID_ENUM);
9823 }
9824 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009825 }
9826 catch(std::bad_alloc&)
9827 {
9828 return gl::error(GL_OUT_OF_MEMORY);
9829 }
9830}
9831
9832void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9833{
9834 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9835 "GLsizei height = %d, GLsizei depth = %d)",
9836 target, levels, internalformat, width, height, depth);
9837
9838 try
9839 {
9840 gl::Context *context = gl::getNonLostContext();
9841
9842 if (context)
9843 {
9844 if (context->getClientVersion() < 3)
9845 {
9846 return gl::error(GL_INVALID_OPERATION);
9847 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009848
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009849 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009850 {
9851 return;
9852 }
9853
9854 switch (target)
9855 {
9856 case GL_TEXTURE_3D:
9857 {
9858 gl::Texture3D *texture3d = context->getTexture3D();
9859 texture3d->storage(levels, internalformat, width, height, depth);
9860 }
9861 break;
9862
9863 case GL_TEXTURE_2D_ARRAY:
9864 {
9865 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9866 texture2darray->storage(levels, internalformat, width, height, depth);
9867 }
9868 break;
9869
9870 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009871 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009872 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009873 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009874 }
9875 catch(std::bad_alloc&)
9876 {
9877 return gl::error(GL_OUT_OF_MEMORY);
9878 }
9879}
9880
9881void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9882{
9883 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9884 "GLint* params = 0x%0.8p)",
9885 target, internalformat, pname, bufSize, params);
9886
9887 try
9888 {
9889 gl::Context *context = gl::getNonLostContext();
9890
9891 if (context)
9892 {
9893 if (context->getClientVersion() < 3)
9894 {
9895 return gl::error(GL_INVALID_OPERATION);
9896 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009897
Shannon Woods809d2502013-07-08 10:32:18 -04009898 if (!gl::IsColorRenderingSupported(internalformat, context) &&
9899 !gl::IsDepthRenderingSupported(internalformat, context) &&
9900 !gl::IsStencilRenderingSupported(internalformat, context))
9901 {
9902 return gl::error(GL_INVALID_ENUM);
9903 }
9904
9905 if (target != GL_RENDERBUFFER)
9906 {
9907 return gl::error(GL_INVALID_ENUM);
9908 }
9909
9910 if (bufSize < 0)
9911 {
9912 return gl::error(GL_INVALID_VALUE);
9913 }
9914
9915 switch (pname)
9916 {
9917 case GL_NUM_SAMPLE_COUNTS:
9918 if (bufSize != 0)
9919 *params = context->getNumSampleCounts(internalformat);
9920 break;
9921 case GL_SAMPLES:
9922 context->getSampleCounts(internalformat, bufSize, params);
9923 break;
9924 default:
9925 return gl::error(GL_INVALID_ENUM);
9926 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009927 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009928 }
9929 catch(std::bad_alloc&)
9930 {
9931 return gl::error(GL_OUT_OF_MEMORY);
9932 }
9933}
9934
9935// Extension functions
9936
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009937void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9938 GLbitfield mask, GLenum filter)
9939{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009940 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009941 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9942 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9943 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9944
9945 try
9946 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009947 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009948
9949 if (context)
9950 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009951 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04009952 dstX0, dstY0, dstX1, dstY1, mask, filter,
9953 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009954 {
Geoff Lang758d5b22013-06-11 11:42:50 -04009955 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009956 }
9957
Geoff Lang758d5b22013-06-11 11:42:50 -04009958 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
9959 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009960 }
9961 }
9962 catch(std::bad_alloc&)
9963 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009964 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009965 }
9966}
9967
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009968void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9969 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009970{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009971 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009972 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009973 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009974 target, level, internalformat, width, height, depth, border, format, type, pixels);
9975
9976 try
9977 {
9978 UNIMPLEMENTED(); // FIXME
9979 }
9980 catch(std::bad_alloc&)
9981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009982 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009983 }
9984}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009985
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009986void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9987 GLenum *binaryFormat, void *binary)
9988{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009989 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 +00009990 program, bufSize, length, binaryFormat, binary);
9991
9992 try
9993 {
9994 gl::Context *context = gl::getNonLostContext();
9995
9996 if (context)
9997 {
9998 gl::Program *programObject = context->getProgram(program);
9999
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010000 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010001 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010002 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010003 }
10004
10005 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10006
10007 if (!programBinary)
10008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010009 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010010 }
10011
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010012 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010014 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010015 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010016
10017 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010018 }
10019 }
10020 catch(std::bad_alloc&)
10021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010022 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010023 }
10024}
10025
10026void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10027 const void *binary, GLint length)
10028{
10029 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10030 program, binaryFormat, binary, length);
10031
10032 try
10033 {
10034 gl::Context *context = gl::getNonLostContext();
10035
10036 if (context)
10037 {
10038 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010040 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010041 }
10042
10043 gl::Program *programObject = context->getProgram(program);
10044
10045 if (!programObject)
10046 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010047 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010048 }
10049
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010050 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010051 }
10052 }
10053 catch(std::bad_alloc&)
10054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010055 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010056 }
10057}
10058
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010059void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10060{
10061 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10062
10063 try
10064 {
10065 gl::Context *context = gl::getNonLostContext();
10066
10067 if (context)
10068 {
10069 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10070 {
10071 return gl::error(GL_INVALID_VALUE);
10072 }
10073
10074 if (context->getDrawFramebufferHandle() == 0)
10075 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010076 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010077 {
10078 return gl::error(GL_INVALID_OPERATION);
10079 }
10080
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010081 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010082 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010083 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010084 }
10085 }
10086 else
10087 {
10088 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10089 {
10090 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10091 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10092 {
10093 return gl::error(GL_INVALID_OPERATION);
10094 }
10095 }
10096 }
10097
10098 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10099
10100 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10101 {
10102 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10103 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010104
10105 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10106 {
10107 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10108 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010109 }
10110 }
10111 catch (std::bad_alloc&)
10112 {
10113 return gl::error(GL_OUT_OF_MEMORY);
10114 }
10115}
10116
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010117__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10118{
10119 struct Extension
10120 {
10121 const char *name;
10122 __eglMustCastToProperFunctionPointerType address;
10123 };
10124
10125 static const Extension glExtensions[] =
10126 {
10127 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010128 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010129 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010130 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10131 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10132 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10133 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10134 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10135 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10136 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010137 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010138 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010139 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10140 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10141 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10142 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010143 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10144 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10145 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10146 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10147 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10148 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10149 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010150 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010151 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10152 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10153 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010154 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10155 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010156
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010157 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010158 {
10159 if (strcmp(procname, glExtensions[ext].name) == 0)
10160 {
10161 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10162 }
10163 }
10164
10165 return NULL;
10166}
10167
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010168// Non-public functions used by EGL
10169
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010170bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010171{
10172 EVENT("(egl::Surface* surface = 0x%0.8p)",
10173 surface);
10174
10175 try
10176 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010177 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010178
10179 if (context)
10180 {
10181 gl::Texture2D *textureObject = context->getTexture2D();
10182
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010183 if (textureObject->isImmutable())
10184 {
10185 return false;
10186 }
10187
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010188 if (textureObject)
10189 {
10190 textureObject->bindTexImage(surface);
10191 }
10192 }
10193 }
10194 catch(std::bad_alloc&)
10195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010196 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010197 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010198
10199 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010200}
10201
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010202}