blob: 149b86119038a72cee30d1f8b6d1c6767c3641c5 [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//
Geoff Lang48dcae72014-02-05 16:28:24 -05003// Copyright (c) 2002-2014 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"
Geoff Langc8058452014-02-03 12:04:11 -050025#include "libGLESv2/TransformFeedback.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026
Geoff Lange8ebe7f2013-08-05 15:03:13 -040027#include "libGLESv2/validationES.h"
28#include "libGLESv2/validationES2.h"
29#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050030#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040031
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032extern "C"
33{
34
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000035// OpenGL ES 2.0 functions
36
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000037void __stdcall glActiveTexture(GLenum texture)
38{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000039 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000040
41 try
42 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000044
45 if (context)
46 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000047 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
48 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000049 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000050 }
51
daniel@transgaming.com428d1582010-05-04 03:35:25 +000052 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053 }
54 }
55 catch(std::bad_alloc&)
56 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058 }
59}
60
61void __stdcall glAttachShader(GLuint program, GLuint shader)
62{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000063 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064
65 try
66 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068
69 if (context)
70 {
71 gl::Program *programObject = context->getProgram(program);
72 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000073
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000074 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000076 if (context->getShader(program))
77 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000078 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000079 }
80 else
81 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000083 }
84 }
85
86 if (!shaderObject)
87 {
88 if (context->getProgram(shader))
89 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000090 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000091 }
92 else
93 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000094 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000096 }
97
98 if (!programObject->attachShader(shaderObject))
99 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000100 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000101 }
102 }
103 }
104 catch(std::bad_alloc&)
105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000106 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107 }
108}
109
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000110void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
111{
112 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
113
114 try
115 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000116 gl::Context *context = gl::getNonLostContext();
117
118 if (context)
119 {
Geoff Lang37dde692014-01-31 16:34:54 -0500120 if (!ValidQueryType(context, target))
121 {
122 return gl::error(GL_INVALID_ENUM);
123 }
124
125 if (id == 0)
126 {
127 return gl::error(GL_INVALID_OPERATION);
128 }
129
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000130 context->beginQuery(target, id);
131 }
132 }
133 catch(std::bad_alloc&)
134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000135 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000136 }
137}
138
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000139void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000140{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000141 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142
143 try
144 {
145 if (index >= gl::MAX_VERTEX_ATTRIBS)
146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000147 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148 }
149
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000150 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151
152 if (context)
153 {
154 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000155
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000156 if (!programObject)
157 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000158 if (context->getShader(program))
159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000160 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000161 }
162 else
163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000164 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000165 }
166 }
167
168 if (strncmp(name, "gl_", 3) == 0)
169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000170 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000171 }
172
173 programObject->bindAttributeLocation(index, name);
174 }
175 }
176 catch(std::bad_alloc&)
177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000179 }
180}
181
182void __stdcall glBindBuffer(GLenum target, GLuint buffer)
183{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000184 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000185
186 try
187 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000188 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000189
190 if (context)
191 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500192 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000193 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500194 return gl::error(GL_INVALID_ENUM);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000195 }
196
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000197 switch (target)
198 {
199 case GL_ARRAY_BUFFER:
200 context->bindArrayBuffer(buffer);
201 return;
202 case GL_ELEMENT_ARRAY_BUFFER:
203 context->bindElementArrayBuffer(buffer);
204 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000205 case GL_COPY_READ_BUFFER:
206 context->bindCopyReadBuffer(buffer);
207 return;
208 case GL_COPY_WRITE_BUFFER:
209 context->bindCopyWriteBuffer(buffer);
210 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000211 case GL_PIXEL_PACK_BUFFER:
212 context->bindPixelPackBuffer(buffer);
213 return;
214 case GL_PIXEL_UNPACK_BUFFER:
215 context->bindPixelUnpackBuffer(buffer);
216 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000217 case GL_UNIFORM_BUFFER:
218 context->bindGenericUniformBuffer(buffer);
219 return;
220 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000221 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000222 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000223 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000224 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000225 }
226 }
227 }
228 catch(std::bad_alloc&)
229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000230 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000231 }
232}
233
234void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
235{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000236 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000237
238 try
239 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500240 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000242 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000243 }
244
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000245 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000246
247 if (context)
248 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000249 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
250 {
251 context->bindReadFramebuffer(framebuffer);
252 }
253
254 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
255 {
256 context->bindDrawFramebuffer(framebuffer);
257 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258 }
259 }
260 catch(std::bad_alloc&)
261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000262 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000263 }
264}
265
266void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
267{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000268 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000269
270 try
271 {
272 if (target != GL_RENDERBUFFER)
273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000274 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275 }
276
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000277 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000278
279 if (context)
280 {
281 context->bindRenderbuffer(renderbuffer);
282 }
283 }
284 catch(std::bad_alloc&)
285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000286 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000287 }
288}
289
290void __stdcall glBindTexture(GLenum target, GLuint texture)
291{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000292 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000293
294 try
295 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000296 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000297
298 if (context)
299 {
300 gl::Texture *textureObject = context->getTexture(texture);
301
302 if (textureObject && textureObject->getTarget() != target && texture != 0)
303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000304 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000305 }
306
307 switch (target)
308 {
309 case GL_TEXTURE_2D:
310 context->bindTexture2D(texture);
311 return;
312 case GL_TEXTURE_CUBE_MAP:
313 context->bindTextureCubeMap(texture);
314 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000315 case GL_TEXTURE_3D:
316 if (context->getClientVersion() < 3)
317 {
318 return gl::error(GL_INVALID_ENUM);
319 }
320 context->bindTexture3D(texture);
321 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000322 case GL_TEXTURE_2D_ARRAY:
323 if (context->getClientVersion() < 3)
324 {
325 return gl::error(GL_INVALID_ENUM);
326 }
327 context->bindTexture2DArray(texture);
328 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000329 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000330 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331 }
332 }
333 }
334 catch(std::bad_alloc&)
335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000336 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000337 }
338}
339
340void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000342 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000343 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000344
345 try
346 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000347 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000348
349 if (context)
350 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000351 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000352 }
353 }
354 catch(std::bad_alloc&)
355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000357 }
358}
359
360void __stdcall glBlendEquation(GLenum mode)
361{
362 glBlendEquationSeparate(mode, mode);
363}
364
365void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000367 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368
369 try
370 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000371 gl::Context *context = gl::getNonLostContext();
372
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000373 switch (modeRGB)
374 {
375 case GL_FUNC_ADD:
376 case GL_FUNC_SUBTRACT:
377 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000378 case GL_MIN:
379 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000380 break;
381
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000382 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000383 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000384 }
385
386 switch (modeAlpha)
387 {
388 case GL_FUNC_ADD:
389 case GL_FUNC_SUBTRACT:
390 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000391 case GL_MIN:
392 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000393 break;
394
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000395 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000396 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000397 }
398
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000399 if (context)
400 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000401 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402 }
403 }
404 catch(std::bad_alloc&)
405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000406 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000407 }
408}
409
410void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
411{
412 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
413}
414
415void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
416{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000417 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 +0000418 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000419
420 try
421 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000422 gl::Context *context = gl::getNonLostContext();
423
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000424 switch (srcRGB)
425 {
426 case GL_ZERO:
427 case GL_ONE:
428 case GL_SRC_COLOR:
429 case GL_ONE_MINUS_SRC_COLOR:
430 case GL_DST_COLOR:
431 case GL_ONE_MINUS_DST_COLOR:
432 case GL_SRC_ALPHA:
433 case GL_ONE_MINUS_SRC_ALPHA:
434 case GL_DST_ALPHA:
435 case GL_ONE_MINUS_DST_ALPHA:
436 case GL_CONSTANT_COLOR:
437 case GL_ONE_MINUS_CONSTANT_COLOR:
438 case GL_CONSTANT_ALPHA:
439 case GL_ONE_MINUS_CONSTANT_ALPHA:
440 case GL_SRC_ALPHA_SATURATE:
441 break;
442 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000443 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000444 }
445
446 switch (dstRGB)
447 {
448 case GL_ZERO:
449 case GL_ONE:
450 case GL_SRC_COLOR:
451 case GL_ONE_MINUS_SRC_COLOR:
452 case GL_DST_COLOR:
453 case GL_ONE_MINUS_DST_COLOR:
454 case GL_SRC_ALPHA:
455 case GL_ONE_MINUS_SRC_ALPHA:
456 case GL_DST_ALPHA:
457 case GL_ONE_MINUS_DST_ALPHA:
458 case GL_CONSTANT_COLOR:
459 case GL_ONE_MINUS_CONSTANT_COLOR:
460 case GL_CONSTANT_ALPHA:
461 case GL_ONE_MINUS_CONSTANT_ALPHA:
462 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000463
464 case GL_SRC_ALPHA_SATURATE:
465 if (!context || context->getClientVersion() < 3)
466 {
467 return gl::error(GL_INVALID_ENUM);
468 }
469 break;
470
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000471 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000472 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000473 }
474
475 switch (srcAlpha)
476 {
477 case GL_ZERO:
478 case GL_ONE:
479 case GL_SRC_COLOR:
480 case GL_ONE_MINUS_SRC_COLOR:
481 case GL_DST_COLOR:
482 case GL_ONE_MINUS_DST_COLOR:
483 case GL_SRC_ALPHA:
484 case GL_ONE_MINUS_SRC_ALPHA:
485 case GL_DST_ALPHA:
486 case GL_ONE_MINUS_DST_ALPHA:
487 case GL_CONSTANT_COLOR:
488 case GL_ONE_MINUS_CONSTANT_COLOR:
489 case GL_CONSTANT_ALPHA:
490 case GL_ONE_MINUS_CONSTANT_ALPHA:
491 case GL_SRC_ALPHA_SATURATE:
492 break;
493 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000494 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000495 }
496
497 switch (dstAlpha)
498 {
499 case GL_ZERO:
500 case GL_ONE:
501 case GL_SRC_COLOR:
502 case GL_ONE_MINUS_SRC_COLOR:
503 case GL_DST_COLOR:
504 case GL_ONE_MINUS_DST_COLOR:
505 case GL_SRC_ALPHA:
506 case GL_ONE_MINUS_SRC_ALPHA:
507 case GL_DST_ALPHA:
508 case GL_ONE_MINUS_DST_ALPHA:
509 case GL_CONSTANT_COLOR:
510 case GL_ONE_MINUS_CONSTANT_COLOR:
511 case GL_CONSTANT_ALPHA:
512 case GL_ONE_MINUS_CONSTANT_ALPHA:
513 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000514
515 case GL_SRC_ALPHA_SATURATE:
516 if (!context || context->getClientVersion() < 3)
517 {
518 return gl::error(GL_INVALID_ENUM);
519 }
520 break;
521
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000522 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000523 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000524 }
525
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000526 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
527 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
528
529 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
530 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
531
532 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000533 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000534 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 +0000535 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000536 }
537
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000538 if (context)
539 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000540 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000541 }
542 }
543 catch(std::bad_alloc&)
544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000545 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000546 }
547}
548
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000549void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000550{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000551 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 +0000552 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000553
554 try
555 {
556 if (size < 0)
557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000559 }
560
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000561 gl::Context *context = gl::getNonLostContext();
562
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000563 switch (usage)
564 {
565 case GL_STREAM_DRAW:
566 case GL_STATIC_DRAW:
567 case GL_DYNAMIC_DRAW:
568 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000569
570 case GL_STREAM_READ:
571 case GL_STREAM_COPY:
572 case GL_STATIC_READ:
573 case GL_STATIC_COPY:
574 case GL_DYNAMIC_READ:
575 case GL_DYNAMIC_COPY:
576 if (context && context->getClientVersion() < 3)
577 {
578 return gl::error(GL_INVALID_ENUM);
579 }
580 break;
581
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000582 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000583 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000584 }
585
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000586 if (context)
587 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500588 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000590 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000591 }
592
Jamie Madill8c96d582014-03-05 15:01:23 -0500593 gl::Buffer *buffer = context->getTargetBuffer(target);
594
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000595 if (!buffer)
596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000597 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000598 }
599
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000600 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000601 }
602 }
603 catch(std::bad_alloc&)
604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000605 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000606 }
607}
608
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000609void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000610{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000611 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 +0000612 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000613
614 try
615 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000616 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000618 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000619 }
620
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000621 if (data == NULL)
622 {
623 return;
624 }
625
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000626 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000627
628 if (context)
629 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500630 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000632 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000633 }
634
Jamie Madill8c96d582014-03-05 15:01:23 -0500635 gl::Buffer *buffer = context->getTargetBuffer(target);
636
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000637 if (!buffer)
638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000640 }
641
Jamie Madill7a5f7382014-03-05 15:01:24 -0500642 if (buffer->mapped())
643 {
644 return gl::error(GL_INVALID_OPERATION);
645 }
646
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000647 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000649 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000650 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000651
652 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000653 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000654 }
655 catch(std::bad_alloc&)
656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000657 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000658 }
659}
660
661GLenum __stdcall glCheckFramebufferStatus(GLenum target)
662{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000663 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000664
665 try
666 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500667 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000669 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000670 }
671
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000672 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000673
674 if (context)
675 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500676 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
677 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000678 return framebuffer->completeness();
679 }
680 }
681 catch(std::bad_alloc&)
682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000683 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000684 }
685
686 return 0;
687}
688
689void __stdcall glClear(GLbitfield mask)
690{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000691 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000692
693 try
694 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000695 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000696
697 if (context)
698 {
Geoff Lang0b833232013-08-21 10:13:29 -0400699 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
700
701 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
702 {
703 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
704 }
705
706 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
707 {
708 return gl::error(GL_INVALID_VALUE);
709 }
710
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000711 context->clear(mask);
712 }
713 }
714 catch(std::bad_alloc&)
715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000716 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000717 }
718}
719
720void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
721{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000722 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000723 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000724
725 try
726 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000728
729 if (context)
730 {
731 context->setClearColor(red, green, blue, alpha);
732 }
733 }
734 catch(std::bad_alloc&)
735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000736 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000737 }
738}
739
740void __stdcall glClearDepthf(GLclampf depth)
741{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000742 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000743
744 try
745 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000746 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000747
748 if (context)
749 {
750 context->setClearDepth(depth);
751 }
752 }
753 catch(std::bad_alloc&)
754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000755 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000756 }
757}
758
759void __stdcall glClearStencil(GLint s)
760{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000761 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000762
763 try
764 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000765 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000766
767 if (context)
768 {
769 context->setClearStencil(s);
770 }
771 }
772 catch(std::bad_alloc&)
773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000774 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000775 }
776}
777
778void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
779{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000780 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000781 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000782
783 try
784 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000785 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000786
787 if (context)
788 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000789 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000790 }
791 }
792 catch(std::bad_alloc&)
793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000794 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000795 }
796}
797
798void __stdcall glCompileShader(GLuint shader)
799{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000800 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000801
802 try
803 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000804 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000805
806 if (context)
807 {
808 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000809
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000810 if (!shaderObject)
811 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000812 if (context->getProgram(shader))
813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000814 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000815 }
816 else
817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000818 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000819 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000820 }
821
822 shaderObject->compile();
823 }
824 }
825 catch(std::bad_alloc&)
826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000827 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000828 }
829}
830
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000831void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
832 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000833{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000834 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000835 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836 target, level, internalformat, width, height, border, imageSize, data);
837
838 try
839 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000840 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000841
842 if (context)
843 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000844 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400845 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000846 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
847 {
848 return;
849 }
850
851 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400852 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400853 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000854 {
855 return;
856 }
857
858 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000860 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000861 }
862
863 switch (target)
864 {
865 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000866 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000867 gl::Texture2D *texture = context->getTexture2D();
868 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000869 }
870 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000871
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000872 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
873 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
874 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
875 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
876 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
877 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000878 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000879 gl::TextureCubeMap *texture = context->getTextureCubeMap();
880 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000881 }
882 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000883
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000884 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000885 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000886 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000887 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000888 }
889 catch(std::bad_alloc&)
890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000891 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000892 }
893}
894
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000895void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
896 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000897{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000898 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000899 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000900 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000901 target, level, xoffset, yoffset, width, height, format, imageSize, data);
902
903 try
904 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000905 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000906
907 if (context)
908 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000909 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400910 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000911 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
912 {
913 return;
914 }
915
916 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400917 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400918 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000919 {
920 return;
921 }
922
923 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000925 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000926 }
927
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000928 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000929 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000930 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000931 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000932 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000933 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000934 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000935 break;
936
937 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
938 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
939 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
940 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
941 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
942 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000943 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000944 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000945 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000946 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000947 break;
948
949 default:
950 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000951 }
952 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000953 }
954 catch(std::bad_alloc&)
955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000956 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000957 }
958}
959
960void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
961{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000962 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000963 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000964 target, level, internalformat, x, y, width, height, border);
965
966 try
967 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000968 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000969
970 if (context)
971 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000972 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400973 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000974 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000975 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000976 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000977 }
978
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000979 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400980 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000981 0, 0, 0, x, y, width, height, border))
982 {
983 return;
984 }
985
986 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
987
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000988 switch (target)
989 {
990 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000991 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000992 gl::Texture2D *texture = context->getTexture2D();
993 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000994 }
995 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000996
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000997 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
998 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
999 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1000 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1001 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1002 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001003 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001004 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1005 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001006 }
1007 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001008
1009 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001010 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001011 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001012 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001013 }
1014 catch(std::bad_alloc&)
1015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001016 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001017 }
1018}
1019
1020void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1021{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001022 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001023 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001024 target, level, xoffset, yoffset, x, y, width, height);
1025
1026 try
1027 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001028 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001029
1030 if (context)
1031 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001032 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001033 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001034 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001035 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001036 return;
1037 }
1038
1039 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001040 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001041 xoffset, yoffset, 0, x, y, width, height, 0))
1042 {
1043 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001044 }
1045
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001046 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001047
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001048 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001049 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001050 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001051 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001052 gl::Texture2D *texture = context->getTexture2D();
1053 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001054 }
1055 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001056
1057 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1058 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1059 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1060 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1061 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1062 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001063 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001064 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1065 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001066 }
1067 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001068
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001069 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001070 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001071 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001072 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001073 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001074
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001075 catch(std::bad_alloc&)
1076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001077 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001078 }
1079}
1080
1081GLuint __stdcall glCreateProgram(void)
1082{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001083 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001084
1085 try
1086 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001087 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001088
1089 if (context)
1090 {
1091 return context->createProgram();
1092 }
1093 }
1094 catch(std::bad_alloc&)
1095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001096 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001097 }
1098
1099 return 0;
1100}
1101
1102GLuint __stdcall glCreateShader(GLenum type)
1103{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001104 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001105
1106 try
1107 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001108 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001109
1110 if (context)
1111 {
1112 switch (type)
1113 {
1114 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001115 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001116 return context->createShader(type);
1117 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001118 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001119 }
1120 }
1121 }
1122 catch(std::bad_alloc&)
1123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001124 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001125 }
1126
1127 return 0;
1128}
1129
1130void __stdcall glCullFace(GLenum mode)
1131{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001132 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001133
1134 try
1135 {
1136 switch (mode)
1137 {
1138 case GL_FRONT:
1139 case GL_BACK:
1140 case GL_FRONT_AND_BACK:
1141 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001142 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001143
1144 if (context)
1145 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001146 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001147 }
1148 }
1149 break;
1150 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001151 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001152 }
1153 }
1154 catch(std::bad_alloc&)
1155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001156 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001157 }
1158}
1159
1160void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1161{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001162 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001163
1164 try
1165 {
1166 if (n < 0)
1167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001168 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001169 }
1170
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001171 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001172
1173 if (context)
1174 {
1175 for (int i = 0; i < n; i++)
1176 {
1177 context->deleteBuffer(buffers[i]);
1178 }
1179 }
1180 }
1181 catch(std::bad_alloc&)
1182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001183 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001184 }
1185}
1186
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001187void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1188{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001189 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001190
1191 try
1192 {
1193 if (n < 0)
1194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001195 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001196 }
1197
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001198 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001199
1200 if (context)
1201 {
1202 for (int i = 0; i < n; i++)
1203 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001204 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001205 }
1206 }
1207 }
1208 catch(std::bad_alloc&)
1209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001210 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001211 }
1212}
1213
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001214void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001216 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001217
1218 try
1219 {
1220 if (n < 0)
1221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001222 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001223 }
1224
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001225 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001226
1227 if (context)
1228 {
1229 for (int i = 0; i < n; i++)
1230 {
1231 if (framebuffers[i] != 0)
1232 {
1233 context->deleteFramebuffer(framebuffers[i]);
1234 }
1235 }
1236 }
1237 }
1238 catch(std::bad_alloc&)
1239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001240 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001241 }
1242}
1243
1244void __stdcall glDeleteProgram(GLuint program)
1245{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001246 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001247
1248 try
1249 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001250 if (program == 0)
1251 {
1252 return;
1253 }
1254
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001255 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001256
1257 if (context)
1258 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001259 if (!context->getProgram(program))
1260 {
1261 if(context->getShader(program))
1262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001263 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001264 }
1265 else
1266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001267 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001268 }
1269 }
1270
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001271 context->deleteProgram(program);
1272 }
1273 }
1274 catch(std::bad_alloc&)
1275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001276 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001277 }
1278}
1279
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001280void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1281{
1282 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1283
1284 try
1285 {
1286 if (n < 0)
1287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001288 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001289 }
1290
1291 gl::Context *context = gl::getNonLostContext();
1292
1293 if (context)
1294 {
1295 for (int i = 0; i < n; i++)
1296 {
1297 context->deleteQuery(ids[i]);
1298 }
1299 }
1300 }
1301 catch(std::bad_alloc&)
1302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001303 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001304 }
1305}
1306
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001307void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1308{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001309 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001310
1311 try
1312 {
1313 if (n < 0)
1314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001315 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001316 }
1317
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001318 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001319
1320 if (context)
1321 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001322 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001323 {
1324 context->deleteRenderbuffer(renderbuffers[i]);
1325 }
1326 }
1327 }
1328 catch(std::bad_alloc&)
1329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001330 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001331 }
1332}
1333
1334void __stdcall glDeleteShader(GLuint shader)
1335{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001336 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001337
1338 try
1339 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001340 if (shader == 0)
1341 {
1342 return;
1343 }
1344
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001345 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001346
1347 if (context)
1348 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001349 if (!context->getShader(shader))
1350 {
1351 if(context->getProgram(shader))
1352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001353 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001354 }
1355 else
1356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001357 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001358 }
1359 }
1360
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001361 context->deleteShader(shader);
1362 }
1363 }
1364 catch(std::bad_alloc&)
1365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001367 }
1368}
1369
1370void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1371{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001372 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001373
1374 try
1375 {
1376 if (n < 0)
1377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001378 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001379 }
1380
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001381 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001382
1383 if (context)
1384 {
1385 for (int i = 0; i < n; i++)
1386 {
1387 if (textures[i] != 0)
1388 {
1389 context->deleteTexture(textures[i]);
1390 }
1391 }
1392 }
1393 }
1394 catch(std::bad_alloc&)
1395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001396 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001397 }
1398}
1399
1400void __stdcall glDepthFunc(GLenum func)
1401{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001402 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001403
1404 try
1405 {
1406 switch (func)
1407 {
1408 case GL_NEVER:
1409 case GL_ALWAYS:
1410 case GL_LESS:
1411 case GL_LEQUAL:
1412 case GL_EQUAL:
1413 case GL_GREATER:
1414 case GL_GEQUAL:
1415 case GL_NOTEQUAL:
1416 break;
1417 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001418 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001419 }
1420
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001421 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001422
1423 if (context)
1424 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001425 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001426 }
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 glDepthMask(GLboolean flag)
1435{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001436 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001437
1438 try
1439 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001440 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001441
1442 if (context)
1443 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001444 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001445 }
1446 }
1447 catch(std::bad_alloc&)
1448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001449 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001450 }
1451}
1452
1453void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1454{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001455 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456
1457 try
1458 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001459 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001460
1461 if (context)
1462 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001463 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001464 }
1465 }
1466 catch(std::bad_alloc&)
1467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001468 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001469 }
1470}
1471
1472void __stdcall glDetachShader(GLuint program, GLuint shader)
1473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001474 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001475
1476 try
1477 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001478 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001479
1480 if (context)
1481 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001482
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001483 gl::Program *programObject = context->getProgram(program);
1484 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001485
1486 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001487 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001488 gl::Shader *shaderByProgramHandle;
1489 shaderByProgramHandle = context->getShader(program);
1490 if (!shaderByProgramHandle)
1491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001492 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001493 }
1494 else
1495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001496 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001497 }
1498 }
1499
1500 if (!shaderObject)
1501 {
1502 gl::Program *programByShaderHandle = context->getProgram(shader);
1503 if (!programByShaderHandle)
1504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001505 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001506 }
1507 else
1508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001509 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001510 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001511 }
1512
1513 if (!programObject->detachShader(shaderObject))
1514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001516 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001517 }
1518 }
1519 catch(std::bad_alloc&)
1520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001521 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001522 }
1523}
1524
1525void __stdcall glDisable(GLenum cap)
1526{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001527 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001528
1529 try
1530 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001531 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001532
1533 if (context)
1534 {
Geoff Lang0550d032014-01-30 11:29:07 -05001535 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001537 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001538 }
Geoff Lang0550d032014-01-30 11:29:07 -05001539
1540 context->setCap(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001541 }
1542 }
1543 catch(std::bad_alloc&)
1544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001545 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001546 }
1547}
1548
1549void __stdcall glDisableVertexAttribArray(GLuint index)
1550{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001551 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001552
1553 try
1554 {
1555 if (index >= gl::MAX_VERTEX_ATTRIBS)
1556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001557 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001558 }
1559
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001560 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001561
1562 if (context)
1563 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001564 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001565 }
1566 }
1567 catch(std::bad_alloc&)
1568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001569 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001570 }
1571}
1572
1573void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1574{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001575 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001576
1577 try
1578 {
1579 if (count < 0 || first < 0)
1580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001581 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001582 }
1583
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001584 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001585
Jamie Madill7a5f7382014-03-05 15:01:24 -05001586 // Check for mapped buffers
1587 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1588 {
1589 return gl::error(GL_INVALID_OPERATION);
1590 }
1591
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001592 if (context)
1593 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001594 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1595 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1596 curTransformFeedback->getDrawMode() != mode)
1597 {
1598 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1599 // that does not match the current transform feedback object's draw mode (if transform feedback
1600 // is active), (3.0.2, section 2.14, pg 86)
1601 return gl::error(GL_INVALID_OPERATION);
1602 }
1603
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001604 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001605 }
1606 }
1607 catch(std::bad_alloc&)
1608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001609 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001610 }
1611}
1612
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001613void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1614{
1615 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1616
1617 try
1618 {
1619 if (count < 0 || first < 0 || primcount < 0)
1620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001621 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001622 }
1623
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001624 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001625 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001626 gl::Context *context = gl::getNonLostContext();
1627
Jamie Madill7a5f7382014-03-05 15:01:24 -05001628 // Check for mapped buffers
1629 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1630 {
1631 return gl::error(GL_INVALID_OPERATION);
1632 }
1633
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001634 if (context)
1635 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001636 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1637 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1638 curTransformFeedback->getDrawMode() != mode)
1639 {
1640 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1641 // that does not match the current transform feedback object's draw mode (if transform feedback
1642 // is active), (3.0.2, section 2.14, pg 86)
1643 return gl::error(GL_INVALID_OPERATION);
1644 }
1645
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001646 context->drawArrays(mode, first, count, primcount);
1647 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001648 }
1649 }
1650 catch(std::bad_alloc&)
1651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001652 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001653 }
1654}
1655
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001656void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001657{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001658 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 +00001659 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001660
1661 try
1662 {
1663 if (count < 0)
1664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001665 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001666 }
1667
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001668 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001669
1670 if (context)
1671 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001672 switch (type)
1673 {
1674 case GL_UNSIGNED_BYTE:
1675 case GL_UNSIGNED_SHORT:
1676 break;
1677 case GL_UNSIGNED_INT:
1678 if (!context->supports32bitIndices())
1679 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001680 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001681 }
1682 break;
1683 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001684 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001685 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001686
1687 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1688 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1689 {
1690 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1691 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1692 return gl::error(GL_INVALID_OPERATION);
1693 }
1694
Jamie Madill7a5f7382014-03-05 15:01:24 -05001695 // Check for mapped buffers
1696 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1697 {
1698 return gl::error(GL_INVALID_OPERATION);
1699 }
1700
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001701 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001702 }
1703 }
1704 catch(std::bad_alloc&)
1705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001706 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001707 }
1708}
1709
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001710void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1711{
1712 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1713 mode, count, type, indices, primcount);
1714
1715 try
1716 {
1717 if (count < 0 || primcount < 0)
1718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001719 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001720 }
1721
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001722 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001723 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001724 gl::Context *context = gl::getNonLostContext();
1725
1726 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001727 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001728 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001729 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001730 case GL_UNSIGNED_BYTE:
1731 case GL_UNSIGNED_SHORT:
1732 break;
1733 case GL_UNSIGNED_INT:
1734 if (!context->supports32bitIndices())
1735 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001736 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001737 }
1738 break;
1739 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001740 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001741 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001742
1743 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1744 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1745 {
1746 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1747 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1748 return gl::error(GL_INVALID_OPERATION);
1749 }
1750
Jamie Madill7a5f7382014-03-05 15:01:24 -05001751 // Check for mapped buffers
1752 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1753 {
1754 return gl::error(GL_INVALID_OPERATION);
1755 }
1756
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001757 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001758 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001759 }
1760 }
1761 catch(std::bad_alloc&)
1762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001763 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001764 }
1765}
1766
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001767void __stdcall glEnable(GLenum cap)
1768{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001769 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001770
1771 try
1772 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001773 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001774
1775 if (context)
1776 {
Geoff Lang0550d032014-01-30 11:29:07 -05001777 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001779 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001780 }
Geoff Lang0550d032014-01-30 11:29:07 -05001781
1782 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001783 }
1784 }
1785 catch(std::bad_alloc&)
1786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001787 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001788 }
1789}
1790
1791void __stdcall glEnableVertexAttribArray(GLuint index)
1792{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001793 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001794
1795 try
1796 {
1797 if (index >= gl::MAX_VERTEX_ATTRIBS)
1798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001799 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001800 }
1801
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001802 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803
1804 if (context)
1805 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001806 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001807 }
1808 }
1809 catch(std::bad_alloc&)
1810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001811 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001812 }
1813}
1814
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001815void __stdcall glEndQueryEXT(GLenum target)
1816{
1817 EVENT("GLenum target = 0x%X)", target);
1818
1819 try
1820 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001821 gl::Context *context = gl::getNonLostContext();
1822
1823 if (context)
1824 {
Geoff Lang37dde692014-01-31 16:34:54 -05001825 if (!ValidQueryType(context, target))
1826 {
1827 return gl::error(GL_INVALID_ENUM);
1828 }
1829
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001830 context->endQuery(target);
1831 }
1832 }
1833 catch(std::bad_alloc&)
1834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001835 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001836 }
1837}
1838
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001839void __stdcall glFinishFenceNV(GLuint fence)
1840{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001841 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001842
1843 try
1844 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001845 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001846
1847 if (context)
1848 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001849 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001850
1851 if (fenceObject == NULL)
1852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001853 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001854 }
1855
Jamie Madillfb9a7402013-07-26 11:55:01 -04001856 if (fenceObject->isFence() != GL_TRUE)
1857 {
1858 return gl::error(GL_INVALID_OPERATION);
1859 }
1860
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001861 fenceObject->finishFence();
1862 }
1863 }
1864 catch(std::bad_alloc&)
1865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001866 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001867 }
1868}
1869
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001870void __stdcall glFinish(void)
1871{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001872 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001873
1874 try
1875 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001876 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001877
1878 if (context)
1879 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001880 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001881 }
1882 }
1883 catch(std::bad_alloc&)
1884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001885 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001886 }
1887}
1888
1889void __stdcall glFlush(void)
1890{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001891 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001892
1893 try
1894 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001895 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001896
1897 if (context)
1898 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001899 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001900 }
1901 }
1902 catch(std::bad_alloc&)
1903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001904 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001905 }
1906}
1907
1908void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001910 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001911 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001912
1913 try
1914 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001915 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001917 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001918 }
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 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001924 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001925 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001926 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001927 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001928
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001929 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1930 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001931
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001932 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001933 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001934 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001935 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001936 }
1937 else
1938 {
1939 switch (attachment)
1940 {
1941 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001942 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001943 break;
1944 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001945 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001946 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001947 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001948 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1949 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001950 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001951 UNREACHABLE();
1952 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001953 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001954 }
1955 }
1956 }
1957 catch(std::bad_alloc&)
1958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001959 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960 }
1961}
1962
1963void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1964{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001965 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001966 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001967
1968 try
1969 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001971 if (context)
1972 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001973 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001974 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001975 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001976 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001977 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04001978
1979 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001980 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001981 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001982 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001983 }
1984
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001985 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001986 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001987 textarget = GL_NONE;
1988 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001989
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001990 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001991
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001992 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001993 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001994 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001995 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001996 }
1997 else
1998 {
1999 switch (attachment)
2000 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002001 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2002 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2003 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002004 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002005 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002006 }
2007 }
2008 catch(std::bad_alloc&)
2009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002010 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002011 }
2012}
2013
2014void __stdcall glFrontFace(GLenum mode)
2015{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002016 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002017
2018 try
2019 {
2020 switch (mode)
2021 {
2022 case GL_CW:
2023 case GL_CCW:
2024 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002025 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002026
2027 if (context)
2028 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002029 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002030 }
2031 }
2032 break;
2033 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002034 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002035 }
2036 }
2037 catch(std::bad_alloc&)
2038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002039 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002040 }
2041}
2042
2043void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2044{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002045 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002046
2047 try
2048 {
2049 if (n < 0)
2050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002051 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002052 }
2053
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002054 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002055
2056 if (context)
2057 {
2058 for (int i = 0; i < n; i++)
2059 {
2060 buffers[i] = context->createBuffer();
2061 }
2062 }
2063 }
2064 catch(std::bad_alloc&)
2065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002067 }
2068}
2069
2070void __stdcall glGenerateMipmap(GLenum target)
2071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002072 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002073
2074 try
2075 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002076 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002077
2078 if (context)
2079 {
Jamie Madill35d15012013-10-07 10:46:37 -04002080 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002082 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002083 }
Geoff Langae4852a2013-06-05 15:00:34 -04002084
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002085 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04002086
2087 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002088 {
2089 return gl::error(GL_INVALID_OPERATION);
2090 }
2091
Geoff Lang005df412013-10-16 14:12:50 -04002092 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002093
Geoff Langae4852a2013-06-05 15:00:34 -04002094 // Internally, all texture formats are sized so checking if the format
2095 // is color renderable and filterable will not fail.
Jamie Madill61b54432014-02-18 15:27:19 -05002096
2097 bool validRenderable = (gl::IsColorRenderingSupported(internalFormat, context) ||
2098 gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
2099
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002100 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2101 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Jamie Madill61b54432014-02-18 15:27:19 -05002102 !gl::IsTextureFilteringSupported(internalFormat, context) ||
2103 !validRenderable)
Geoff Langae4852a2013-06-05 15:00:34 -04002104 {
2105 return gl::error(GL_INVALID_OPERATION);
2106 }
2107
Jamie Madillc1f8b162013-10-07 10:46:38 -04002108 // Non-power of 2 ES2 check
2109 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2110 {
2111 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2112 return gl::error(GL_INVALID_OPERATION);
2113 }
2114
2115 // Cube completeness check
2116 if (target == GL_TEXTURE_CUBE_MAP)
2117 {
2118 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2119 if (!textureCube->isCubeComplete())
2120 {
2121 return gl::error(GL_INVALID_OPERATION);
2122 }
2123 }
2124
Geoff Langae4852a2013-06-05 15:00:34 -04002125 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002126 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002127 }
2128 catch(std::bad_alloc&)
2129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002130 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002131 }
2132}
2133
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002134void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002136 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002137
2138 try
2139 {
2140 if (n < 0)
2141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002142 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002143 }
2144
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002145 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002146
2147 if (context)
2148 {
2149 for (int i = 0; i < n; i++)
2150 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002151 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002152 }
2153 }
2154 }
2155 catch(std::bad_alloc&)
2156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002157 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002158 }
2159}
2160
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002161void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002163 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002164
2165 try
2166 {
2167 if (n < 0)
2168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002169 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002170 }
2171
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002172 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002173
2174 if (context)
2175 {
2176 for (int i = 0; i < n; i++)
2177 {
2178 framebuffers[i] = context->createFramebuffer();
2179 }
2180 }
2181 }
2182 catch(std::bad_alloc&)
2183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002185 }
2186}
2187
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002188void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2189{
2190 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2191
2192 try
2193 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002194 gl::Context *context = gl::getNonLostContext();
2195
2196 if (context)
2197 {
Geoff Lang37dde692014-01-31 16:34:54 -05002198 if (n < 0)
2199 {
2200 return gl::error(GL_INVALID_VALUE);
2201 }
2202
2203 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002204 {
2205 ids[i] = context->createQuery();
2206 }
2207 }
2208 }
2209 catch(std::bad_alloc&)
2210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002211 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002212 }
2213}
2214
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002215void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002217 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002218
2219 try
2220 {
2221 if (n < 0)
2222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002223 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002224 }
2225
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002226 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002227
2228 if (context)
2229 {
2230 for (int i = 0; i < n; i++)
2231 {
2232 renderbuffers[i] = context->createRenderbuffer();
2233 }
2234 }
2235 }
2236 catch(std::bad_alloc&)
2237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002238 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002239 }
2240}
2241
2242void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2243{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002244 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002245
2246 try
2247 {
2248 if (n < 0)
2249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002250 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002251 }
2252
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002253 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002254
2255 if (context)
2256 {
2257 for (int i = 0; i < n; i++)
2258 {
2259 textures[i] = context->createTexture();
2260 }
2261 }
2262 }
2263 catch(std::bad_alloc&)
2264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002265 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002266 }
2267}
2268
daniel@transgaming.com85423182010-04-22 13:35:27 +00002269void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002270{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002271 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002272 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002273 program, index, bufsize, length, size, type, name);
2274
2275 try
2276 {
2277 if (bufsize < 0)
2278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002279 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002280 }
2281
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002282 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002283
2284 if (context)
2285 {
2286 gl::Program *programObject = context->getProgram(program);
2287
2288 if (!programObject)
2289 {
2290 if (context->getShader(program))
2291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002292 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002293 }
2294 else
2295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002296 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002297 }
2298 }
2299
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002300 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002302 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002303 }
2304
2305 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2306 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002307 }
2308 catch(std::bad_alloc&)
2309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002310 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002311 }
2312}
2313
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002314void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002315{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002316 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002317 "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 +00002318 program, index, bufsize, length, size, type, name);
2319
2320 try
2321 {
2322 if (bufsize < 0)
2323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002324 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002325 }
2326
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002327 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002328
2329 if (context)
2330 {
2331 gl::Program *programObject = context->getProgram(program);
2332
2333 if (!programObject)
2334 {
2335 if (context->getShader(program))
2336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002337 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002338 }
2339 else
2340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002341 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002342 }
2343 }
2344
2345 if (index >= (GLuint)programObject->getActiveUniformCount())
2346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002347 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002348 }
2349
2350 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2351 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002352 }
2353 catch(std::bad_alloc&)
2354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002355 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002356 }
2357}
2358
2359void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2360{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002361 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 +00002362 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002363
2364 try
2365 {
2366 if (maxcount < 0)
2367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002368 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369 }
2370
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002371 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002372
2373 if (context)
2374 {
2375 gl::Program *programObject = context->getProgram(program);
2376
2377 if (!programObject)
2378 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002379 if (context->getShader(program))
2380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002381 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002382 }
2383 else
2384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002385 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002386 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002387 }
2388
2389 return programObject->getAttachedShaders(maxcount, count, shaders);
2390 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391 }
2392 catch(std::bad_alloc&)
2393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002394 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002395 }
2396}
2397
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002398int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002399{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002400 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002401
2402 try
2403 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002404 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002405
2406 if (context)
2407 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002408
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002409 gl::Program *programObject = context->getProgram(program);
2410
2411 if (!programObject)
2412 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002413 if (context->getShader(program))
2414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002415 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002416 }
2417 else
2418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002419 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002420 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002421 }
2422
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002423 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002424 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002426 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002427 }
2428
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002429 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 }
2431 }
2432 catch(std::bad_alloc&)
2433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002434 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002435 }
2436
2437 return -1;
2438}
2439
2440void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2441{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002442 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443
2444 try
2445 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002447
2448 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002449 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002450 GLenum nativeType;
2451 unsigned int numParams = 0;
2452 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2453 return gl::error(GL_INVALID_ENUM);
2454
2455 // pname is valid, but there are no parameters to return
2456 if (numParams == 0)
2457 return;
2458
2459 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002460 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002461 context->getBooleanv(pname, params);
2462 }
Jamie Madill55856b12014-01-02 13:59:50 -05002463 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002464 {
Jamie Madill55856b12014-01-02 13:59:50 -05002465 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002466 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002467 }
2468 }
2469 catch(std::bad_alloc&)
2470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002471 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002472 }
2473}
2474
2475void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2476{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002477 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 +00002478
2479 try
2480 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002481 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002482
2483 if (context)
2484 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002485 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002486 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002487 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002488 }
2489
Jamie Madill70656a62014-03-05 15:01:26 -05002490 if (!gl::ValidBufferParameter(context, pname))
2491 {
2492 return gl::error(GL_INVALID_ENUM);
2493 }
2494
Jamie Madill8c96d582014-03-05 15:01:23 -05002495 gl::Buffer *buffer = context->getTargetBuffer(target);
2496
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002497 if (!buffer)
2498 {
2499 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002500 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002501 }
2502
2503 switch (pname)
2504 {
2505 case GL_BUFFER_USAGE:
Jamie Madill70656a62014-03-05 15:01:26 -05002506 *params = static_cast<GLint>(buffer->usage());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002507 break;
2508 case GL_BUFFER_SIZE:
Jamie Madill70656a62014-03-05 15:01:26 -05002509 *params = gl::clampCast<GLint>(buffer->size());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002510 break;
Jamie Madill70656a62014-03-05 15:01:26 -05002511 case GL_BUFFER_ACCESS_FLAGS:
2512 *params = buffer->accessFlags();
2513 break;
2514 case GL_BUFFER_MAPPED:
2515 *params = static_cast<GLint>(buffer->mapped());
2516 break;
2517 case GL_BUFFER_MAP_OFFSET:
2518 *params = gl::clampCast<GLint>(buffer->mapOffset());
2519 break;
2520 case GL_BUFFER_MAP_LENGTH:
2521 *params = gl::clampCast<GLint>(buffer->mapLength());
2522 break;
2523 default: UNREACHABLE(); break;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002524 }
2525 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002526 }
2527 catch(std::bad_alloc&)
2528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002529 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002530 }
2531}
2532
2533GLenum __stdcall glGetError(void)
2534{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002535 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536
2537 gl::Context *context = gl::getContext();
2538
2539 if (context)
2540 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002541 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002542 }
2543
2544 return GL_NO_ERROR;
2545}
2546
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002547void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2548{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002549 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002550
2551 try
2552 {
2553
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002554 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002555
2556 if (context)
2557 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002558 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002559
2560 if (fenceObject == NULL)
2561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002562 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002563 }
2564
Jamie Madillfb9a7402013-07-26 11:55:01 -04002565 if (fenceObject->isFence() != GL_TRUE)
2566 {
2567 return gl::error(GL_INVALID_OPERATION);
2568 }
2569
2570 switch (pname)
2571 {
2572 case GL_FENCE_STATUS_NV:
2573 case GL_FENCE_CONDITION_NV:
2574 break;
2575
2576 default: return gl::error(GL_INVALID_ENUM);
2577 }
2578
2579 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002580 }
2581 }
2582 catch(std::bad_alloc&)
2583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002584 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002585 }
2586}
2587
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002588void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2589{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002590 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002591
2592 try
2593 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002594 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002595
2596 if (context)
2597 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002598 GLenum nativeType;
2599 unsigned int numParams = 0;
2600 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2601 return gl::error(GL_INVALID_ENUM);
2602
2603 // pname is valid, but that there are no parameters to return.
2604 if (numParams == 0)
2605 return;
2606
2607 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002608 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002609 context->getFloatv(pname, params);
2610 }
Jamie Madill55856b12014-01-02 13:59:50 -05002611 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002612 {
Jamie Madill55856b12014-01-02 13:59:50 -05002613 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002614 }
2615 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002616 }
2617 catch(std::bad_alloc&)
2618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002619 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002620 }
2621}
2622
2623void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2624{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002625 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 +00002626 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002627
2628 try
2629 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002630 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002631
2632 if (context)
2633 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002634 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002636 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002637 }
2638
Geoff Lang646559f2013-08-15 11:08:15 -04002639 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002640 {
Geoff Lang646559f2013-08-15 11:08:15 -04002641 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2642 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2643 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2644 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2645 break;
2646 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2647 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2648 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2649 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2650 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2651 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2652 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2653 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2654 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2655 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002656 {
Geoff Lang646559f2013-08-15 11:08:15 -04002657 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002658 }
Geoff Lang646559f2013-08-15 11:08:15 -04002659 default:
2660 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002661 }
Geoff Lang646559f2013-08-15 11:08:15 -04002662
2663 // Determine if the attachment is a valid enum
2664 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002665 {
Geoff Lang646559f2013-08-15 11:08:15 -04002666 case GL_BACK:
2667 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002668 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002669 case GL_STENCIL:
2670 case GL_DEPTH_STENCIL_ATTACHMENT:
2671 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002672 {
Geoff Lang646559f2013-08-15 11:08:15 -04002673 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002674 }
Geoff Lang646559f2013-08-15 11:08:15 -04002675 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002676
Geoff Lang646559f2013-08-15 11:08:15 -04002677 case GL_DEPTH_ATTACHMENT:
2678 case GL_STENCIL_ATTACHMENT:
2679 break;
2680
2681 default:
2682 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2683 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2684 {
2685 return gl::error(GL_INVALID_ENUM);
2686 }
2687 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002688 }
2689
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002690 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2691 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002692 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2693
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002694 GLenum attachmentType;
2695 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002696 GLuint attachmentLevel;
2697 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002698 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002699
Geoff Lang646559f2013-08-15 11:08:15 -04002700 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002701 {
Geoff Lang646559f2013-08-15 11:08:15 -04002702 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002703 {
Geoff Lang646559f2013-08-15 11:08:15 -04002704 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002705 }
2706
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002707 switch (attachment)
2708 {
Geoff Lang646559f2013-08-15 11:08:15 -04002709 case GL_BACK:
2710 attachmentType = framebuffer->getColorbufferType(0);
2711 attachmentHandle = framebuffer->getColorbufferHandle(0);
2712 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2713 attachmentLayer = framebuffer->getColorbufferLayer(0);
2714 renderbuffer = framebuffer->getColorbuffer(0);
2715 break;
2716 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002717 attachmentType = framebuffer->getDepthbufferType();
2718 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002719 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2720 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002721 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002722 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002723 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002724 attachmentType = framebuffer->getStencilbufferType();
2725 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002726 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2727 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002728 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002729 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002730 default:
2731 return gl::error(GL_INVALID_OPERATION);
2732 }
2733 }
2734 else
2735 {
2736 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2737 {
2738 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2739 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2740 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2741 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2742 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2743 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2744 }
2745 else
2746 {
2747 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002748 {
Geoff Lang646559f2013-08-15 11:08:15 -04002749 case GL_DEPTH_ATTACHMENT:
2750 attachmentType = framebuffer->getDepthbufferType();
2751 attachmentHandle = framebuffer->getDepthbufferHandle();
2752 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2753 attachmentLayer = framebuffer->getDepthbufferLayer();
2754 renderbuffer = framebuffer->getDepthbuffer();
2755 break;
2756 case GL_STENCIL_ATTACHMENT:
2757 attachmentType = framebuffer->getStencilbufferType();
2758 attachmentHandle = framebuffer->getStencilbufferHandle();
2759 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2760 attachmentLayer = framebuffer->getStencilbufferLayer();
2761 renderbuffer = framebuffer->getStencilbuffer();
2762 break;
2763 case GL_DEPTH_STENCIL_ATTACHMENT:
2764 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2765 {
2766 return gl::error(GL_INVALID_OPERATION);
2767 }
2768 attachmentType = framebuffer->getDepthStencilbufferType();
2769 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2770 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2771 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2772 renderbuffer = framebuffer->getDepthStencilBuffer();
2773 break;
2774 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002775 return gl::error(GL_INVALID_OPERATION);
2776 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002777 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002778 }
2779
2780 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002781 if (framebufferHandle == 0)
2782 {
2783 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2784 }
2785 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002786 {
2787 attachmentObjectType = attachmentType;
2788 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002789 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002790 {
2791 attachmentObjectType = GL_TEXTURE;
2792 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002793 else
2794 {
2795 UNREACHABLE();
2796 return;
2797 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002798
Geoff Lang646559f2013-08-15 11:08:15 -04002799 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002800 {
Geoff Lang646559f2013-08-15 11:08:15 -04002801 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2802 // is NONE, then querying any other pname will generate INVALID_ENUM.
2803
2804 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2805 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2806 // INVALID_OPERATION for all other pnames
2807
2808 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002809 {
Geoff Lang646559f2013-08-15 11:08:15 -04002810 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2811 *params = attachmentObjectType;
2812 break;
2813
2814 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2815 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002816 {
Geoff Lang646559f2013-08-15 11:08:15 -04002817 return gl::error(GL_INVALID_ENUM);
2818 }
2819 *params = 0;
2820 break;
2821
2822 default:
2823 if (context->getClientVersion() < 3)
2824 {
2825 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002826 }
2827 else
2828 {
Geoff Lang646559f2013-08-15 11:08:15 -04002829 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002830 }
2831 }
Geoff Lang646559f2013-08-15 11:08:15 -04002832 }
2833 else
2834 {
2835 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2836 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2837 ASSERT(renderbuffer != NULL);
2838
2839 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002840 {
Geoff Lang646559f2013-08-15 11:08:15 -04002841 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2842 *params = attachmentObjectType;
2843 break;
2844
2845 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2846 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2847 {
2848 return gl::error(GL_INVALID_ENUM);
2849 }
2850 *params = attachmentHandle;
2851 break;
2852
2853 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2854 if (attachmentObjectType != GL_TEXTURE)
2855 {
2856 return gl::error(GL_INVALID_ENUM);
2857 }
2858 *params = attachmentLevel;
2859 break;
2860
2861 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2862 if (attachmentObjectType != GL_TEXTURE)
2863 {
2864 return gl::error(GL_INVALID_ENUM);
2865 }
2866 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2867 break;
2868
2869 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2870 *params = renderbuffer->getRedSize();
2871 break;
2872
2873 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2874 *params = renderbuffer->getGreenSize();
2875 break;
2876
2877 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2878 *params = renderbuffer->getBlueSize();
2879 break;
2880
2881 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2882 *params = renderbuffer->getAlphaSize();
2883 break;
2884
2885 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2886 *params = renderbuffer->getDepthSize();
2887 break;
2888
2889 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2890 *params = renderbuffer->getStencilSize();
2891 break;
2892
2893 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2894 if (attachment == GL_DEPTH_STENCIL)
2895 {
2896 gl::error(GL_INVALID_OPERATION);
2897 }
2898 *params = renderbuffer->getComponentType();
2899 break;
2900
2901 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2902 *params = renderbuffer->getColorEncoding();
2903 break;
2904
2905 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2906 if (attachmentObjectType != GL_TEXTURE)
2907 {
2908 return gl::error(GL_INVALID_ENUM);
2909 }
2910 *params = attachmentLayer;
2911 break;
2912
2913 default:
2914 UNREACHABLE();
2915 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002916 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002917 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002918 }
2919 }
2920 catch(std::bad_alloc&)
2921 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002922 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002923 }
2924}
2925
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002926GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2927{
2928 EVENT("()");
2929
2930 try
2931 {
2932 gl::Context *context = gl::getContext();
2933
2934 if (context)
2935 {
2936 return context->getResetStatus();
2937 }
2938
2939 return GL_NO_ERROR;
2940 }
2941 catch(std::bad_alloc&)
2942 {
2943 return GL_OUT_OF_MEMORY;
2944 }
2945}
2946
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002947void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002949 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002950
2951 try
2952 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002953 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002954
2955 if (context)
2956 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002957 GLenum nativeType;
2958 unsigned int numParams = 0;
2959 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2960 return gl::error(GL_INVALID_ENUM);
2961
2962 // pname is valid, but there are no parameters to return
2963 if (numParams == 0)
2964 return;
2965
2966 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002967 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002968 context->getIntegerv(pname, params);
2969 }
Jamie Madill55856b12014-01-02 13:59:50 -05002970 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002971 {
Jamie Madill55856b12014-01-02 13:59:50 -05002972 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973 }
2974 }
2975 }
2976 catch(std::bad_alloc&)
2977 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002978 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002979 }
2980}
2981
2982void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2983{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002984 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002985
2986 try
2987 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002988 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002989
2990 if (context)
2991 {
2992 gl::Program *programObject = context->getProgram(program);
2993
2994 if (!programObject)
2995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002996 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002997 }
2998
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002999 if (context->getClientVersion() < 3)
3000 {
3001 switch (pname)
3002 {
3003 case GL_ACTIVE_UNIFORM_BLOCKS:
3004 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003005 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3006 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3007 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003008 return gl::error(GL_INVALID_ENUM);
3009 }
3010 }
3011
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003012 switch (pname)
3013 {
3014 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003015 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003016 return;
3017 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003018 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003019 return;
3020 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003021 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003022 return;
3023 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003024 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003025 return;
3026 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003027 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003028 return;
3029 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003030 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003031 return;
3032 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003033 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003034 return;
3035 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003036 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003037 return;
3038 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003039 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003040 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003041 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003042 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003043 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003044 case GL_ACTIVE_UNIFORM_BLOCKS:
3045 *params = programObject->getActiveUniformBlockCount();
3046 return;
3047 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3048 *params = programObject->getActiveUniformBlockMaxLength();
3049 break;
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003050 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3051 *params = programObject->getTransformFeedbackBufferMode();
3052 break;
3053 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3054 *params = programObject->getTransformFeedbackVaryingCount();
3055 break;
3056 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
3057 *params = programObject->getTransformFeedbackVaryingMaxLength();
3058 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003059 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003060 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003061 }
3062 }
3063 }
3064 catch(std::bad_alloc&)
3065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003067 }
3068}
3069
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003070void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003072 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 +00003073 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003074
3075 try
3076 {
3077 if (bufsize < 0)
3078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003079 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003080 }
3081
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003082 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003083
3084 if (context)
3085 {
3086 gl::Program *programObject = context->getProgram(program);
3087
3088 if (!programObject)
3089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003090 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003091 }
3092
3093 programObject->getInfoLog(bufsize, length, infolog);
3094 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003095 }
3096 catch(std::bad_alloc&)
3097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003098 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003099 }
3100}
3101
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003102void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3103{
3104 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3105
3106 try
3107 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003108 gl::Context *context = gl::getNonLostContext();
3109
3110 if (context)
3111 {
Geoff Lang37dde692014-01-31 16:34:54 -05003112 if (!ValidQueryType(context, target))
3113 {
3114 return gl::error(GL_INVALID_ENUM);
3115 }
3116
3117 switch (pname)
3118 {
3119 case GL_CURRENT_QUERY_EXT:
3120 params[0] = context->getActiveQuery(target);
3121 break;
3122
3123 default:
3124 return gl::error(GL_INVALID_ENUM);
3125 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003126 }
3127 }
3128 catch(std::bad_alloc&)
3129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003130 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003131 }
3132}
3133
3134void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3135{
3136 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3137
3138 try
3139 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003140 gl::Context *context = gl::getNonLostContext();
3141
3142 if (context)
3143 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003144 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3145
3146 if (!queryObject)
3147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003148 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003149 }
3150
3151 if (context->getActiveQuery(queryObject->getType()) == id)
3152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003153 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003154 }
3155
3156 switch(pname)
3157 {
3158 case GL_QUERY_RESULT_EXT:
3159 params[0] = queryObject->getResult();
3160 break;
3161 case GL_QUERY_RESULT_AVAILABLE_EXT:
3162 params[0] = queryObject->isResultAvailable();
3163 break;
3164 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003165 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003166 }
3167 }
3168 }
3169 catch(std::bad_alloc&)
3170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003171 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003172 }
3173}
3174
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003175void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3176{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003177 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 +00003178
3179 try
3180 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003181 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003182
3183 if (context)
3184 {
3185 if (target != GL_RENDERBUFFER)
3186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003187 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003188 }
3189
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003190 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003192 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003193 }
3194
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003195 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003196
3197 switch (pname)
3198 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003199 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3200 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3201 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3202 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3203 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3204 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3205 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3206 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3207 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003208 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003209 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003210 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003211 *params = renderbuffer->getSamples();
3212 }
3213 else
3214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003215 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003216 }
3217 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003218 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003219 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003220 }
3221 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003222 }
3223 catch(std::bad_alloc&)
3224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003225 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003226 }
3227}
3228
3229void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3230{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003231 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003232
3233 try
3234 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003235 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003236
3237 if (context)
3238 {
3239 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003240
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003241 if (!shaderObject)
3242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003243 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003244 }
3245
3246 switch (pname)
3247 {
3248 case GL_SHADER_TYPE:
3249 *params = shaderObject->getType();
3250 return;
3251 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003252 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003253 return;
3254 case GL_COMPILE_STATUS:
3255 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3256 return;
3257 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003258 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003259 return;
3260 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003261 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003262 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003263 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3264 *params = shaderObject->getTranslatedSourceLength();
3265 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003266 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003267 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003268 }
3269 }
3270 }
3271 catch(std::bad_alloc&)
3272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003273 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003274 }
3275}
3276
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003277void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003278{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003279 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 +00003280 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003281
3282 try
3283 {
3284 if (bufsize < 0)
3285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003286 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003287 }
3288
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003290
3291 if (context)
3292 {
3293 gl::Shader *shaderObject = context->getShader(shader);
3294
3295 if (!shaderObject)
3296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003297 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003298 }
3299
3300 shaderObject->getInfoLog(bufsize, length, infolog);
3301 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003302 }
3303 catch(std::bad_alloc&)
3304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003305 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003306 }
3307}
3308
3309void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3310{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003311 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 +00003312 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003313
3314 try
3315 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003316 switch (shadertype)
3317 {
3318 case GL_VERTEX_SHADER:
3319 case GL_FRAGMENT_SHADER:
3320 break;
3321 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003322 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003323 }
3324
3325 switch (precisiontype)
3326 {
3327 case GL_LOW_FLOAT:
3328 case GL_MEDIUM_FLOAT:
3329 case GL_HIGH_FLOAT:
3330 // Assume IEEE 754 precision
3331 range[0] = 127;
3332 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003333 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003334 break;
3335 case GL_LOW_INT:
3336 case GL_MEDIUM_INT:
3337 case GL_HIGH_INT:
3338 // Some (most) hardware only supports single-precision floating-point numbers,
3339 // which can accurately represent integers up to +/-16777216
3340 range[0] = 24;
3341 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003342 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003343 break;
3344 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003345 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003346 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003347 }
3348 catch(std::bad_alloc&)
3349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003350 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003351 }
3352}
3353
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003354void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003355{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003356 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 +00003357 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003358
3359 try
3360 {
3361 if (bufsize < 0)
3362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003363 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364 }
3365
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003366 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003367
3368 if (context)
3369 {
3370 gl::Shader *shaderObject = context->getShader(shader);
3371
3372 if (!shaderObject)
3373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003374 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003375 }
3376
3377 shaderObject->getSource(bufsize, length, source);
3378 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003379 }
3380 catch(std::bad_alloc&)
3381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003382 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003383 }
3384}
3385
zmo@google.coma574f782011-10-03 21:45:23 +00003386void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3387{
3388 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3389 shader, bufsize, length, source);
3390
3391 try
3392 {
3393 if (bufsize < 0)
3394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003395 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003396 }
3397
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003398 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003399
3400 if (context)
3401 {
3402 gl::Shader *shaderObject = context->getShader(shader);
3403
3404 if (!shaderObject)
3405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003406 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003407 }
3408
3409 shaderObject->getTranslatedSource(bufsize, length, source);
3410 }
3411 }
3412 catch(std::bad_alloc&)
3413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003414 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003415 }
3416}
3417
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003418const GLubyte* __stdcall glGetString(GLenum name)
3419{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003420 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003421
3422 try
3423 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003424 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003425
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003426 switch (name)
3427 {
3428 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003429 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003430 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003431 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003432 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003433 if (context->getClientVersion() == 2)
3434 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003435 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003436 }
3437 else
3438 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003439 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003440 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003441 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003442 if (context->getClientVersion() == 2)
3443 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003444 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003445 }
3446 else
3447 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003448 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003449 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003450 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003451 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003452 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003453 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003454 }
3455 }
3456 catch(std::bad_alloc&)
3457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003458 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003459 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003460}
3461
3462void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3463{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003464 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 +00003465
3466 try
3467 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003468 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003469
3470 if (context)
3471 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003472 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003473
Jamie Madillfb8a8302013-07-03 14:24:12 -04003474 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003476 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003477 }
3478
3479 switch (pname)
3480 {
3481 case GL_TEXTURE_MAG_FILTER:
3482 *params = (GLfloat)texture->getMagFilter();
3483 break;
3484 case GL_TEXTURE_MIN_FILTER:
3485 *params = (GLfloat)texture->getMinFilter();
3486 break;
3487 case GL_TEXTURE_WRAP_S:
3488 *params = (GLfloat)texture->getWrapS();
3489 break;
3490 case GL_TEXTURE_WRAP_T:
3491 *params = (GLfloat)texture->getWrapT();
3492 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003493 case GL_TEXTURE_WRAP_R:
3494 if (context->getClientVersion() < 3)
3495 {
3496 return gl::error(GL_INVALID_ENUM);
3497 }
3498 *params = (GLfloat)texture->getWrapR();
3499 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003500 case GL_TEXTURE_IMMUTABLE_FORMAT:
3501 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003502 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3503 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003504 case GL_TEXTURE_IMMUTABLE_LEVELS:
3505 if (context->getClientVersion() < 3)
3506 {
3507 return gl::error(GL_INVALID_ENUM);
3508 }
Jamie Madill51a94372013-10-24 17:49:43 -04003509 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003510 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003511 case GL_TEXTURE_USAGE_ANGLE:
3512 *params = (GLfloat)texture->getUsage();
3513 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003514 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3515 if (!context->supportsTextureFilterAnisotropy())
3516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003517 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003518 }
3519 *params = (GLfloat)texture->getMaxAnisotropy();
3520 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003521 case GL_TEXTURE_SWIZZLE_R:
3522 if (context->getClientVersion() < 3)
3523 {
3524 return gl::error(GL_INVALID_ENUM);
3525 }
3526 *params = (GLfloat)texture->getSwizzleRed();
3527 break;
3528 case GL_TEXTURE_SWIZZLE_G:
3529 if (context->getClientVersion() < 3)
3530 {
3531 return gl::error(GL_INVALID_ENUM);
3532 }
3533 *params = (GLfloat)texture->getSwizzleGreen();
3534 break;
3535 case GL_TEXTURE_SWIZZLE_B:
3536 if (context->getClientVersion() < 3)
3537 {
3538 return gl::error(GL_INVALID_ENUM);
3539 }
3540 *params = (GLfloat)texture->getSwizzleBlue();
3541 break;
3542 case GL_TEXTURE_SWIZZLE_A:
3543 if (context->getClientVersion() < 3)
3544 {
3545 return gl::error(GL_INVALID_ENUM);
3546 }
3547 *params = (GLfloat)texture->getSwizzleAlpha();
3548 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003549 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003550 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003551 }
3552 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003553 }
3554 catch(std::bad_alloc&)
3555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003556 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003557 }
3558}
3559
3560void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3561{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003562 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 +00003563
3564 try
3565 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003566 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003567
3568 if (context)
3569 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003570 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003571
Jamie Madillfb8a8302013-07-03 14:24:12 -04003572 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003574 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003575 }
3576
3577 switch (pname)
3578 {
3579 case GL_TEXTURE_MAG_FILTER:
3580 *params = texture->getMagFilter();
3581 break;
3582 case GL_TEXTURE_MIN_FILTER:
3583 *params = texture->getMinFilter();
3584 break;
3585 case GL_TEXTURE_WRAP_S:
3586 *params = texture->getWrapS();
3587 break;
3588 case GL_TEXTURE_WRAP_T:
3589 *params = texture->getWrapT();
3590 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003591 case GL_TEXTURE_WRAP_R:
3592 if (context->getClientVersion() < 3)
3593 {
3594 return gl::error(GL_INVALID_ENUM);
3595 }
3596 *params = texture->getWrapR();
3597 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003598 case GL_TEXTURE_IMMUTABLE_FORMAT:
3599 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003600 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3601 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003602 case GL_TEXTURE_IMMUTABLE_LEVELS:
3603 if (context->getClientVersion() < 3)
3604 {
3605 return gl::error(GL_INVALID_ENUM);
3606 }
Jamie Madill51a94372013-10-24 17:49:43 -04003607 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003608 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003609 case GL_TEXTURE_USAGE_ANGLE:
3610 *params = texture->getUsage();
3611 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003612 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3613 if (!context->supportsTextureFilterAnisotropy())
3614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003615 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003616 }
3617 *params = (GLint)texture->getMaxAnisotropy();
3618 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003619 case GL_TEXTURE_SWIZZLE_R:
3620 if (context->getClientVersion() < 3)
3621 {
3622 return gl::error(GL_INVALID_ENUM);
3623 }
3624 *params = texture->getSwizzleRed();
3625 break;
3626 case GL_TEXTURE_SWIZZLE_G:
3627 if (context->getClientVersion() < 3)
3628 {
3629 return gl::error(GL_INVALID_ENUM);
3630 }
3631 *params = texture->getSwizzleGreen();
3632 break;
3633 case GL_TEXTURE_SWIZZLE_B:
3634 if (context->getClientVersion() < 3)
3635 {
3636 return gl::error(GL_INVALID_ENUM);
3637 }
3638 *params = texture->getSwizzleBlue();
3639 break;
3640 case GL_TEXTURE_SWIZZLE_A:
3641 if (context->getClientVersion() < 3)
3642 {
3643 return gl::error(GL_INVALID_ENUM);
3644 }
3645 *params = texture->getSwizzleAlpha();
3646 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003647
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003648 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003649 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003650 }
3651 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003652 }
3653 catch(std::bad_alloc&)
3654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003655 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003656 }
3657}
3658
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003659void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3660{
3661 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3662 program, location, bufSize, params);
3663
3664 try
3665 {
3666 if (bufSize < 0)
3667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003668 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003669 }
3670
3671 gl::Context *context = gl::getNonLostContext();
3672
3673 if (context)
3674 {
3675 if (program == 0)
3676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003677 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003678 }
3679
3680 gl::Program *programObject = context->getProgram(program);
3681
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003682 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003684 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003685 }
3686
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003687 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3688 if (!programBinary)
3689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003690 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003691 }
3692
3693 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003694 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003695 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003696 }
3697 }
3698 }
3699 catch(std::bad_alloc&)
3700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003701 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003702 }
3703}
3704
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003705void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3706{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003707 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003708
3709 try
3710 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003711 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003712
3713 if (context)
3714 {
3715 if (program == 0)
3716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003717 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003718 }
3719
3720 gl::Program *programObject = context->getProgram(program);
3721
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003722 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003724 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003725 }
3726
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003727 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3728 if (!programBinary)
3729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003730 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003731 }
3732
3733 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003735 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003736 }
3737 }
3738 }
3739 catch(std::bad_alloc&)
3740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003741 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003742 }
3743}
3744
3745void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3746{
3747 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3748 program, location, bufSize, params);
3749
3750 try
3751 {
3752 if (bufSize < 0)
3753 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003754 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003755 }
3756
3757 gl::Context *context = gl::getNonLostContext();
3758
3759 if (context)
3760 {
3761 if (program == 0)
3762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003763 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003764 }
3765
3766 gl::Program *programObject = context->getProgram(program);
3767
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003768 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003770 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003771 }
3772
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003773 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3774 if (!programBinary)
3775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003776 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003777 }
3778
3779 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003781 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003782 }
3783 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003784 }
3785 catch(std::bad_alloc&)
3786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003787 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003788 }
3789}
3790
3791void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3792{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003793 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003794
3795 try
3796 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003797 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003798
3799 if (context)
3800 {
3801 if (program == 0)
3802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003803 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003804 }
3805
3806 gl::Program *programObject = context->getProgram(program);
3807
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003808 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003810 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003811 }
3812
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003813 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3814 if (!programBinary)
3815 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003816 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003817 }
3818
3819 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003821 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003822 }
3823 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003824 }
3825 catch(std::bad_alloc&)
3826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003827 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003828 }
3829}
3830
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003831int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003832{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003833 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003834
3835 try
3836 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003837 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003838
3839 if (strstr(name, "gl_") == name)
3840 {
3841 return -1;
3842 }
3843
3844 if (context)
3845 {
3846 gl::Program *programObject = context->getProgram(program);
3847
3848 if (!programObject)
3849 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003850 if (context->getShader(program))
3851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003852 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003853 }
3854 else
3855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003856 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003857 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003858 }
3859
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003860 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003861 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003863 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003864 }
3865
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003866 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003867 }
3868 }
3869 catch(std::bad_alloc&)
3870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003871 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003872 }
3873
3874 return -1;
3875}
3876
3877void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3878{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003879 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003880
3881 try
3882 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003883 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003884
daniel@transgaming.come0078962010-04-15 20:45:08 +00003885 if (context)
3886 {
3887 if (index >= gl::MAX_VERTEX_ATTRIBS)
3888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003889 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003890 }
3891
daniel@transgaming.com83921382011-01-08 05:46:00 +00003892 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003893
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003894 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003895 {
Jamie Madillaff71502013-07-02 11:57:05 -04003896 return;
3897 }
3898
3899 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3900 {
3901 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3902 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003903 {
Jamie Madillaff71502013-07-02 11:57:05 -04003904 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003905 }
Jamie Madillaff71502013-07-02 11:57:05 -04003906 }
3907 else
3908 {
3909 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003910 }
3911 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003912 }
3913 catch(std::bad_alloc&)
3914 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003915 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003916 }
3917}
3918
3919void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3920{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003921 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003922
3923 try
3924 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003925 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003926
daniel@transgaming.come0078962010-04-15 20:45:08 +00003927 if (context)
3928 {
3929 if (index >= gl::MAX_VERTEX_ATTRIBS)
3930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003931 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003932 }
3933
daniel@transgaming.com83921382011-01-08 05:46:00 +00003934 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003935
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003936 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003937 {
Jamie Madillaff71502013-07-02 11:57:05 -04003938 return;
3939 }
3940
3941 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3942 {
3943 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3944 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003945 {
Jamie Madillaff71502013-07-02 11:57:05 -04003946 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003947 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003948 }
Jamie Madillaff71502013-07-02 11:57:05 -04003949 }
3950 else
3951 {
3952 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003953 }
3954 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003955 }
3956 catch(std::bad_alloc&)
3957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003958 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003959 }
3960}
3961
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003962void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003963{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003964 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003965
3966 try
3967 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003968 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003969
daniel@transgaming.come0078962010-04-15 20:45:08 +00003970 if (context)
3971 {
3972 if (index >= gl::MAX_VERTEX_ATTRIBS)
3973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003974 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003975 }
3976
3977 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003979 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003980 }
3981
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003982 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003983 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003984 }
3985 catch(std::bad_alloc&)
3986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003987 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003988 }
3989}
3990
3991void __stdcall glHint(GLenum target, GLenum mode)
3992{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003993 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994
3995 try
3996 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003997 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003998 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003999 case GL_FASTEST:
4000 case GL_NICEST:
4001 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004002 break;
4003 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004004 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004005 }
4006
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004007 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004008 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004009 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004010 case GL_GENERATE_MIPMAP_HINT:
4011 if (context) context->setGenerateMipmapHint(mode);
4012 break;
4013 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4014 if (context) context->setFragmentShaderDerivativeHint(mode);
4015 break;
4016 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004017 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004018 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004019 }
4020 catch(std::bad_alloc&)
4021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004022 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004023 }
4024}
4025
4026GLboolean __stdcall glIsBuffer(GLuint buffer)
4027{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004028 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004029
4030 try
4031 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004032 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004033
4034 if (context && buffer)
4035 {
4036 gl::Buffer *bufferObject = context->getBuffer(buffer);
4037
4038 if (bufferObject)
4039 {
4040 return GL_TRUE;
4041 }
4042 }
4043 }
4044 catch(std::bad_alloc&)
4045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004046 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004047 }
4048
4049 return GL_FALSE;
4050}
4051
4052GLboolean __stdcall glIsEnabled(GLenum cap)
4053{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004054 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004055
4056 try
4057 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004058 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004059
4060 if (context)
4061 {
Geoff Lang0550d032014-01-30 11:29:07 -05004062 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004063 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004064 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004065 }
Geoff Lang0550d032014-01-30 11:29:07 -05004066
4067 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004068 }
4069 }
4070 catch(std::bad_alloc&)
4071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004072 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004073 }
4074
4075 return false;
4076}
4077
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004078GLboolean __stdcall glIsFenceNV(GLuint fence)
4079{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004080 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004081
4082 try
4083 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004084 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004085
4086 if (context)
4087 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004088 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004089
4090 if (fenceObject == NULL)
4091 {
4092 return GL_FALSE;
4093 }
4094
4095 return fenceObject->isFence();
4096 }
4097 }
4098 catch(std::bad_alloc&)
4099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004100 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004101 }
4102
4103 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004104}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004105
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004106GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4107{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004108 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004109
4110 try
4111 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004112 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004113
4114 if (context && framebuffer)
4115 {
4116 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4117
4118 if (framebufferObject)
4119 {
4120 return GL_TRUE;
4121 }
4122 }
4123 }
4124 catch(std::bad_alloc&)
4125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004126 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004127 }
4128
4129 return GL_FALSE;
4130}
4131
4132GLboolean __stdcall glIsProgram(GLuint program)
4133{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004134 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004135
4136 try
4137 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004138 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004139
4140 if (context && program)
4141 {
4142 gl::Program *programObject = context->getProgram(program);
4143
4144 if (programObject)
4145 {
4146 return GL_TRUE;
4147 }
4148 }
4149 }
4150 catch(std::bad_alloc&)
4151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004152 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004153 }
4154
4155 return GL_FALSE;
4156}
4157
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004158GLboolean __stdcall glIsQueryEXT(GLuint id)
4159{
4160 EVENT("(GLuint id = %d)", id);
4161
4162 try
4163 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004164 gl::Context *context = gl::getNonLostContext();
4165
4166 if (context)
4167 {
Geoff Lang37dde692014-01-31 16:34:54 -05004168 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004169 }
4170 }
4171 catch(std::bad_alloc&)
4172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004173 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004174 }
4175
4176 return GL_FALSE;
4177}
4178
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004179GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4180{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004181 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004182
4183 try
4184 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004185 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004186
4187 if (context && renderbuffer)
4188 {
4189 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4190
4191 if (renderbufferObject)
4192 {
4193 return GL_TRUE;
4194 }
4195 }
4196 }
4197 catch(std::bad_alloc&)
4198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004199 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004200 }
4201
4202 return GL_FALSE;
4203}
4204
4205GLboolean __stdcall glIsShader(GLuint shader)
4206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004207 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004208
4209 try
4210 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004211 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004212
4213 if (context && shader)
4214 {
4215 gl::Shader *shaderObject = context->getShader(shader);
4216
4217 if (shaderObject)
4218 {
4219 return GL_TRUE;
4220 }
4221 }
4222 }
4223 catch(std::bad_alloc&)
4224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004225 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004226 }
4227
4228 return GL_FALSE;
4229}
4230
4231GLboolean __stdcall glIsTexture(GLuint texture)
4232{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004233 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004234
4235 try
4236 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004237 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004238
4239 if (context && texture)
4240 {
4241 gl::Texture *textureObject = context->getTexture(texture);
4242
4243 if (textureObject)
4244 {
4245 return GL_TRUE;
4246 }
4247 }
4248 }
4249 catch(std::bad_alloc&)
4250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004251 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004252 }
4253
4254 return GL_FALSE;
4255}
4256
4257void __stdcall glLineWidth(GLfloat width)
4258{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004259 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004260
4261 try
4262 {
4263 if (width <= 0.0f)
4264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004265 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004266 }
4267
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004268 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004269
4270 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004271 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004272 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004273 }
4274 }
4275 catch(std::bad_alloc&)
4276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004277 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004278 }
4279}
4280
4281void __stdcall glLinkProgram(GLuint program)
4282{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004283 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004284
4285 try
4286 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004287 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004288
4289 if (context)
4290 {
4291 gl::Program *programObject = context->getProgram(program);
4292
4293 if (!programObject)
4294 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004295 if (context->getShader(program))
4296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004297 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004298 }
4299 else
4300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004301 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004302 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004303 }
4304
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004305 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004306 }
4307 }
4308 catch(std::bad_alloc&)
4309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004310 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004311 }
4312}
4313
4314void __stdcall glPixelStorei(GLenum pname, GLint param)
4315{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004316 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004317
4318 try
4319 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004320 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004321
4322 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004323 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004324 switch (pname)
4325 {
4326 case GL_UNPACK_ALIGNMENT:
4327 if (param != 1 && param != 2 && param != 4 && param != 8)
4328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004329 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004330 }
4331
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004332 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004333 break;
4334
4335 case GL_PACK_ALIGNMENT:
4336 if (param != 1 && param != 2 && param != 4 && param != 8)
4337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004338 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004339 }
4340
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004341 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004342 break;
4343
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004344 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4345 context->setPackReverseRowOrder(param != 0);
4346 break;
4347
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004348 case GL_UNPACK_IMAGE_HEIGHT:
4349 case GL_UNPACK_SKIP_IMAGES:
4350 case GL_UNPACK_ROW_LENGTH:
4351 case GL_UNPACK_SKIP_ROWS:
4352 case GL_UNPACK_SKIP_PIXELS:
4353 case GL_PACK_ROW_LENGTH:
4354 case GL_PACK_SKIP_ROWS:
4355 case GL_PACK_SKIP_PIXELS:
4356 if (context->getClientVersion() < 3)
4357 {
4358 return gl::error(GL_INVALID_ENUM);
4359 }
4360 UNIMPLEMENTED();
4361 break;
4362
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004363 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004364 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004365 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004366 }
4367 }
4368 catch(std::bad_alloc&)
4369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004370 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004371 }
4372}
4373
4374void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004376 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004377
4378 try
4379 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004380 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004381
4382 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004383 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004384 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004385 }
4386 }
4387 catch(std::bad_alloc&)
4388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004389 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004390 }
4391}
4392
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004393void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4394 GLenum format, GLenum type, GLsizei bufSize,
4395 GLvoid *data)
4396{
4397 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4398 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4399 x, y, width, height, format, type, bufSize, data);
4400
4401 try
4402 {
4403 if (width < 0 || height < 0 || bufSize < 0)
4404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004405 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004406 }
4407
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004408 gl::Context *context = gl::getNonLostContext();
4409
4410 if (context)
4411 {
Jamie Madill26e91952014-03-05 15:01:27 -05004412 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4413 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004414 {
Jamie Madill26e91952014-03-05 15:01:27 -05004415 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004416 }
4417
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004418 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4419 }
4420 }
4421 catch(std::bad_alloc&)
4422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004423 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004424 }
4425}
4426
4427void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4428 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004429{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004430 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004431 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004432 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004433
4434 try
4435 {
4436 if (width < 0 || height < 0)
4437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004438 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004439 }
4440
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004441 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004442
4443 if (context)
4444 {
Jamie Madill26e91952014-03-05 15:01:27 -05004445 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4446 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004447 {
Jamie Madill26e91952014-03-05 15:01:27 -05004448 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004449 }
4450
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004451 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004452 }
4453 }
4454 catch(std::bad_alloc&)
4455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004456 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004457 }
4458}
4459
4460void __stdcall glReleaseShaderCompiler(void)
4461{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004462 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004463
4464 try
4465 {
4466 gl::Shader::releaseCompiler();
4467 }
4468 catch(std::bad_alloc&)
4469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004470 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004471 }
4472}
4473
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004474void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004475{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004476 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 +00004477 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004478
4479 try
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 Lang34dbb6f2013-08-05 15:05:47 -04004485 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004486 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004487 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004488 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004490
4491 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004492 }
4493 }
4494 catch(std::bad_alloc&)
4495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004496 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004497 }
4498}
4499
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004500void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4501{
4502 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4503}
4504
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004505void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4506{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004507 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004508
4509 try
4510 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004511 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004512
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004513 if (context)
4514 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004515 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004516 }
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.comfe208882010-09-01 15:47:57 +00004524void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004526 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004527
4528 try
4529 {
4530 if (condition != GL_ALL_COMPLETED_NV)
4531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004532 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004533 }
4534
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004535 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004536
4537 if (context)
4538 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004539 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004540
4541 if (fenceObject == NULL)
4542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004543 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004544 }
4545
4546 fenceObject->setFence(condition);
4547 }
4548 }
4549 catch(std::bad_alloc&)
4550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004551 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004552 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004553}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004554
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004555void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4556{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004557 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 +00004558
4559 try
4560 {
4561 if (width < 0 || height < 0)
4562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004563 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004564 }
4565
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004566 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004567
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004568 if (context)
4569 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004570 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004571 }
4572 }
4573 catch(std::bad_alloc&)
4574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004575 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004576 }
4577}
4578
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004579void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004580{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004581 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004582 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004583 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004584
4585 try
4586 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004587 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004588 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004589 }
4590 catch(std::bad_alloc&)
4591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004592 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593 }
4594}
4595
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004596void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004598 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 +00004599 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004600
4601 try
4602 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004603 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004605 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004606 }
4607
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004608 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004609
4610 if (context)
4611 {
4612 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004613
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004614 if (!shaderObject)
4615 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004616 if (context->getProgram(shader))
4617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004618 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004619 }
4620 else
4621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004623 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004624 }
4625
4626 shaderObject->setSource(count, string, length);
4627 }
4628 }
4629 catch(std::bad_alloc&)
4630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004631 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004632 }
4633}
4634
4635void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4636{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004637 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004638}
4639
4640void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4641{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004642 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 +00004643
4644 try
4645 {
4646 switch (face)
4647 {
4648 case GL_FRONT:
4649 case GL_BACK:
4650 case GL_FRONT_AND_BACK:
4651 break;
4652 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004653 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004654 }
4655
4656 switch (func)
4657 {
4658 case GL_NEVER:
4659 case GL_ALWAYS:
4660 case GL_LESS:
4661 case GL_LEQUAL:
4662 case GL_EQUAL:
4663 case GL_GEQUAL:
4664 case GL_GREATER:
4665 case GL_NOTEQUAL:
4666 break;
4667 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004668 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004669 }
4670
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004671 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004672
4673 if (context)
4674 {
4675 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4676 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004677 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004678 }
4679
4680 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4681 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004682 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004683 }
4684 }
4685 }
4686 catch(std::bad_alloc&)
4687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004688 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004689 }
4690}
4691
4692void __stdcall glStencilMask(GLuint mask)
4693{
4694 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4695}
4696
4697void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4698{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004699 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004700
4701 try
4702 {
4703 switch (face)
4704 {
4705 case GL_FRONT:
4706 case GL_BACK:
4707 case GL_FRONT_AND_BACK:
4708 break;
4709 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004710 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004711 }
4712
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004713 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004714
4715 if (context)
4716 {
4717 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4718 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004719 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004720 }
4721
4722 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4723 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004724 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004725 }
4726 }
4727 }
4728 catch(std::bad_alloc&)
4729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004730 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004731 }
4732}
4733
4734void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4735{
4736 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4737}
4738
4739void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4740{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004741 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 +00004742 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004743
4744 try
4745 {
4746 switch (face)
4747 {
4748 case GL_FRONT:
4749 case GL_BACK:
4750 case GL_FRONT_AND_BACK:
4751 break;
4752 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004753 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004754 }
4755
4756 switch (fail)
4757 {
4758 case GL_ZERO:
4759 case GL_KEEP:
4760 case GL_REPLACE:
4761 case GL_INCR:
4762 case GL_DECR:
4763 case GL_INVERT:
4764 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004765 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004766 break;
4767 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004768 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769 }
4770
4771 switch (zfail)
4772 {
4773 case GL_ZERO:
4774 case GL_KEEP:
4775 case GL_REPLACE:
4776 case GL_INCR:
4777 case GL_DECR:
4778 case GL_INVERT:
4779 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004780 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004781 break;
4782 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004783 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004784 }
4785
4786 switch (zpass)
4787 {
4788 case GL_ZERO:
4789 case GL_KEEP:
4790 case GL_REPLACE:
4791 case GL_INCR:
4792 case GL_DECR:
4793 case GL_INVERT:
4794 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004795 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004796 break;
4797 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004798 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004799 }
4800
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004801 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004802
4803 if (context)
4804 {
4805 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4806 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004807 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004808 }
4809
4810 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4811 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004812 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004813 }
4814 }
4815 }
4816 catch(std::bad_alloc&)
4817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004818 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004819 }
4820}
4821
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004822GLboolean __stdcall glTestFenceNV(GLuint fence)
4823{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004824 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004825
4826 try
4827 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004828 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004829
4830 if (context)
4831 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004832 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004833
4834 if (fenceObject == NULL)
4835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004836 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004837 }
4838
Jamie Madillfb9a7402013-07-26 11:55:01 -04004839 if (fenceObject->isFence() != GL_TRUE)
4840 {
4841 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4842 }
4843
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004844 return fenceObject->testFence();
4845 }
4846 }
4847 catch(std::bad_alloc&)
4848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004849 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004850 }
4851
4852 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004853}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004854
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004855void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4856 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004857{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004858 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004859 "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 +00004860 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004861
4862 try
4863 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004864 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004865
4866 if (context)
4867 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004868 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004869 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004870 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004871 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004872 return;
4873 }
4874
4875 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004876 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004877 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004878 {
4879 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004880 }
4881
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004882 switch (target)
4883 {
4884 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004885 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004886 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004887 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004888 }
4889 break;
4890 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004891 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004892 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004893 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004894 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004895 break;
4896 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4897 {
4898 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004899 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004900 }
4901 break;
4902 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4903 {
4904 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004905 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004906 }
4907 break;
4908 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4909 {
4910 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004911 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004912 }
4913 break;
4914 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4915 {
4916 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004917 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004918 }
4919 break;
4920 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4921 {
4922 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004923 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004924 }
4925 break;
4926 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004927 }
4928 }
4929 }
4930 catch(std::bad_alloc&)
4931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004932 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004933 }
4934}
4935
4936void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4937{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004938 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4939
4940 try
4941 {
4942 gl::Context *context = gl::getNonLostContext();
4943
4944 if (context)
4945 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004946 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004947 {
4948 return;
4949 }
4950
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004951 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004952
Jamie Madillfb8a8302013-07-03 14:24:12 -04004953 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004954 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004955 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004956 }
4957
4958 switch (pname)
4959 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004960 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
4961 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
4962 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
4963 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
4964 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
4965 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
4966 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
4967 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
4968 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004969 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
4970 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
4971 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
4972 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004973
Jamie Madill478fdb22013-07-19 16:36:59 -04004974 case GL_TEXTURE_BASE_LEVEL:
4975 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004976 case GL_TEXTURE_MIN_LOD:
4977 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004978 UNIMPLEMENTED();
4979 break;
4980
Jamie Madill478fdb22013-07-19 16:36:59 -04004981 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004982 }
4983 }
4984 }
4985 catch(std::bad_alloc&)
4986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004987 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004988 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004989}
4990
4991void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4992{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004993 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004994}
4995
4996void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4997{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004998 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004999
5000 try
5001 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005002 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005003
5004 if (context)
5005 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005006 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005007 {
5008 return;
5009 }
5010
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005011 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005012
Jamie Madillfb8a8302013-07-03 14:24:12 -04005013 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005015 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005016 }
5017
5018 switch (pname)
5019 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005020 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5021 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5022 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5023 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5024 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5025 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5026 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5027 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5028 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005029 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5030 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5031 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5032 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005033
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005034 case GL_TEXTURE_BASE_LEVEL:
5035 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005036 case GL_TEXTURE_MIN_LOD:
5037 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005038 UNIMPLEMENTED();
5039 break;
5040
Jamie Madill478fdb22013-07-19 16:36:59 -04005041 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005042 }
5043 }
5044 }
5045 catch(std::bad_alloc&)
5046 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005047 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005048 }
5049}
5050
5051void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5052{
5053 glTexParameteri(target, pname, *params);
5054}
5055
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005056void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5057{
5058 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5059 target, levels, internalformat, width, height);
5060
5061 try
5062 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005063 gl::Context *context = gl::getNonLostContext();
5064
5065 if (context)
5066 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005067 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005068 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005069 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005070 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005071 }
5072
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005073 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005074 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005075 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005076 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005077 }
5078
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005079 switch (target)
5080 {
5081 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005082 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005083 gl::Texture2D *texture2d = context->getTexture2D();
5084 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005085 }
5086 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005087
Geoff Lang01c21d22013-09-24 11:52:16 -04005088 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005089 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005090 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5091 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005092 }
5093 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005094
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005095 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005096 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005097 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005098 }
5099 }
5100 catch(std::bad_alloc&)
5101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005102 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005103 }
5104}
5105
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005106void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5107 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005108{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005109 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005110 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005111 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005112 target, level, xoffset, yoffset, width, height, format, type, pixels);
5113
5114 try
5115 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005116 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005117
5118 if (context)
5119 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005120 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005121 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005122 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005123 {
5124 return;
5125 }
5126
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005127 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005128 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005129 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005130 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005131 return;
5132 }
5133
5134 switch (target)
5135 {
5136 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005137 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005138 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005139 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005140 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005141 break;
5142
5143 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5144 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5145 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5146 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5147 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5148 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005149 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005150 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005151 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005152 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005153 break;
5154
5155 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005156 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005157 }
5158 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005159 }
5160 catch(std::bad_alloc&)
5161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005162 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005163 }
5164}
5165
5166void __stdcall glUniform1f(GLint location, GLfloat x)
5167{
5168 glUniform1fv(location, 1, &x);
5169}
5170
5171void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5172{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005173 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005174
5175 try
5176 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005177 if (count < 0)
5178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005179 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005180 }
5181
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005182 if (location == -1)
5183 {
5184 return;
5185 }
5186
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005187 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005188
5189 if (context)
5190 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005191 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005192 if (!programBinary)
5193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005194 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005195 }
5196
5197 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005199 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005200 }
5201 }
5202 }
5203 catch(std::bad_alloc&)
5204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005205 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005206 }
5207}
5208
5209void __stdcall glUniform1i(GLint location, GLint x)
5210{
5211 glUniform1iv(location, 1, &x);
5212}
5213
5214void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005216 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005217
5218 try
5219 {
5220 if (count < 0)
5221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005222 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005223 }
5224
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005225 if (location == -1)
5226 {
5227 return;
5228 }
5229
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005230 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005231
5232 if (context)
5233 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005234 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005235 if (!programBinary)
5236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005237 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005238 }
5239
5240 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005242 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005243 }
5244 }
5245 }
5246 catch(std::bad_alloc&)
5247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005248 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005249 }
5250}
5251
5252void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5253{
5254 GLfloat xy[2] = {x, y};
5255
5256 glUniform2fv(location, 1, (GLfloat*)&xy);
5257}
5258
5259void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5260{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005261 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005262
5263 try
5264 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265 if (count < 0)
5266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005267 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005268 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005269
5270 if (location == -1)
5271 {
5272 return;
5273 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005274
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005275 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276
5277 if (context)
5278 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005279 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005280 if (!programBinary)
5281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005282 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005283 }
5284
5285 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005287 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005288 }
5289 }
5290 }
5291 catch(std::bad_alloc&)
5292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005293 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005294 }
5295}
5296
5297void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5298{
5299 GLint xy[4] = {x, y};
5300
5301 glUniform2iv(location, 1, (GLint*)&xy);
5302}
5303
5304void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5305{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005306 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005307
5308 try
5309 {
5310 if (count < 0)
5311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005312 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005313 }
5314
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005315 if (location == -1)
5316 {
5317 return;
5318 }
5319
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005320 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005321
5322 if (context)
5323 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005324 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005325 if (!programBinary)
5326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005327 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005328 }
5329
5330 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005332 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005333 }
5334 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005335 }
5336 catch(std::bad_alloc&)
5337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005338 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005339 }
5340}
5341
5342void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5343{
5344 GLfloat xyz[3] = {x, y, z};
5345
5346 glUniform3fv(location, 1, (GLfloat*)&xyz);
5347}
5348
5349void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5350{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005351 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005352
5353 try
5354 {
5355 if (count < 0)
5356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005357 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005358 }
5359
5360 if (location == -1)
5361 {
5362 return;
5363 }
5364
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005365 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005366
5367 if (context)
5368 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005369 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005370 if (!programBinary)
5371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005372 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005373 }
5374
5375 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005377 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005378 }
5379 }
5380 }
5381 catch(std::bad_alloc&)
5382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005383 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005384 }
5385}
5386
5387void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5388{
5389 GLint xyz[3] = {x, y, z};
5390
5391 glUniform3iv(location, 1, (GLint*)&xyz);
5392}
5393
5394void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5395{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005396 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005397
5398 try
5399 {
5400 if (count < 0)
5401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005402 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005403 }
5404
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005405 if (location == -1)
5406 {
5407 return;
5408 }
5409
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005410 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005411
5412 if (context)
5413 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005414 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005415 if (!programBinary)
5416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005417 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005418 }
5419
5420 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005422 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005423 }
5424 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005425 }
5426 catch(std::bad_alloc&)
5427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005428 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005429 }
5430}
5431
5432void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5433{
5434 GLfloat xyzw[4] = {x, y, z, w};
5435
5436 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5437}
5438
5439void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5440{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005441 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005442
5443 try
5444 {
5445 if (count < 0)
5446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005447 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005448 }
5449
5450 if (location == -1)
5451 {
5452 return;
5453 }
5454
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005455 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005456
5457 if (context)
5458 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005459 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005460 if (!programBinary)
5461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005462 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005463 }
5464
5465 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005467 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005468 }
5469 }
5470 }
5471 catch(std::bad_alloc&)
5472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005473 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005474 }
5475}
5476
5477void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5478{
5479 GLint xyzw[4] = {x, y, z, w};
5480
5481 glUniform4iv(location, 1, (GLint*)&xyzw);
5482}
5483
5484void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5485{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005486 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005487
5488 try
5489 {
5490 if (count < 0)
5491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005492 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005493 }
5494
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005495 if (location == -1)
5496 {
5497 return;
5498 }
5499
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005500 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005501
5502 if (context)
5503 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005504 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005505 if (!programBinary)
5506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005507 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005508 }
5509
5510 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005512 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005513 }
5514 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005515 }
5516 catch(std::bad_alloc&)
5517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005518 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005519 }
5520}
5521
5522void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5523{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005524 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005525 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005526
5527 try
5528 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005529 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005531 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005532 }
5533
5534 if (location == -1)
5535 {
5536 return;
5537 }
5538
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005539 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005540
5541 if (context)
5542 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005543 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5544 {
5545 return gl::error(GL_INVALID_VALUE);
5546 }
5547
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005548 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005549 if (!programBinary)
5550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005551 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005552 }
5553
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005554 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005556 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005557 }
5558 }
5559 }
5560 catch(std::bad_alloc&)
5561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005562 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005563 }
5564}
5565
5566void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5567{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005568 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005569 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005570
5571 try
5572 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005573 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005575 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005576 }
5577
5578 if (location == -1)
5579 {
5580 return;
5581 }
5582
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005583 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005584
5585 if (context)
5586 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005587 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5588 {
5589 return gl::error(GL_INVALID_VALUE);
5590 }
5591
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005592 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005593 if (!programBinary)
5594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005595 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005596 }
5597
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005598 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005600 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005601 }
5602 }
5603 }
5604 catch(std::bad_alloc&)
5605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005606 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005607 }
5608}
5609
5610void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5611{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005612 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005613 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005614
5615 try
5616 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005617 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005619 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005620 }
5621
5622 if (location == -1)
5623 {
5624 return;
5625 }
5626
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005628
5629 if (context)
5630 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005631 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5632 {
5633 return gl::error(GL_INVALID_VALUE);
5634 }
5635
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005636 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005637 if (!programBinary)
5638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005639 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005640 }
5641
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005642 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005644 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005645 }
5646 }
5647 }
5648 catch(std::bad_alloc&)
5649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005650 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005651 }
5652}
5653
5654void __stdcall glUseProgram(GLuint program)
5655{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005656 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005657
5658 try
5659 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661
5662 if (context)
5663 {
5664 gl::Program *programObject = context->getProgram(program);
5665
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005666 if (!programObject && program != 0)
5667 {
5668 if (context->getShader(program))
5669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005670 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005671 }
5672 else
5673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005674 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005675 }
5676 }
5677
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005678 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005679 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005680 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005681 }
5682
5683 context->useProgram(program);
5684 }
5685 }
5686 catch(std::bad_alloc&)
5687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005688 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005689 }
5690}
5691
5692void __stdcall glValidateProgram(GLuint program)
5693{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005694 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005695
5696 try
5697 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005698 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005699
5700 if (context)
5701 {
5702 gl::Program *programObject = context->getProgram(program);
5703
5704 if (!programObject)
5705 {
5706 if (context->getShader(program))
5707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005708 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005709 }
5710 else
5711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005712 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005713 }
5714 }
5715
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005716 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005717 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005718 }
5719 catch(std::bad_alloc&)
5720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005722 }
5723}
5724
5725void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005727 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005728
5729 try
5730 {
5731 if (index >= gl::MAX_VERTEX_ATTRIBS)
5732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005734 }
5735
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005736 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005737
5738 if (context)
5739 {
5740 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005741 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005742 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005743 }
5744 catch(std::bad_alloc&)
5745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005746 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005747 }
5748}
5749
5750void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5751{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005752 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005753
5754 try
5755 {
5756 if (index >= gl::MAX_VERTEX_ATTRIBS)
5757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005758 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005759 }
5760
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005761 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005762
5763 if (context)
5764 {
5765 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005766 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +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 glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5776{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005777 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
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, y, 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 glVertexAttrib2fv(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], values[1], 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 glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5826{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005827 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 +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, z, 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 glVertexAttrib3fv(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], values[2], 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 glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5876{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005877 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 +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, w };
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 glVertexAttrib4fv(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 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005915 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005916 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005917 }
5918 catch(std::bad_alloc&)
5919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005920 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005921 }
5922}
5923
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005924void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5925{
5926 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5927
5928 try
5929 {
5930 if (index >= gl::MAX_VERTEX_ATTRIBS)
5931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005932 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005933 }
5934
5935 gl::Context *context = gl::getNonLostContext();
5936
5937 if (context)
5938 {
5939 context->setVertexAttribDivisor(index, divisor);
5940 }
5941 }
5942 catch(std::bad_alloc&)
5943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005944 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005945 }
5946}
5947
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005948void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005949{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005950 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005951 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005952 index, size, type, normalized, stride, ptr);
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
5961 if (size < 1 || size > 4)
5962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005963 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005964 }
5965
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005966 gl::Context *context = gl::getNonLostContext();
5967
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005968 switch (type)
5969 {
5970 case GL_BYTE:
5971 case GL_UNSIGNED_BYTE:
5972 case GL_SHORT:
5973 case GL_UNSIGNED_SHORT:
5974 case GL_FIXED:
5975 case GL_FLOAT:
5976 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005977 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005978 case GL_INT:
5979 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005980 case GL_INT_2_10_10_10_REV:
5981 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005982 if (context && context->getClientVersion() < 3)
5983 {
5984 return gl::error(GL_INVALID_ENUM);
5985 }
5986 else
5987 {
5988 break;
5989 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005990 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005991 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005992 }
5993
5994 if (stride < 0)
5995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005996 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005997 }
5998
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005999 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6000 {
6001 return gl::error(GL_INVALID_OPERATION);
6002 }
6003
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006004 if (context)
6005 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006006 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6007 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6008 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6009 // and the pointer argument is not NULL.
6010 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6011 {
6012 return gl::error(GL_INVALID_OPERATION);
6013 }
6014
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006015 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6016 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006017 }
6018 }
6019 catch(std::bad_alloc&)
6020 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006021 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006022 }
6023}
6024
6025void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6026{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006027 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 +00006028
6029 try
6030 {
6031 if (width < 0 || height < 0)
6032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006033 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006034 }
6035
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006036 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006037
6038 if (context)
6039 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006040 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006041 }
6042 }
6043 catch(std::bad_alloc&)
6044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006045 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006046 }
6047}
6048
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006049// OpenGL ES 3.0 functions
6050
6051void __stdcall glReadBuffer(GLenum mode)
6052{
6053 EVENT("(GLenum mode = 0x%X)", mode);
6054
6055 try
6056 {
6057 gl::Context *context = gl::getNonLostContext();
6058
6059 if (context)
6060 {
6061 if (context->getClientVersion() < 3)
6062 {
6063 return gl::error(GL_INVALID_OPERATION);
6064 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006065
Jamie Madill54133512013-06-21 09:33:07 -04006066 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006067 UNIMPLEMENTED();
6068 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006069 }
6070 catch(std::bad_alloc&)
6071 {
6072 return gl::error(GL_OUT_OF_MEMORY);
6073 }
6074}
6075
6076void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6077{
6078 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6079 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6080
6081 try
6082 {
6083 gl::Context *context = gl::getNonLostContext();
6084
6085 if (context)
6086 {
6087 if (context->getClientVersion() < 3)
6088 {
6089 return gl::error(GL_INVALID_OPERATION);
6090 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006091
Jamie Madill54133512013-06-21 09:33:07 -04006092 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006093 UNIMPLEMENTED();
6094 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006095 }
6096 catch(std::bad_alloc&)
6097 {
6098 return gl::error(GL_OUT_OF_MEMORY);
6099 }
6100}
6101
6102void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6103{
6104 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6105 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6106 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6107 target, level, internalformat, width, height, depth, border, format, type, pixels);
6108
6109 try
6110 {
6111 gl::Context *context = gl::getNonLostContext();
6112
6113 if (context)
6114 {
6115 if (context->getClientVersion() < 3)
6116 {
6117 return gl::error(GL_INVALID_OPERATION);
6118 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006119
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006120 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006121 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006122 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006123 {
6124 return;
6125 }
6126
6127 switch(target)
6128 {
6129 case GL_TEXTURE_3D:
6130 {
6131 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006132 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006133 }
6134 break;
6135
6136 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006137 {
6138 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006139 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006140 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006141 break;
6142
6143 default:
6144 return gl::error(GL_INVALID_ENUM);
6145 }
6146 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006147 }
6148 catch(std::bad_alloc&)
6149 {
6150 return gl::error(GL_OUT_OF_MEMORY);
6151 }
6152}
6153
6154void __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)
6155{
6156 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6157 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6158 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6159 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6160
6161 try
6162 {
6163 gl::Context *context = gl::getNonLostContext();
6164
6165 if (context)
6166 {
6167 if (context->getClientVersion() < 3)
6168 {
6169 return gl::error(GL_INVALID_OPERATION);
6170 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006171
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006172 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006173 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006174 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006175 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006176 {
6177 return;
6178 }
6179
6180 switch(target)
6181 {
6182 case GL_TEXTURE_3D:
6183 {
6184 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006185 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 +00006186 }
6187 break;
6188
6189 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006190 {
6191 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006192 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 +00006193 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006194 break;
6195
6196 default:
6197 return gl::error(GL_INVALID_ENUM);
6198 }
6199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006200 }
6201 catch(std::bad_alloc&)
6202 {
6203 return gl::error(GL_OUT_OF_MEMORY);
6204 }
6205}
6206
6207void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6208{
6209 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6210 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6211 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6212
6213 try
6214 {
6215 gl::Context *context = gl::getNonLostContext();
6216
6217 if (context)
6218 {
6219 if (context->getClientVersion() < 3)
6220 {
6221 return gl::error(GL_INVALID_OPERATION);
6222 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006223
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006224 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006225 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006226 {
6227 return;
6228 }
6229
6230 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6231 gl::Texture *texture = NULL;
6232 switch (target)
6233 {
6234 case GL_TEXTURE_3D:
6235 texture = context->getTexture3D();
6236 break;
6237
6238 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006239 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006240 break;
6241
6242 default:
6243 return gl::error(GL_INVALID_ENUM);
6244 }
6245
6246 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006248 }
6249 catch(std::bad_alloc&)
6250 {
6251 return gl::error(GL_OUT_OF_MEMORY);
6252 }
6253}
6254
6255void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6256{
Geoff Langeef52cc2013-10-16 15:07:39 -04006257 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 +00006258 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6259 "const GLvoid* data = 0x%0.8p)",
6260 target, level, internalformat, width, height, depth, border, imageSize, data);
6261
6262 try
6263 {
6264 gl::Context *context = gl::getNonLostContext();
6265
6266 if (context)
6267 {
6268 if (context->getClientVersion() < 3)
6269 {
6270 return gl::error(GL_INVALID_OPERATION);
6271 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006272
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006273 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 +00006274 {
6275 return gl::error(GL_INVALID_VALUE);
6276 }
6277
6278 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006279 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006280 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006281 {
6282 return;
6283 }
6284
6285 switch(target)
6286 {
6287 case GL_TEXTURE_3D:
6288 {
6289 gl::Texture3D *texture = context->getTexture3D();
6290 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6291 }
6292 break;
6293
6294 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006295 {
6296 gl::Texture2DArray *texture = context->getTexture2DArray();
6297 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6298 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006299 break;
6300
6301 default:
6302 return gl::error(GL_INVALID_ENUM);
6303 }
6304 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006305 }
6306 catch(std::bad_alloc&)
6307 {
6308 return gl::error(GL_OUT_OF_MEMORY);
6309 }
6310}
6311
6312void __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)
6313{
6314 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6315 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6316 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6317 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6318
6319 try
6320 {
6321 gl::Context *context = gl::getNonLostContext();
6322
6323 if (context)
6324 {
6325 if (context->getClientVersion() < 3)
6326 {
6327 return gl::error(GL_INVALID_OPERATION);
6328 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006329
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006330 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 +00006331 {
6332 return gl::error(GL_INVALID_VALUE);
6333 }
6334
6335 if (!data)
6336 {
6337 return gl::error(GL_INVALID_VALUE);
6338 }
6339
6340 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006341 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006342 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006343 {
6344 return;
6345 }
6346
6347 switch(target)
6348 {
6349 case GL_TEXTURE_3D:
6350 {
6351 gl::Texture3D *texture = context->getTexture3D();
6352 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6353 format, imageSize, data);
6354 }
6355 break;
6356
6357 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006358 {
6359 gl::Texture2DArray *texture = context->getTexture2DArray();
6360 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6361 format, imageSize, data);
6362 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006363 break;
6364
6365 default:
6366 return gl::error(GL_INVALID_ENUM);
6367 }
6368 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006369 }
6370 catch(std::bad_alloc&)
6371 {
6372 return gl::error(GL_OUT_OF_MEMORY);
6373 }
6374}
6375
6376void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6377{
6378 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6379
6380 try
6381 {
6382 gl::Context *context = gl::getNonLostContext();
6383
6384 if (context)
6385 {
6386 if (context->getClientVersion() < 3)
6387 {
6388 return gl::error(GL_INVALID_OPERATION);
6389 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006390
Geoff Lang37dde692014-01-31 16:34:54 -05006391 if (n < 0)
6392 {
6393 return gl::error(GL_INVALID_VALUE);
6394 }
6395
6396 for (GLsizei i = 0; i < n; i++)
6397 {
6398 ids[i] = context->createQuery();
6399 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006400 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006401 }
6402 catch(std::bad_alloc&)
6403 {
6404 return gl::error(GL_OUT_OF_MEMORY);
6405 }
6406}
6407
6408void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6409{
6410 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6411
6412 try
6413 {
6414 gl::Context *context = gl::getNonLostContext();
6415
6416 if (context)
6417 {
6418 if (context->getClientVersion() < 3)
6419 {
6420 return gl::error(GL_INVALID_OPERATION);
6421 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006422
Geoff Lang37dde692014-01-31 16:34:54 -05006423 if (n < 0)
6424 {
6425 return gl::error(GL_INVALID_VALUE);
6426 }
6427
6428 for (GLsizei i = 0; i < n; i++)
6429 {
6430 context->deleteQuery(ids[i]);
6431 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006432 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006433 }
6434 catch(std::bad_alloc&)
6435 {
6436 return gl::error(GL_OUT_OF_MEMORY);
6437 }
6438}
6439
6440GLboolean __stdcall glIsQuery(GLuint id)
6441{
6442 EVENT("(GLuint id = %u)", id);
6443
6444 try
6445 {
6446 gl::Context *context = gl::getNonLostContext();
6447
6448 if (context)
6449 {
6450 if (context->getClientVersion() < 3)
6451 {
6452 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006454
Geoff Lang37dde692014-01-31 16:34:54 -05006455 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006456 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006457 }
6458 catch(std::bad_alloc&)
6459 {
6460 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6461 }
6462
6463 return GL_FALSE;
6464}
6465
6466void __stdcall glBeginQuery(GLenum target, GLuint id)
6467{
6468 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6469
6470 try
6471 {
6472 gl::Context *context = gl::getNonLostContext();
6473
6474 if (context)
6475 {
6476 if (context->getClientVersion() < 3)
6477 {
6478 return gl::error(GL_INVALID_OPERATION);
6479 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006480
Geoff Lang37dde692014-01-31 16:34:54 -05006481 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006482 {
Geoff Lang37dde692014-01-31 16:34:54 -05006483 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006484 }
6485
6486 if (id == 0)
6487 {
6488 return gl::error(GL_INVALID_OPERATION);
6489 }
6490
Geoff Lang37dde692014-01-31 16:34:54 -05006491 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006492 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006493 }
6494 catch(std::bad_alloc&)
6495 {
6496 return gl::error(GL_OUT_OF_MEMORY);
6497 }
6498}
6499
6500void __stdcall glEndQuery(GLenum target)
6501{
6502 EVENT("(GLenum target = 0x%X)", target);
6503
6504 try
6505 {
6506 gl::Context *context = gl::getNonLostContext();
6507
6508 if (context)
6509 {
6510 if (context->getClientVersion() < 3)
6511 {
6512 return gl::error(GL_INVALID_OPERATION);
6513 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006514
Geoff Lang37dde692014-01-31 16:34:54 -05006515 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006516 {
Geoff Lang37dde692014-01-31 16:34:54 -05006517 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006518 }
Geoff Lang37dde692014-01-31 16:34:54 -05006519
6520 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006521 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006522 }
6523 catch(std::bad_alloc&)
6524 {
6525 return gl::error(GL_OUT_OF_MEMORY);
6526 }
6527}
6528
6529void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6530{
6531 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6532
6533 try
6534 {
6535 gl::Context *context = gl::getNonLostContext();
6536
6537 if (context)
6538 {
6539 if (context->getClientVersion() < 3)
6540 {
6541 return gl::error(GL_INVALID_OPERATION);
6542 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006543
Geoff Lang37dde692014-01-31 16:34:54 -05006544 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006545 {
Geoff Lang37dde692014-01-31 16:34:54 -05006546 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006547 }
Geoff Lang37dde692014-01-31 16:34:54 -05006548
6549 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006550 {
Geoff Lang37dde692014-01-31 16:34:54 -05006551 case GL_CURRENT_QUERY:
6552 params[0] = context->getActiveQuery(target);
6553 break;
6554
6555 default:
6556 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006557 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006558 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006559 }
6560 catch(std::bad_alloc&)
6561 {
6562 return gl::error(GL_OUT_OF_MEMORY);
6563 }
6564}
6565
6566void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6567{
6568 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6569
6570 try
6571 {
6572 gl::Context *context = gl::getNonLostContext();
6573
6574 if (context)
6575 {
6576 if (context->getClientVersion() < 3)
6577 {
6578 return gl::error(GL_INVALID_OPERATION);
6579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006580
Geoff Lang37dde692014-01-31 16:34:54 -05006581 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6582
6583 if (!queryObject)
6584 {
6585 return gl::error(GL_INVALID_OPERATION);
6586 }
6587
6588 if (context->getActiveQuery(queryObject->getType()) == id)
6589 {
6590 return gl::error(GL_INVALID_OPERATION);
6591 }
6592
6593 switch(pname)
6594 {
6595 case GL_QUERY_RESULT:
6596 params[0] = queryObject->getResult();
6597 break;
6598 case GL_QUERY_RESULT_AVAILABLE:
6599 params[0] = queryObject->isResultAvailable();
6600 break;
6601 default:
6602 return gl::error(GL_INVALID_ENUM);
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
6612GLboolean __stdcall glUnmapBuffer(GLenum target)
6613{
6614 EVENT("(GLenum target = 0x%X)", target);
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, GL_FALSE);
6625 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006626
Jamie Madill7a5f7382014-03-05 15:01:24 -05006627 if (!gl::ValidBufferTarget(context, target))
6628 {
6629 return gl::error(GL_INVALID_ENUM, GL_FALSE);
6630 }
6631
6632 gl::Buffer *buffer = context->getTargetBuffer(target);
6633
6634 if (buffer == NULL || !buffer->mapped())
6635 {
6636 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6637 }
6638
6639 // TODO: detect if we had corruption. if so, throw an error and return false.
6640
6641 buffer->unmap();
6642
6643 return GL_TRUE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006644 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006645 }
6646 catch(std::bad_alloc&)
6647 {
6648 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6649 }
6650
6651 return GL_FALSE;
6652}
6653
6654void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6655{
6656 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6657
6658 try
6659 {
6660 gl::Context *context = gl::getNonLostContext();
6661
6662 if (context)
6663 {
6664 if (context->getClientVersion() < 3)
6665 {
6666 return gl::error(GL_INVALID_OPERATION);
6667 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006668
Jamie Madill70656a62014-03-05 15:01:26 -05006669 if (!gl::ValidBufferTarget(context, target))
6670 {
6671 return gl::error(GL_INVALID_ENUM);
6672 }
6673
6674 if (pname != GL_BUFFER_MAP_POINTER)
6675 {
6676 return gl::error(GL_INVALID_ENUM);
6677 }
6678
6679 gl::Buffer *buffer = context->getTargetBuffer(target);
6680
6681 if (!buffer || !buffer->mapped())
6682 {
6683 *params = NULL;
6684 }
6685
6686 *params = buffer->mapPointer();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006687 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006688 }
6689 catch(std::bad_alloc&)
6690 {
6691 return gl::error(GL_OUT_OF_MEMORY);
6692 }
6693}
6694
6695void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6696{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006697 try
6698 {
6699 gl::Context *context = gl::getNonLostContext();
6700
6701 if (context)
6702 {
6703 if (context->getClientVersion() < 3)
6704 {
6705 return gl::error(GL_INVALID_OPERATION);
6706 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006707
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006708 glDrawBuffersEXT(n, bufs);
6709 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006710 }
6711 catch(std::bad_alloc&)
6712 {
6713 return gl::error(GL_OUT_OF_MEMORY);
6714 }
6715}
6716
6717void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6718{
6719 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6720 location, count, transpose, value);
6721
6722 try
6723 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006724 if (count < 0)
6725 {
6726 return gl::error(GL_INVALID_VALUE);
6727 }
6728
6729 if (location == -1)
6730 {
6731 return;
6732 }
6733
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006734 gl::Context *context = gl::getNonLostContext();
6735
6736 if (context)
6737 {
6738 if (context->getClientVersion() < 3)
6739 {
6740 return gl::error(GL_INVALID_OPERATION);
6741 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006742
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006743 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6744 if (!programBinary)
6745 {
6746 return gl::error(GL_INVALID_OPERATION);
6747 }
6748
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006749 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006750 {
6751 return gl::error(GL_INVALID_OPERATION);
6752 }
6753 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006754 }
6755 catch(std::bad_alloc&)
6756 {
6757 return gl::error(GL_OUT_OF_MEMORY);
6758 }
6759}
6760
6761void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6762{
6763 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6764 location, count, transpose, value);
6765
6766 try
6767 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006768 if (count < 0)
6769 {
6770 return gl::error(GL_INVALID_VALUE);
6771 }
6772
6773 if (location == -1)
6774 {
6775 return;
6776 }
6777
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006778 gl::Context *context = gl::getNonLostContext();
6779
6780 if (context)
6781 {
6782 if (context->getClientVersion() < 3)
6783 {
6784 return gl::error(GL_INVALID_OPERATION);
6785 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006786
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006787 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6788 if (!programBinary)
6789 {
6790 return gl::error(GL_INVALID_OPERATION);
6791 }
6792
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006793 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006794 {
6795 return gl::error(GL_INVALID_OPERATION);
6796 }
6797 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006798 }
6799 catch(std::bad_alloc&)
6800 {
6801 return gl::error(GL_OUT_OF_MEMORY);
6802 }
6803}
6804
6805void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6806{
6807 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6808 location, count, transpose, value);
6809
6810 try
6811 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006812 if (count < 0)
6813 {
6814 return gl::error(GL_INVALID_VALUE);
6815 }
6816
6817 if (location == -1)
6818 {
6819 return;
6820 }
6821
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006822 gl::Context *context = gl::getNonLostContext();
6823
6824 if (context)
6825 {
6826 if (context->getClientVersion() < 3)
6827 {
6828 return gl::error(GL_INVALID_OPERATION);
6829 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006830
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006831 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6832 if (!programBinary)
6833 {
6834 return gl::error(GL_INVALID_OPERATION);
6835 }
6836
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006837 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006838 {
6839 return gl::error(GL_INVALID_OPERATION);
6840 }
6841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006842 }
6843 catch(std::bad_alloc&)
6844 {
6845 return gl::error(GL_OUT_OF_MEMORY);
6846 }
6847}
6848
6849void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6850{
6851 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6852 location, count, transpose, value);
6853
6854 try
6855 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006856 if (count < 0)
6857 {
6858 return gl::error(GL_INVALID_VALUE);
6859 }
6860
6861 if (location == -1)
6862 {
6863 return;
6864 }
6865
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006866 gl::Context *context = gl::getNonLostContext();
6867
6868 if (context)
6869 {
6870 if (context->getClientVersion() < 3)
6871 {
6872 return gl::error(GL_INVALID_OPERATION);
6873 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006874
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006875 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6876 if (!programBinary)
6877 {
6878 return gl::error(GL_INVALID_OPERATION);
6879 }
6880
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006881 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006882 {
6883 return gl::error(GL_INVALID_OPERATION);
6884 }
6885 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006886 }
6887 catch(std::bad_alloc&)
6888 {
6889 return gl::error(GL_OUT_OF_MEMORY);
6890 }
6891}
6892
6893void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6894{
6895 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6896 location, count, transpose, value);
6897
6898 try
6899 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006900 if (count < 0)
6901 {
6902 return gl::error(GL_INVALID_VALUE);
6903 }
6904
6905 if (location == -1)
6906 {
6907 return;
6908 }
6909
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006910 gl::Context *context = gl::getNonLostContext();
6911
6912 if (context)
6913 {
6914 if (context->getClientVersion() < 3)
6915 {
6916 return gl::error(GL_INVALID_OPERATION);
6917 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006918
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006919 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6920 if (!programBinary)
6921 {
6922 return gl::error(GL_INVALID_OPERATION);
6923 }
6924
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006925 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006926 {
6927 return gl::error(GL_INVALID_OPERATION);
6928 }
6929 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006930 }
6931 catch(std::bad_alloc&)
6932 {
6933 return gl::error(GL_OUT_OF_MEMORY);
6934 }
6935}
6936
6937void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6938{
6939 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6940 location, count, transpose, value);
6941
6942 try
6943 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006944 if (count < 0)
6945 {
6946 return gl::error(GL_INVALID_VALUE);
6947 }
6948
6949 if (location == -1)
6950 {
6951 return;
6952 }
6953
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006954 gl::Context *context = gl::getNonLostContext();
6955
6956 if (context)
6957 {
6958 if (context->getClientVersion() < 3)
6959 {
6960 return gl::error(GL_INVALID_OPERATION);
6961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006962
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006963 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6964 if (!programBinary)
6965 {
6966 return gl::error(GL_INVALID_OPERATION);
6967 }
6968
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006969 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006970 {
6971 return gl::error(GL_INVALID_OPERATION);
6972 }
6973 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006974 }
6975 catch(std::bad_alloc&)
6976 {
6977 return gl::error(GL_OUT_OF_MEMORY);
6978 }
6979}
6980
6981void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6982{
6983 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6984 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6985 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6986
6987 try
6988 {
6989 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006990 if (context)
6991 {
6992 if (context->getClientVersion() < 3)
6993 {
6994 return gl::error(GL_INVALID_OPERATION);
6995 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006996
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006997 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006998 dstX0, dstY0, dstX1, dstY1, mask, filter,
6999 false))
7000 {
7001 return;
7002 }
7003
7004 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7005 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007006 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007007 }
7008 catch(std::bad_alloc&)
7009 {
7010 return gl::error(GL_OUT_OF_MEMORY);
7011 }
7012}
7013
7014void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7015{
7016 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7017 target, samples, internalformat, width, height);
7018
7019 try
7020 {
7021 gl::Context *context = gl::getNonLostContext();
7022
7023 if (context)
7024 {
7025 if (context->getClientVersion() < 3)
7026 {
7027 return gl::error(GL_INVALID_OPERATION);
7028 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007029
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007030 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007031 width, height, false))
7032 {
7033 return;
7034 }
7035
7036 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007037 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007038 }
7039 catch(std::bad_alloc&)
7040 {
7041 return gl::error(GL_OUT_OF_MEMORY);
7042 }
7043}
7044
7045void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7046{
7047 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7048 target, attachment, texture, level, layer);
7049
7050 try
7051 {
7052 gl::Context *context = gl::getNonLostContext();
7053
7054 if (context)
7055 {
7056 if (context->getClientVersion() < 3)
7057 {
7058 return gl::error(GL_INVALID_OPERATION);
7059 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007060
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007061 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007062 {
7063 return;
7064 }
7065
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05007066 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
7067 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04007068
7069 gl::Texture *textureObject = context->getTexture(texture);
7070 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7071
7072 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7073 {
7074 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7075 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7076 }
7077 else
7078 {
7079 switch (attachment)
7080 {
7081 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7082 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7083 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7084 }
7085 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007086 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007087 }
7088 catch(std::bad_alloc&)
7089 {
7090 return gl::error(GL_OUT_OF_MEMORY);
7091 }
7092}
7093
7094GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7095{
7096 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7097 target, offset, length, access);
7098
7099 try
7100 {
7101 gl::Context *context = gl::getNonLostContext();
7102
7103 if (context)
7104 {
7105 if (context->getClientVersion() < 3)
7106 {
7107 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7108 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007109
Jamie Madill7a5f7382014-03-05 15:01:24 -05007110 if (!gl::ValidBufferTarget(context, target))
7111 {
7112 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
7113 }
7114
7115 if (offset < 0 || length < 0)
7116 {
7117 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
7118 }
7119
7120 gl::Buffer *buffer = context->getTargetBuffer(target);
7121
7122 if (buffer == NULL)
7123 {
7124 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7125 }
7126
7127 // Check for buffer overflow
7128 size_t offsetSize = static_cast<size_t>(offset);
7129 size_t lengthSize = static_cast<size_t>(length);
7130
7131 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
7132 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
7133 {
7134 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
7135 }
7136
7137 // Check for invalid bits in the mask
7138 GLbitfield allAccessBits = GL_MAP_READ_BIT |
7139 GL_MAP_WRITE_BIT |
7140 GL_MAP_INVALIDATE_RANGE_BIT |
7141 GL_MAP_INVALIDATE_BUFFER_BIT |
7142 GL_MAP_FLUSH_EXPLICIT_BIT |
7143 GL_MAP_UNSYNCHRONIZED_BIT;
7144
7145 if (access & ~(allAccessBits))
7146 {
7147 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
7148 }
7149
7150 if (length == 0 || buffer->mapped())
7151 {
7152 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7153 }
7154
7155 // Check for invalid bit combinations
7156 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
7157 {
7158 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7159 }
7160
7161 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
7162 GL_MAP_INVALIDATE_BUFFER_BIT |
7163 GL_MAP_UNSYNCHRONIZED_BIT;
7164
7165 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
7166 {
7167 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7168 }
7169
7170 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
7171 {
7172 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7173 }
7174
7175 return buffer->mapRange(offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007176 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007177 }
7178 catch(std::bad_alloc&)
7179 {
7180 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7181 }
7182
7183 return NULL;
7184}
7185
7186void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7187{
7188 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7189
7190 try
7191 {
7192 gl::Context *context = gl::getNonLostContext();
7193
7194 if (context)
7195 {
7196 if (context->getClientVersion() < 3)
7197 {
7198 return gl::error(GL_INVALID_OPERATION);
7199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007200
Jamie Madill7a5f7382014-03-05 15:01:24 -05007201 if (offset < 0 || length < 0)
7202 {
7203 return gl::error(GL_INVALID_VALUE);
7204 }
7205
7206 if (!gl::ValidBufferTarget(context, target))
7207 {
7208 return gl::error(GL_INVALID_ENUM);
7209 }
7210
7211 gl::Buffer *buffer = context->getTargetBuffer(target);
7212
7213 if (buffer == NULL)
7214 {
7215 return gl::error(GL_INVALID_OPERATION);
7216 }
7217
7218 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
7219 {
7220 return gl::error(GL_INVALID_OPERATION);
7221 }
7222
7223 // Check for buffer overflow
7224 size_t offsetSize = static_cast<size_t>(offset);
7225 size_t lengthSize = static_cast<size_t>(length);
7226
7227 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
7228 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
7229 {
7230 return gl::error(GL_INVALID_VALUE);
7231 }
7232
7233 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007234 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007235 }
7236 catch(std::bad_alloc&)
7237 {
7238 return gl::error(GL_OUT_OF_MEMORY);
7239 }
7240}
7241
7242void __stdcall glBindVertexArray(GLuint array)
7243{
7244 EVENT("(GLuint array = %u)", array);
7245
7246 try
7247 {
7248 gl::Context *context = gl::getNonLostContext();
7249
7250 if (context)
7251 {
7252 if (context->getClientVersion() < 3)
7253 {
7254 return gl::error(GL_INVALID_OPERATION);
7255 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007256
Jamie Madilld1028542013-07-02 11:57:04 -04007257 gl::VertexArray *vao = context->getVertexArray(array);
7258
7259 if (!vao)
7260 {
7261 // The default VAO should always exist
7262 ASSERT(array != 0);
7263 return gl::error(GL_INVALID_OPERATION);
7264 }
7265
7266 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007267 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007268 }
7269 catch(std::bad_alloc&)
7270 {
7271 return gl::error(GL_OUT_OF_MEMORY);
7272 }
7273}
7274
7275void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7276{
7277 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
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
Jamie Madilld1028542013-07-02 11:57:04 -04007290 if (n < 0)
7291 {
7292 return gl::error(GL_INVALID_VALUE);
7293 }
7294
7295 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7296 {
7297 if (arrays[arrayIndex] != 0)
7298 {
7299 context->deleteVertexArray(arrays[arrayIndex]);
7300 }
7301 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007302 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007303 }
7304 catch(std::bad_alloc&)
7305 {
7306 return gl::error(GL_OUT_OF_MEMORY);
7307 }
7308}
7309
7310void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7311{
7312 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7313
7314 try
7315 {
7316 gl::Context *context = gl::getNonLostContext();
7317
7318 if (context)
7319 {
7320 if (context->getClientVersion() < 3)
7321 {
7322 return gl::error(GL_INVALID_OPERATION);
7323 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007324
Jamie Madilld1028542013-07-02 11:57:04 -04007325 if (n < 0)
7326 {
7327 return gl::error(GL_INVALID_VALUE);
7328 }
7329
7330 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7331 {
7332 arrays[arrayIndex] = context->createVertexArray();
7333 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007334 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007335 }
7336 catch(std::bad_alloc&)
7337 {
7338 return gl::error(GL_OUT_OF_MEMORY);
7339 }
7340}
7341
7342GLboolean __stdcall glIsVertexArray(GLuint array)
7343{
7344 EVENT("(GLuint array = %u)", array);
7345
7346 try
7347 {
7348 gl::Context *context = gl::getNonLostContext();
7349
7350 if (context)
7351 {
7352 if (context->getClientVersion() < 3)
7353 {
7354 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7355 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007356
Jamie Madilld1028542013-07-02 11:57:04 -04007357 if (array == 0)
7358 {
7359 return GL_FALSE;
7360 }
7361
7362 gl::VertexArray *vao = context->getVertexArray(array);
7363
7364 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007365 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007366 }
7367 catch(std::bad_alloc&)
7368 {
7369 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7370 }
7371
7372 return GL_FALSE;
7373}
7374
7375void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7376{
7377 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7378 target, index, data);
7379
7380 try
7381 {
7382 gl::Context *context = gl::getNonLostContext();
7383
7384 if (context)
7385 {
7386 if (context->getClientVersion() < 3)
7387 {
7388 return gl::error(GL_INVALID_OPERATION);
7389 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007390
Shannon Woods15934d52013-08-19 14:28:49 -04007391 switch (target)
7392 {
7393 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7394 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7395 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7396 if (index >= context->getMaxTransformFeedbackBufferBindings())
7397 return gl::error(GL_INVALID_VALUE);
7398 break;
7399 case GL_UNIFORM_BUFFER_START:
7400 case GL_UNIFORM_BUFFER_SIZE:
7401 case GL_UNIFORM_BUFFER_BINDING:
7402 if (index >= context->getMaximumCombinedUniformBufferBindings())
7403 return gl::error(GL_INVALID_VALUE);
7404 break;
7405 default:
7406 return gl::error(GL_INVALID_ENUM);
7407 }
7408
7409 if (!(context->getIndexedIntegerv(target, index, data)))
7410 {
7411 GLenum nativeType;
7412 unsigned int numParams = 0;
7413 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7414 return gl::error(GL_INVALID_ENUM);
7415
7416 if (numParams == 0)
7417 return; // it is known that pname is valid, but there are no parameters to return
7418
7419 if (nativeType == GL_INT_64_ANGLEX)
7420 {
7421 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7422 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7423 GLint64 *int64Params = new GLint64[numParams];
7424
7425 context->getIndexedInteger64v(target, index, int64Params);
7426
7427 for (unsigned int i = 0; i < numParams; ++i)
7428 {
7429 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7430 data[i] = static_cast<GLint>(clampedValue);
7431 }
7432
7433 delete [] int64Params;
7434 }
7435 else
7436 {
7437 UNREACHABLE();
7438 }
7439 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007440 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007441 }
7442 catch(std::bad_alloc&)
7443 {
7444 return gl::error(GL_OUT_OF_MEMORY);
7445 }
7446}
7447
7448void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7449{
7450 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7451
7452 try
7453 {
7454 gl::Context *context = gl::getNonLostContext();
7455
7456 if (context)
7457 {
7458 if (context->getClientVersion() < 3)
7459 {
7460 return gl::error(GL_INVALID_OPERATION);
7461 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007462
Geoff Langc8058452014-02-03 12:04:11 -05007463 switch (primitiveMode)
7464 {
7465 case GL_TRIANGLES:
7466 case GL_LINES:
7467 case GL_POINTS:
7468 break;
7469 default:
7470 return gl::error(GL_INVALID_ENUM);
7471 }
7472
7473 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7474 ASSERT(transformFeedback != NULL);
7475
7476 if (transformFeedback->isStarted())
7477 {
7478 return gl::error(GL_INVALID_OPERATION);
7479 }
7480
7481 if (transformFeedback->isPaused())
7482 {
7483 transformFeedback->resume();
7484 }
7485 else
7486 {
7487 transformFeedback->start(primitiveMode);
7488 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007489 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007490 }
7491 catch(std::bad_alloc&)
7492 {
7493 return gl::error(GL_OUT_OF_MEMORY);
7494 }
7495}
7496
7497void __stdcall glEndTransformFeedback(void)
7498{
7499 EVENT("(void)");
7500
7501 try
7502 {
7503 gl::Context *context = gl::getNonLostContext();
7504
7505 if (context)
7506 {
7507 if (context->getClientVersion() < 3)
7508 {
7509 return gl::error(GL_INVALID_OPERATION);
7510 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007511
Geoff Langc8058452014-02-03 12:04:11 -05007512 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7513 ASSERT(transformFeedback != NULL);
7514
7515 if (!transformFeedback->isStarted())
7516 {
7517 return gl::error(GL_INVALID_OPERATION);
7518 }
7519
7520 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007521 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007522 }
7523 catch(std::bad_alloc&)
7524 {
7525 return gl::error(GL_OUT_OF_MEMORY);
7526 }
7527}
7528
7529void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7530{
7531 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7532 target, index, buffer, offset, size);
7533
7534 try
7535 {
7536 gl::Context *context = gl::getNonLostContext();
7537
7538 if (context)
7539 {
7540 if (context->getClientVersion() < 3)
7541 {
7542 return gl::error(GL_INVALID_OPERATION);
7543 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007544
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007545 switch (target)
7546 {
7547 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007548 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007549 {
7550 return gl::error(GL_INVALID_VALUE);
7551 }
7552 break;
7553
7554 case GL_UNIFORM_BUFFER:
7555 if (index >= context->getMaximumCombinedUniformBufferBindings())
7556 {
7557 return gl::error(GL_INVALID_VALUE);
7558 }
7559 break;
7560
7561 default:
7562 return gl::error(GL_INVALID_ENUM);
7563 }
7564
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007565 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007566 {
7567 return gl::error(GL_INVALID_VALUE);
7568 }
7569
7570 switch (target)
7571 {
7572 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007573
7574 // size and offset must be a multiple of 4
7575 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7576 {
7577 return gl::error(GL_INVALID_VALUE);
7578 }
7579
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007580 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7581 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007582 break;
7583
7584 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007585
7586 // it is an error to bind an offset not a multiple of the alignment
7587 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7588 {
7589 return gl::error(GL_INVALID_VALUE);
7590 }
7591
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007592 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7593 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007594 break;
7595
7596 default:
7597 UNREACHABLE();
7598 }
7599 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007600 }
7601 catch(std::bad_alloc&)
7602 {
7603 return gl::error(GL_OUT_OF_MEMORY);
7604 }
7605}
7606
7607void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7608{
7609 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7610 target, index, buffer);
7611
7612 try
7613 {
7614 gl::Context *context = gl::getNonLostContext();
7615
7616 if (context)
7617 {
7618 if (context->getClientVersion() < 3)
7619 {
7620 return gl::error(GL_INVALID_OPERATION);
7621 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007622
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007623 switch (target)
7624 {
7625 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007626 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007627 {
7628 return gl::error(GL_INVALID_VALUE);
7629 }
7630 break;
7631
7632 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007633 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007634 {
7635 return gl::error(GL_INVALID_VALUE);
7636 }
7637 break;
7638
7639 default:
7640 return gl::error(GL_INVALID_ENUM);
7641 }
7642
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007643 switch (target)
7644 {
7645 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007646 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007647 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007648 break;
7649
7650 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007651 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007652 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007653 break;
7654
7655 default:
7656 UNREACHABLE();
7657 }
7658 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007659 }
7660 catch(std::bad_alloc&)
7661 {
7662 return gl::error(GL_OUT_OF_MEMORY);
7663 }
7664}
7665
7666void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7667{
7668 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7669 program, count, varyings, bufferMode);
7670
7671 try
7672 {
7673 gl::Context *context = gl::getNonLostContext();
7674
7675 if (context)
7676 {
7677 if (context->getClientVersion() < 3)
7678 {
7679 return gl::error(GL_INVALID_OPERATION);
7680 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007681
Geoff Lang48dcae72014-02-05 16:28:24 -05007682 if (count < 0)
7683 {
7684 return gl::error(GL_INVALID_VALUE);
7685 }
7686
7687 switch (bufferMode)
7688 {
7689 case GL_INTERLEAVED_ATTRIBS:
7690 break;
7691 case GL_SEPARATE_ATTRIBS:
7692 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7693 {
7694 return gl::error(GL_INVALID_VALUE);
7695 }
7696 break;
7697 default:
7698 return gl::error(GL_INVALID_ENUM);
7699 }
7700
7701 if (!gl::ValidProgram(context, program))
7702 {
7703 return;
7704 }
7705
7706 gl::Program *programObject = context->getProgram(program);
7707 ASSERT(programObject);
7708
7709 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007710 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007711 }
7712 catch(std::bad_alloc&)
7713 {
7714 return gl::error(GL_OUT_OF_MEMORY);
7715 }
7716}
7717
7718void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7719{
7720 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7721 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7722 program, index, bufSize, length, size, type, name);
7723
7724 try
7725 {
7726 gl::Context *context = gl::getNonLostContext();
7727
7728 if (context)
7729 {
7730 if (context->getClientVersion() < 3)
7731 {
7732 return gl::error(GL_INVALID_OPERATION);
7733 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007734
Geoff Lang48dcae72014-02-05 16:28:24 -05007735 if (bufSize < 0)
7736 {
7737 return gl::error(GL_INVALID_VALUE);
7738 }
7739
7740 if (!gl::ValidProgram(context, program))
7741 {
7742 return;
7743 }
7744
7745 gl::Program *programObject = context->getProgram(program);
7746 ASSERT(programObject);
7747
7748 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7749 {
7750 return gl::error(GL_INVALID_VALUE);
7751 }
7752
7753 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007754 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007755 }
7756 catch(std::bad_alloc&)
7757 {
7758 return gl::error(GL_OUT_OF_MEMORY);
7759 }
7760}
7761
7762void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7763{
7764 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7765 index, size, type, stride, pointer);
7766
7767 try
7768 {
7769 gl::Context *context = gl::getNonLostContext();
7770
7771 if (context)
7772 {
7773 if (context->getClientVersion() < 3)
7774 {
7775 return gl::error(GL_INVALID_OPERATION);
7776 }
7777 }
7778
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007779 if (index >= gl::MAX_VERTEX_ATTRIBS)
7780 {
7781 return gl::error(GL_INVALID_VALUE);
7782 }
7783
7784 if (size < 1 || size > 4)
7785 {
7786 return gl::error(GL_INVALID_VALUE);
7787 }
7788
7789 switch (type)
7790 {
7791 case GL_BYTE:
7792 case GL_UNSIGNED_BYTE:
7793 case GL_SHORT:
7794 case GL_UNSIGNED_SHORT:
7795 case GL_INT:
7796 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007797 case GL_INT_2_10_10_10_REV:
7798 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007799 break;
7800 default:
7801 return gl::error(GL_INVALID_ENUM);
7802 }
7803
7804 if (stride < 0)
7805 {
7806 return gl::error(GL_INVALID_VALUE);
7807 }
7808
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007809 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7810 {
7811 return gl::error(GL_INVALID_OPERATION);
7812 }
7813
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007814 if (context)
7815 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007816 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7817 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7818 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7819 // and the pointer argument is not NULL.
7820 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7821 {
7822 return gl::error(GL_INVALID_OPERATION);
7823 }
7824
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007825 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7826 stride, pointer);
7827 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007828 }
7829 catch(std::bad_alloc&)
7830 {
7831 return gl::error(GL_OUT_OF_MEMORY);
7832 }
7833}
7834
7835void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7836{
7837 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7838 index, pname, params);
7839
7840 try
7841 {
7842 gl::Context *context = gl::getNonLostContext();
7843
7844 if (context)
7845 {
7846 if (context->getClientVersion() < 3)
7847 {
7848 return gl::error(GL_INVALID_OPERATION);
7849 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007850
Jamie Madilla7d05862013-07-02 11:57:06 -04007851 if (index >= gl::MAX_VERTEX_ATTRIBS)
7852 {
7853 return gl::error(GL_INVALID_VALUE);
7854 }
7855
7856 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7857
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007858 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007859 {
7860 return;
7861 }
7862
7863 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7864 {
7865 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7866 for (int i = 0; i < 4; ++i)
7867 {
7868 params[i] = currentValueData.IntValues[i];
7869 }
7870 }
7871 else
7872 {
7873 *params = attribState.querySingleParameter<GLint>(pname);
7874 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007875 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007876 }
7877 catch(std::bad_alloc&)
7878 {
7879 return gl::error(GL_OUT_OF_MEMORY);
7880 }
7881}
7882
7883void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7884{
7885 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7886 index, pname, params);
7887
7888 try
7889 {
7890 gl::Context *context = gl::getNonLostContext();
7891
7892 if (context)
7893 {
7894 if (context->getClientVersion() < 3)
7895 {
7896 return gl::error(GL_INVALID_OPERATION);
7897 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007898
Jamie Madilla7d05862013-07-02 11:57:06 -04007899 if (index >= gl::MAX_VERTEX_ATTRIBS)
7900 {
7901 return gl::error(GL_INVALID_VALUE);
7902 }
7903
7904 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7905
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007906 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007907 {
7908 return;
7909 }
7910
7911 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7912 {
7913 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7914 for (int i = 0; i < 4; ++i)
7915 {
7916 params[i] = currentValueData.UnsignedIntValues[i];
7917 }
7918 }
7919 else
7920 {
7921 *params = attribState.querySingleParameter<GLuint>(pname);
7922 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007924 }
7925 catch(std::bad_alloc&)
7926 {
7927 return gl::error(GL_OUT_OF_MEMORY);
7928 }
7929}
7930
7931void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7932{
7933 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7934 index, x, y, z, w);
7935
7936 try
7937 {
7938 gl::Context *context = gl::getNonLostContext();
7939
7940 if (context)
7941 {
7942 if (context->getClientVersion() < 3)
7943 {
7944 return gl::error(GL_INVALID_OPERATION);
7945 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007946
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007947 if (index >= gl::MAX_VERTEX_ATTRIBS)
7948 {
7949 return gl::error(GL_INVALID_VALUE);
7950 }
7951
7952 GLint vals[4] = { x, y, z, w };
7953 context->setVertexAttribi(index, vals);
7954 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007955 }
7956 catch(std::bad_alloc&)
7957 {
7958 return gl::error(GL_OUT_OF_MEMORY);
7959 }
7960}
7961
7962void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7963{
7964 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7965 index, x, y, z, w);
7966
7967 try
7968 {
7969 gl::Context *context = gl::getNonLostContext();
7970
7971 if (context)
7972 {
7973 if (context->getClientVersion() < 3)
7974 {
7975 return gl::error(GL_INVALID_OPERATION);
7976 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007977
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007978 if (index >= gl::MAX_VERTEX_ATTRIBS)
7979 {
7980 return gl::error(GL_INVALID_VALUE);
7981 }
7982
7983 GLuint vals[4] = { x, y, z, w };
7984 context->setVertexAttribu(index, vals);
7985 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007986 }
7987 catch(std::bad_alloc&)
7988 {
7989 return gl::error(GL_OUT_OF_MEMORY);
7990 }
7991}
7992
7993void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7994{
7995 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7996
7997 try
7998 {
7999 gl::Context *context = gl::getNonLostContext();
8000
8001 if (context)
8002 {
8003 if (context->getClientVersion() < 3)
8004 {
8005 return gl::error(GL_INVALID_OPERATION);
8006 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008007
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008008 if (index >= gl::MAX_VERTEX_ATTRIBS)
8009 {
8010 return gl::error(GL_INVALID_VALUE);
8011 }
8012
8013 context->setVertexAttribi(index, v);
8014 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008015 }
8016 catch(std::bad_alloc&)
8017 {
8018 return gl::error(GL_OUT_OF_MEMORY);
8019 }
8020}
8021
8022void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8023{
8024 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8025
8026 try
8027 {
8028 gl::Context *context = gl::getNonLostContext();
8029
8030 if (context)
8031 {
8032 if (context->getClientVersion() < 3)
8033 {
8034 return gl::error(GL_INVALID_OPERATION);
8035 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008036
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008037 if (index >= gl::MAX_VERTEX_ATTRIBS)
8038 {
8039 return gl::error(GL_INVALID_VALUE);
8040 }
8041
8042 context->setVertexAttribu(index, v);
8043 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008044 }
8045 catch(std::bad_alloc&)
8046 {
8047 return gl::error(GL_OUT_OF_MEMORY);
8048 }
8049}
8050
8051void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8052{
8053 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8054 program, location, params);
8055
8056 try
8057 {
8058 gl::Context *context = gl::getNonLostContext();
8059
8060 if (context)
8061 {
8062 if (context->getClientVersion() < 3)
8063 {
8064 return gl::error(GL_INVALID_OPERATION);
8065 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008066
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008067 if (program == 0)
8068 {
8069 return gl::error(GL_INVALID_VALUE);
8070 }
8071
8072 gl::Program *programObject = context->getProgram(program);
8073
8074 if (!programObject || !programObject->isLinked())
8075 {
8076 return gl::error(GL_INVALID_OPERATION);
8077 }
8078
8079 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8080 if (!programBinary)
8081 {
8082 return gl::error(GL_INVALID_OPERATION);
8083 }
8084
8085 if (!programBinary->getUniformuiv(location, NULL, params))
8086 {
8087 return gl::error(GL_INVALID_OPERATION);
8088 }
8089 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008090 }
8091 catch(std::bad_alloc&)
8092 {
8093 return gl::error(GL_OUT_OF_MEMORY);
8094 }
8095}
8096
8097GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8098{
8099 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8100 program, name);
8101
8102 try
8103 {
8104 gl::Context *context = gl::getNonLostContext();
8105
8106 if (context)
8107 {
8108 if (context->getClientVersion() < 3)
8109 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008110 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008111 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008112
Jamie Madilld1e78c92013-06-20 11:55:50 -04008113 if (program == 0)
8114 {
8115 return gl::error(GL_INVALID_VALUE, -1);
8116 }
8117
8118 gl::Program *programObject = context->getProgram(program);
8119
8120 if (!programObject || !programObject->isLinked())
8121 {
8122 return gl::error(GL_INVALID_OPERATION, -1);
8123 }
8124
8125 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8126 if (!programBinary)
8127 {
8128 return gl::error(GL_INVALID_OPERATION, -1);
8129 }
8130
8131 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008132 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008133 }
8134 catch(std::bad_alloc&)
8135 {
8136 return gl::error(GL_OUT_OF_MEMORY, 0);
8137 }
8138
8139 return 0;
8140}
8141
8142void __stdcall glUniform1ui(GLint location, GLuint v0)
8143{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008144 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008145}
8146
8147void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8148{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008149 const GLuint xy[] = { v0, v1 };
8150 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008151}
8152
8153void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8154{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008155 const GLuint xyz[] = { v0, v1, v2 };
8156 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008157}
8158
8159void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8160{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008161 const GLuint xyzw[] = { v0, v1, v2, v3 };
8162 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008163}
8164
8165void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8166{
8167 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8168 location, count, value);
8169
8170 try
8171 {
8172 gl::Context *context = gl::getNonLostContext();
8173
8174 if (context)
8175 {
8176 if (context->getClientVersion() < 3)
8177 {
8178 return gl::error(GL_INVALID_OPERATION);
8179 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008180
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008181 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8182 if (!programBinary)
8183 {
8184 return gl::error(GL_INVALID_OPERATION);
8185 }
8186
8187 if (!programBinary->setUniform1uiv(location, count, value))
8188 {
8189 return gl::error(GL_INVALID_OPERATION);
8190 }
8191 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008192 }
8193 catch(std::bad_alloc&)
8194 {
8195 return gl::error(GL_OUT_OF_MEMORY);
8196 }
8197}
8198
8199void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8200{
8201 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8202 location, count, value);
8203
8204 try
8205 {
8206 gl::Context *context = gl::getNonLostContext();
8207
8208 if (context)
8209 {
8210 if (context->getClientVersion() < 3)
8211 {
8212 return gl::error(GL_INVALID_OPERATION);
8213 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008214
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008215 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8216 if (!programBinary)
8217 {
8218 return gl::error(GL_INVALID_OPERATION);
8219 }
8220
8221 if (!programBinary->setUniform2uiv(location, count, value))
8222 {
8223 return gl::error(GL_INVALID_OPERATION);
8224 }
8225 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008226 }
8227 catch(std::bad_alloc&)
8228 {
8229 return gl::error(GL_OUT_OF_MEMORY);
8230 }
8231}
8232
8233void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8234{
8235 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8236 location, count, value);
8237
8238 try
8239 {
8240 gl::Context *context = gl::getNonLostContext();
8241
8242 if (context)
8243 {
8244 if (context->getClientVersion() < 3)
8245 {
8246 return gl::error(GL_INVALID_OPERATION);
8247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008248
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008249 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8250 if (!programBinary)
8251 {
8252 return gl::error(GL_INVALID_OPERATION);
8253 }
8254
8255 if (!programBinary->setUniform3uiv(location, count, value))
8256 {
8257 return gl::error(GL_INVALID_OPERATION);
8258 }
8259 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008260 }
8261 catch(std::bad_alloc&)
8262 {
8263 return gl::error(GL_OUT_OF_MEMORY);
8264 }
8265}
8266
8267void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8268{
8269 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8270 location, count, value);
8271
8272 try
8273 {
8274 gl::Context *context = gl::getNonLostContext();
8275
8276 if (context)
8277 {
8278 if (context->getClientVersion() < 3)
8279 {
8280 return gl::error(GL_INVALID_OPERATION);
8281 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008282
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008283 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8284 if (!programBinary)
8285 {
8286 return gl::error(GL_INVALID_OPERATION);
8287 }
8288
8289 if (!programBinary->setUniform4uiv(location, count, value))
8290 {
8291 return gl::error(GL_INVALID_OPERATION);
8292 }
8293 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008294 }
8295 catch(std::bad_alloc&)
8296 {
8297 return gl::error(GL_OUT_OF_MEMORY);
8298 }
8299}
8300
8301void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8302{
8303 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8304 buffer, drawbuffer, value);
8305
8306 try
8307 {
8308 gl::Context *context = gl::getNonLostContext();
8309
8310 if (context)
8311 {
8312 if (context->getClientVersion() < 3)
8313 {
8314 return gl::error(GL_INVALID_OPERATION);
8315 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008316
Geoff Lang42359ca2013-08-21 13:25:17 -04008317 switch (buffer)
8318 {
8319 case GL_COLOR:
8320 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8321 {
8322 return gl::error(GL_INVALID_VALUE);
8323 }
8324 break;
8325 case GL_STENCIL:
8326 if (drawbuffer != 0)
8327 {
8328 return gl::error(GL_INVALID_VALUE);
8329 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05008330 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04008331 default:
8332 return gl::error(GL_INVALID_ENUM);
8333 }
8334
8335 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008336 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008337 }
8338 catch(std::bad_alloc&)
8339 {
8340 return gl::error(GL_OUT_OF_MEMORY);
8341 }
8342}
8343
8344void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8345{
8346 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8347 buffer, drawbuffer, value);
8348
8349 try
8350 {
8351 gl::Context *context = gl::getNonLostContext();
8352
8353 if (context)
8354 {
8355 if (context->getClientVersion() < 3)
8356 {
8357 return gl::error(GL_INVALID_OPERATION);
8358 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008359
Geoff Lang42359ca2013-08-21 13:25:17 -04008360 switch (buffer)
8361 {
8362 case GL_COLOR:
8363 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8364 {
8365 return gl::error(GL_INVALID_VALUE);
8366 }
8367 break;
8368 default:
8369 return gl::error(GL_INVALID_ENUM);
8370 }
8371
8372 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008373 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008374 }
8375 catch(std::bad_alloc&)
8376 {
8377 return gl::error(GL_OUT_OF_MEMORY);
8378 }
8379}
8380
8381void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8382{
8383 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8384 buffer, drawbuffer, value);
8385
8386 try
8387 {
8388 gl::Context *context = gl::getNonLostContext();
8389
8390 if (context)
8391 {
8392 if (context->getClientVersion() < 3)
8393 {
8394 return gl::error(GL_INVALID_OPERATION);
8395 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008396
Geoff Lang42359ca2013-08-21 13:25:17 -04008397 switch (buffer)
8398 {
8399 case GL_COLOR:
8400 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8401 {
8402 return gl::error(GL_INVALID_VALUE);
8403 }
8404 break;
8405 case GL_DEPTH:
8406 if (drawbuffer != 0)
8407 {
8408 return gl::error(GL_INVALID_VALUE);
8409 }
8410 break;
8411 default:
8412 return gl::error(GL_INVALID_ENUM);
8413 }
8414
8415 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008416 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008417 }
8418 catch(std::bad_alloc&)
8419 {
8420 return gl::error(GL_OUT_OF_MEMORY);
8421 }
8422}
8423
8424void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8425{
8426 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8427 buffer, drawbuffer, depth, stencil);
8428
8429 try
8430 {
8431 gl::Context *context = gl::getNonLostContext();
8432
8433 if (context)
8434 {
8435 if (context->getClientVersion() < 3)
8436 {
8437 return gl::error(GL_INVALID_OPERATION);
8438 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008439
Geoff Lang42359ca2013-08-21 13:25:17 -04008440 switch (buffer)
8441 {
8442 case GL_DEPTH_STENCIL:
8443 if (drawbuffer != 0)
8444 {
8445 return gl::error(GL_INVALID_VALUE);
8446 }
8447 break;
8448 default:
8449 return gl::error(GL_INVALID_ENUM);
8450 }
8451
8452 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008454 }
8455 catch(std::bad_alloc&)
8456 {
8457 return gl::error(GL_OUT_OF_MEMORY);
8458 }
8459}
8460
8461const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8462{
8463 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8464
8465 try
8466 {
8467 gl::Context *context = gl::getNonLostContext();
8468
8469 if (context)
8470 {
8471 if (context->getClientVersion() < 3)
8472 {
8473 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8474 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008475
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008476 if (name != GL_EXTENSIONS)
8477 {
8478 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8479 }
8480
8481 if (index >= context->getNumExtensions())
8482 {
8483 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8484 }
8485
8486 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8487 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008488 }
8489 catch(std::bad_alloc&)
8490 {
8491 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8492 }
8493
8494 return NULL;
8495}
8496
8497void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8498{
8499 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8500 readTarget, writeTarget, readOffset, writeOffset, size);
8501
8502 try
8503 {
8504 gl::Context *context = gl::getNonLostContext();
8505
8506 if (context)
8507 {
8508 if (context->getClientVersion() < 3)
8509 {
8510 return gl::error(GL_INVALID_OPERATION);
8511 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008512
Jamie Madill8c96d582014-03-05 15:01:23 -05008513 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008514 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008515 return gl::error(GL_INVALID_ENUM);
8516 }
8517
Jamie Madill8c96d582014-03-05 15:01:23 -05008518 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8519 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008520
8521 if (!readBuffer || !writeBuffer)
8522 {
8523 return gl::error(GL_INVALID_OPERATION);
8524 }
8525
Jamie Madill7a5f7382014-03-05 15:01:24 -05008526 if (readBuffer->mapped() || writeBuffer->mapped())
8527 {
8528 return gl::error(GL_INVALID_OPERATION);
8529 }
8530
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008531 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8532 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8533 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8534 {
8535 return gl::error(GL_INVALID_VALUE);
8536 }
8537
8538 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8539 {
8540 return gl::error(GL_INVALID_VALUE);
8541 }
8542
8543 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8544
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008545 // if size is zero, the copy is a successful no-op
8546 if (size > 0)
8547 {
8548 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8549 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008550 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008551 }
8552 catch(std::bad_alloc&)
8553 {
8554 return gl::error(GL_OUT_OF_MEMORY);
8555 }
8556}
8557
8558void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8559{
8560 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8561 program, uniformCount, uniformNames, uniformIndices);
8562
8563 try
8564 {
8565 gl::Context *context = gl::getNonLostContext();
8566
8567 if (context)
8568 {
8569 if (context->getClientVersion() < 3)
8570 {
8571 return gl::error(GL_INVALID_OPERATION);
8572 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008573
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008574 if (uniformCount < 0)
8575 {
8576 return gl::error(GL_INVALID_VALUE);
8577 }
8578
8579 gl::Program *programObject = context->getProgram(program);
8580
8581 if (!programObject)
8582 {
8583 if (context->getShader(program))
8584 {
8585 return gl::error(GL_INVALID_OPERATION);
8586 }
8587 else
8588 {
8589 return gl::error(GL_INVALID_VALUE);
8590 }
8591 }
8592
8593 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8594 if (!programObject->isLinked() || !programBinary)
8595 {
8596 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8597 {
8598 uniformIndices[uniformId] = GL_INVALID_INDEX;
8599 }
8600 }
8601 else
8602 {
8603 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8604 {
8605 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8606 }
8607 }
8608 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008609 }
8610 catch(std::bad_alloc&)
8611 {
8612 return gl::error(GL_OUT_OF_MEMORY);
8613 }
8614}
8615
8616void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8617{
8618 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8619 program, uniformCount, uniformIndices, 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 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008631
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008632 if (uniformCount < 0)
8633 {
8634 return gl::error(GL_INVALID_VALUE);
8635 }
8636
8637 gl::Program *programObject = context->getProgram(program);
8638
8639 if (!programObject)
8640 {
8641 if (context->getShader(program))
8642 {
8643 return gl::error(GL_INVALID_OPERATION);
8644 }
8645 else
8646 {
8647 return gl::error(GL_INVALID_VALUE);
8648 }
8649 }
8650
8651 switch (pname)
8652 {
8653 case GL_UNIFORM_TYPE:
8654 case GL_UNIFORM_SIZE:
8655 case GL_UNIFORM_NAME_LENGTH:
8656 case GL_UNIFORM_BLOCK_INDEX:
8657 case GL_UNIFORM_OFFSET:
8658 case GL_UNIFORM_ARRAY_STRIDE:
8659 case GL_UNIFORM_MATRIX_STRIDE:
8660 case GL_UNIFORM_IS_ROW_MAJOR:
8661 break;
8662 default:
8663 return gl::error(GL_INVALID_ENUM);
8664 }
8665
8666 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8667
8668 if (!programBinary && uniformCount > 0)
8669 {
8670 return gl::error(GL_INVALID_VALUE);
8671 }
8672
8673 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8674 {
8675 const GLuint index = uniformIndices[uniformId];
8676
8677 if (index >= (GLuint)programBinary->getActiveUniformCount())
8678 {
8679 return gl::error(GL_INVALID_VALUE);
8680 }
8681 }
8682
8683 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8684 {
8685 const GLuint index = uniformIndices[uniformId];
8686 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8687 }
8688 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008689 }
8690 catch(std::bad_alloc&)
8691 {
8692 return gl::error(GL_OUT_OF_MEMORY);
8693 }
8694}
8695
8696GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8697{
8698 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8699
8700 try
8701 {
8702 gl::Context *context = gl::getNonLostContext();
8703
8704 if (context)
8705 {
8706 if (context->getClientVersion() < 3)
8707 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008708 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008709 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008710
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008711 gl::Program *programObject = context->getProgram(program);
8712
8713 if (!programObject)
8714 {
8715 if (context->getShader(program))
8716 {
8717 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8718 }
8719 else
8720 {
8721 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8722 }
8723 }
8724
8725 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8726 if (!programBinary)
8727 {
8728 return GL_INVALID_INDEX;
8729 }
8730
8731 return programBinary->getUniformBlockIndex(uniformBlockName);
8732 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008733 }
8734 catch(std::bad_alloc&)
8735 {
8736 return gl::error(GL_OUT_OF_MEMORY, 0);
8737 }
8738
8739 return 0;
8740}
8741
8742void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8743{
8744 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8745 program, uniformBlockIndex, pname, params);
8746
8747 try
8748 {
8749 gl::Context *context = gl::getNonLostContext();
8750
8751 if (context)
8752 {
8753 if (context->getClientVersion() < 3)
8754 {
8755 return gl::error(GL_INVALID_OPERATION);
8756 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008757 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008758
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008759 if (!programObject)
8760 {
8761 if (context->getShader(program))
8762 {
8763 return gl::error(GL_INVALID_OPERATION);
8764 }
8765 else
8766 {
8767 return gl::error(GL_INVALID_VALUE);
8768 }
8769 }
8770
8771 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8772
8773 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8774 {
8775 return gl::error(GL_INVALID_VALUE);
8776 }
8777
8778 switch (pname)
8779 {
8780 case GL_UNIFORM_BLOCK_BINDING:
8781 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8782 break;
8783
8784 case GL_UNIFORM_BLOCK_DATA_SIZE:
8785 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8786 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8787 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8788 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8789 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8790 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8791 break;
8792
8793 default:
8794 return gl::error(GL_INVALID_ENUM);
8795 }
8796 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008797 }
8798 catch(std::bad_alloc&)
8799 {
8800 return gl::error(GL_OUT_OF_MEMORY);
8801 }
8802}
8803
8804void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8805{
8806 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8807 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8808
8809 try
8810 {
8811 gl::Context *context = gl::getNonLostContext();
8812
8813 if (context)
8814 {
8815 if (context->getClientVersion() < 3)
8816 {
8817 return gl::error(GL_INVALID_OPERATION);
8818 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008819
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008820 gl::Program *programObject = context->getProgram(program);
8821
8822 if (!programObject)
8823 {
8824 if (context->getShader(program))
8825 {
8826 return gl::error(GL_INVALID_OPERATION);
8827 }
8828 else
8829 {
8830 return gl::error(GL_INVALID_VALUE);
8831 }
8832 }
8833
8834 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8835
8836 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8837 {
8838 return gl::error(GL_INVALID_VALUE);
8839 }
8840
8841 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8842 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008843 }
8844 catch(std::bad_alloc&)
8845 {
8846 return gl::error(GL_OUT_OF_MEMORY);
8847 }
8848}
8849
8850void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8851{
8852 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8853 program, uniformBlockIndex, uniformBlockBinding);
8854
8855 try
8856 {
8857 gl::Context *context = gl::getNonLostContext();
8858
8859 if (context)
8860 {
8861 if (context->getClientVersion() < 3)
8862 {
8863 return gl::error(GL_INVALID_OPERATION);
8864 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008865
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008866 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8867 {
8868 return gl::error(GL_INVALID_VALUE);
8869 }
8870
8871 gl::Program *programObject = context->getProgram(program);
8872
8873 if (!programObject)
8874 {
8875 if (context->getShader(program))
8876 {
8877 return gl::error(GL_INVALID_OPERATION);
8878 }
8879 else
8880 {
8881 return gl::error(GL_INVALID_VALUE);
8882 }
8883 }
8884
8885 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8886
8887 // if never linked, there won't be any uniform blocks
8888 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8889 {
8890 return gl::error(GL_INVALID_VALUE);
8891 }
8892
8893 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8894 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008895 }
8896 catch(std::bad_alloc&)
8897 {
8898 return gl::error(GL_OUT_OF_MEMORY);
8899 }
8900}
8901
8902void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8903{
8904 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8905 mode, first, count, instanceCount);
8906
8907 try
8908 {
8909 gl::Context *context = gl::getNonLostContext();
8910
8911 if (context)
8912 {
8913 if (context->getClientVersion() < 3)
8914 {
8915 return gl::error(GL_INVALID_OPERATION);
8916 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008917
Jamie Madill54133512013-06-21 09:33:07 -04008918 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008919 UNIMPLEMENTED();
8920 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008921 }
8922 catch(std::bad_alloc&)
8923 {
8924 return gl::error(GL_OUT_OF_MEMORY);
8925 }
8926}
8927
8928void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8929{
8930 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8931 mode, count, type, indices, instanceCount);
8932
8933 try
8934 {
8935 gl::Context *context = gl::getNonLostContext();
8936
8937 if (context)
8938 {
8939 if (context->getClientVersion() < 3)
8940 {
8941 return gl::error(GL_INVALID_OPERATION);
8942 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008943
Jamie Madill54133512013-06-21 09:33:07 -04008944 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008945 UNIMPLEMENTED();
8946 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008947 }
8948 catch(std::bad_alloc&)
8949 {
8950 return gl::error(GL_OUT_OF_MEMORY);
8951 }
8952}
8953
8954GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8955{
8956 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8957
8958 try
8959 {
8960 gl::Context *context = gl::getNonLostContext();
8961
8962 if (context)
8963 {
8964 if (context->getClientVersion() < 3)
8965 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008966 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008967 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008968
Jamie Madill5215e1a2013-07-26 11:55:19 -04008969 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8970 {
8971 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8972 }
8973
8974 if (flags != 0)
8975 {
8976 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8977 }
8978
8979 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008980 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008981 }
8982 catch(std::bad_alloc&)
8983 {
8984 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8985 }
8986
8987 return NULL;
8988}
8989
8990GLboolean __stdcall glIsSync(GLsync sync)
8991{
8992 EVENT("(GLsync sync = 0x%0.8p)", sync);
8993
8994 try
8995 {
8996 gl::Context *context = gl::getNonLostContext();
8997
8998 if (context)
8999 {
9000 if (context->getClientVersion() < 3)
9001 {
9002 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9003 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009004
Jamie Madill5215e1a2013-07-26 11:55:19 -04009005 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009006 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009007 }
9008 catch(std::bad_alloc&)
9009 {
9010 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9011 }
9012
9013 return GL_FALSE;
9014}
9015
9016void __stdcall glDeleteSync(GLsync sync)
9017{
9018 EVENT("(GLsync sync = 0x%0.8p)", sync);
9019
9020 try
9021 {
9022 gl::Context *context = gl::getNonLostContext();
9023
9024 if (context)
9025 {
9026 if (context->getClientVersion() < 3)
9027 {
9028 return gl::error(GL_INVALID_OPERATION);
9029 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009030
Jamie Madill5215e1a2013-07-26 11:55:19 -04009031 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
9032 {
9033 return gl::error(GL_INVALID_VALUE);
9034 }
9035
9036 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009037 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009038 }
9039 catch(std::bad_alloc&)
9040 {
9041 return gl::error(GL_OUT_OF_MEMORY);
9042 }
9043}
9044
9045GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9046{
9047 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9048 sync, flags, timeout);
9049
9050 try
9051 {
9052 gl::Context *context = gl::getNonLostContext();
9053
9054 if (context)
9055 {
9056 if (context->getClientVersion() < 3)
9057 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009058 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009059 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009060
Jamie Madill5215e1a2013-07-26 11:55:19 -04009061 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
9062 {
9063 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9064 }
9065
9066 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9067
9068 if (!fenceSync)
9069 {
9070 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9071 }
9072
9073 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009074 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009075 }
9076 catch(std::bad_alloc&)
9077 {
9078 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9079 }
9080
9081 return GL_FALSE;
9082}
9083
9084void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9085{
9086 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9087 sync, flags, timeout);
9088
9089 try
9090 {
9091 gl::Context *context = gl::getNonLostContext();
9092
9093 if (context)
9094 {
9095 if (context->getClientVersion() < 3)
9096 {
9097 return gl::error(GL_INVALID_OPERATION);
9098 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009099
Jamie Madill5215e1a2013-07-26 11:55:19 -04009100 if (flags != 0)
9101 {
9102 return gl::error(GL_INVALID_VALUE);
9103 }
9104
9105 if (timeout != GL_TIMEOUT_IGNORED)
9106 {
9107 return gl::error(GL_INVALID_VALUE);
9108 }
9109
9110 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9111
9112 if (!fenceSync)
9113 {
9114 return gl::error(GL_INVALID_VALUE);
9115 }
9116
9117 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009118 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009119 }
9120 catch(std::bad_alloc&)
9121 {
9122 return gl::error(GL_OUT_OF_MEMORY);
9123 }
9124}
9125
9126void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9127{
9128 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9129 pname, params);
9130
9131 try
9132 {
9133 gl::Context *context = gl::getNonLostContext();
9134
9135 if (context)
9136 {
9137 if (context->getClientVersion() < 3)
9138 {
9139 return gl::error(GL_INVALID_OPERATION);
9140 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009141
Jamie Madill79f2f452013-12-19 11:13:02 -05009142 GLenum nativeType;
9143 unsigned int numParams = 0;
9144 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9145 return gl::error(GL_INVALID_ENUM);
9146
9147 // pname is valid, but that there are no parameters to return.
9148 if (numParams == 0)
9149 return;
9150
9151 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009152 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009153 context->getInteger64v(pname, params);
9154 }
Jamie Madill55856b12014-01-02 13:59:50 -05009155 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009156 {
Jamie Madill55856b12014-01-02 13:59:50 -05009157 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009158 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009159 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009160 }
9161 catch(std::bad_alloc&)
9162 {
9163 return gl::error(GL_OUT_OF_MEMORY);
9164 }
9165}
9166
9167void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9168{
9169 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9170 sync, pname, bufSize, length, values);
9171
9172 try
9173 {
9174 gl::Context *context = gl::getNonLostContext();
9175
9176 if (context)
9177 {
9178 if (context->getClientVersion() < 3)
9179 {
9180 return gl::error(GL_INVALID_OPERATION);
9181 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009182
Jamie Madill5215e1a2013-07-26 11:55:19 -04009183 if (bufSize < 0)
9184 {
9185 return gl::error(GL_INVALID_VALUE);
9186 }
9187
9188 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9189
9190 if (!fenceSync)
9191 {
9192 return gl::error(GL_INVALID_VALUE);
9193 }
9194
9195 switch (pname)
9196 {
9197 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9198 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9199 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9200 case GL_SYNC_FLAGS: values[0] = 0; break;
9201
9202 default:
9203 return gl::error(GL_INVALID_ENUM);
9204 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009205 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009206 }
9207 catch(std::bad_alloc&)
9208 {
9209 return gl::error(GL_OUT_OF_MEMORY);
9210 }
9211}
9212
9213void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9214{
9215 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9216 target, index, data);
9217
9218 try
9219 {
9220 gl::Context *context = gl::getNonLostContext();
9221
9222 if (context)
9223 {
9224 if (context->getClientVersion() < 3)
9225 {
9226 return gl::error(GL_INVALID_OPERATION);
9227 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009228
Shannon Woods15934d52013-08-19 14:28:49 -04009229 switch (target)
9230 {
9231 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9232 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9233 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9234 if (index >= context->getMaxTransformFeedbackBufferBindings())
9235 return gl::error(GL_INVALID_VALUE);
9236 break;
9237 case GL_UNIFORM_BUFFER_START:
9238 case GL_UNIFORM_BUFFER_SIZE:
9239 case GL_UNIFORM_BUFFER_BINDING:
9240 if (index >= context->getMaximumCombinedUniformBufferBindings())
9241 return gl::error(GL_INVALID_VALUE);
9242 break;
9243 default:
9244 return gl::error(GL_INVALID_ENUM);
9245 }
9246
9247 if (!(context->getIndexedInteger64v(target, index, data)))
9248 {
9249 GLenum nativeType;
9250 unsigned int numParams = 0;
9251 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9252 return gl::error(GL_INVALID_ENUM);
9253
9254 if (numParams == 0)
9255 return; // it is known that pname is valid, but there are no parameters to return
9256
9257 if (nativeType == GL_INT)
9258 {
9259 GLint *intParams = new GLint[numParams];
9260
9261 context->getIndexedIntegerv(target, index, intParams);
9262
9263 for (unsigned int i = 0; i < numParams; ++i)
9264 {
9265 data[i] = static_cast<GLint64>(intParams[i]);
9266 }
9267
9268 delete [] intParams;
9269 }
9270 else
9271 {
9272 UNREACHABLE();
9273 }
9274 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009275 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009276 }
9277 catch(std::bad_alloc&)
9278 {
9279 return gl::error(GL_OUT_OF_MEMORY);
9280 }
9281}
9282
9283void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9284{
9285 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9286 target, pname, params);
9287
9288 try
9289 {
9290 gl::Context *context = gl::getNonLostContext();
9291
9292 if (context)
9293 {
9294 if (context->getClientVersion() < 3)
9295 {
9296 return gl::error(GL_INVALID_OPERATION);
9297 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009298
Jamie Madill70656a62014-03-05 15:01:26 -05009299 if (!gl::ValidBufferTarget(context, target))
9300 {
9301 return gl::error(GL_INVALID_ENUM);
9302 }
9303
9304 if (!gl::ValidBufferParameter(context, pname))
9305 {
9306 return gl::error(GL_INVALID_ENUM);
9307 }
9308
9309 gl::Buffer *buffer = context->getTargetBuffer(target);
9310
9311 if (!buffer)
9312 {
9313 // A null buffer means that "0" is bound to the requested buffer target
9314 return gl::error(GL_INVALID_OPERATION);
9315 }
9316
9317 switch (pname)
9318 {
9319 case GL_BUFFER_USAGE:
9320 *params = static_cast<GLint64>(buffer->usage());
9321 break;
9322 case GL_BUFFER_SIZE:
9323 *params = buffer->size();
9324 break;
9325 case GL_BUFFER_ACCESS_FLAGS:
9326 *params = static_cast<GLint64>(buffer->accessFlags());
9327 break;
9328 case GL_BUFFER_MAPPED:
9329 *params = static_cast<GLint64>(buffer->mapped());
9330 break;
9331 case GL_BUFFER_MAP_OFFSET:
9332 *params = buffer->mapOffset();
9333 break;
9334 case GL_BUFFER_MAP_LENGTH:
9335 *params = buffer->mapLength();
9336 break;
9337 default: UNREACHABLE(); break;
9338 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009339 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009340 }
9341 catch(std::bad_alloc&)
9342 {
9343 return gl::error(GL_OUT_OF_MEMORY);
9344 }
9345}
9346
9347void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9348{
9349 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9350
9351 try
9352 {
9353 gl::Context *context = gl::getNonLostContext();
9354
9355 if (context)
9356 {
9357 if (context->getClientVersion() < 3)
9358 {
9359 return gl::error(GL_INVALID_OPERATION);
9360 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009361
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009362 if (count < 0)
9363 {
9364 return gl::error(GL_INVALID_VALUE);
9365 }
9366
9367 for (int i = 0; i < count; i++)
9368 {
9369 samplers[i] = context->createSampler();
9370 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009371 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009372 }
9373 catch(std::bad_alloc&)
9374 {
9375 return gl::error(GL_OUT_OF_MEMORY);
9376 }
9377}
9378
9379void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9380{
9381 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9382
9383 try
9384 {
9385 gl::Context *context = gl::getNonLostContext();
9386
9387 if (context)
9388 {
9389 if (context->getClientVersion() < 3)
9390 {
9391 return gl::error(GL_INVALID_OPERATION);
9392 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009393
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009394 if (count < 0)
9395 {
9396 return gl::error(GL_INVALID_VALUE);
9397 }
9398
9399 for (int i = 0; i < count; i++)
9400 {
9401 context->deleteSampler(samplers[i]);
9402 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009403 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009404 }
9405 catch(std::bad_alloc&)
9406 {
9407 return gl::error(GL_OUT_OF_MEMORY);
9408 }
9409}
9410
9411GLboolean __stdcall glIsSampler(GLuint sampler)
9412{
9413 EVENT("(GLuint sampler = %u)", sampler);
9414
9415 try
9416 {
9417 gl::Context *context = gl::getNonLostContext();
9418
9419 if (context)
9420 {
9421 if (context->getClientVersion() < 3)
9422 {
9423 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9424 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009425
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009426 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009427 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009428 }
9429 catch(std::bad_alloc&)
9430 {
9431 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9432 }
9433
9434 return GL_FALSE;
9435}
9436
9437void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9438{
9439 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9440
9441 try
9442 {
9443 gl::Context *context = gl::getNonLostContext();
9444
9445 if (context)
9446 {
9447 if (context->getClientVersion() < 3)
9448 {
9449 return gl::error(GL_INVALID_OPERATION);
9450 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009451
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009452 if (sampler != 0 && !context->isSampler(sampler))
9453 {
9454 return gl::error(GL_INVALID_OPERATION);
9455 }
9456
9457 if (unit >= context->getMaximumCombinedTextureImageUnits())
9458 {
9459 return gl::error(GL_INVALID_VALUE);
9460 }
9461
9462 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009463 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009464 }
9465 catch(std::bad_alloc&)
9466 {
9467 return gl::error(GL_OUT_OF_MEMORY);
9468 }
9469}
9470
9471void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9472{
9473 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9474
9475 try
9476 {
9477 gl::Context *context = gl::getNonLostContext();
9478
9479 if (context)
9480 {
9481 if (context->getClientVersion() < 3)
9482 {
9483 return gl::error(GL_INVALID_OPERATION);
9484 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009485
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009486 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009487 {
9488 return;
9489 }
9490
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009491 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009492 {
9493 return;
9494 }
9495
9496 if (!context->isSampler(sampler))
9497 {
9498 return gl::error(GL_INVALID_OPERATION);
9499 }
9500
9501 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009502 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009503 }
9504 catch(std::bad_alloc&)
9505 {
9506 return gl::error(GL_OUT_OF_MEMORY);
9507 }
9508}
9509
9510void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9511{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009512 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009513}
9514
9515void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9516{
9517 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9518
9519 try
9520 {
9521 gl::Context *context = gl::getNonLostContext();
9522
9523 if (context)
9524 {
9525 if (context->getClientVersion() < 3)
9526 {
9527 return gl::error(GL_INVALID_OPERATION);
9528 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009529
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009530 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009531 {
9532 return;
9533 }
9534
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009535 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009536 {
9537 return;
9538 }
9539
9540 if (!context->isSampler(sampler))
9541 {
9542 return gl::error(GL_INVALID_OPERATION);
9543 }
9544
9545 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009546 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009547 }
9548 catch(std::bad_alloc&)
9549 {
9550 return gl::error(GL_OUT_OF_MEMORY);
9551 }
9552}
9553
9554void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9555{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009556 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009557}
9558
9559void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9560{
9561 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9562
9563 try
9564 {
9565 gl::Context *context = gl::getNonLostContext();
9566
9567 if (context)
9568 {
9569 if (context->getClientVersion() < 3)
9570 {
9571 return gl::error(GL_INVALID_OPERATION);
9572 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009573
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009574 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009575 {
9576 return;
9577 }
9578
9579 if (!context->isSampler(sampler))
9580 {
9581 return gl::error(GL_INVALID_OPERATION);
9582 }
9583
9584 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009585 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009586 }
9587 catch(std::bad_alloc&)
9588 {
9589 return gl::error(GL_OUT_OF_MEMORY);
9590 }
9591}
9592
9593void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9594{
9595 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9596
9597 try
9598 {
9599 gl::Context *context = gl::getNonLostContext();
9600
9601 if (context)
9602 {
9603 if (context->getClientVersion() < 3)
9604 {
9605 return gl::error(GL_INVALID_OPERATION);
9606 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009607
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009608 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009609 {
9610 return;
9611 }
9612
9613 if (!context->isSampler(sampler))
9614 {
9615 return gl::error(GL_INVALID_OPERATION);
9616 }
9617
9618 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009619 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009620 }
9621 catch(std::bad_alloc&)
9622 {
9623 return gl::error(GL_OUT_OF_MEMORY);
9624 }
9625}
9626
9627void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9628{
9629 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9630
9631 try
9632 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009633 if (index >= gl::MAX_VERTEX_ATTRIBS)
9634 {
9635 return gl::error(GL_INVALID_VALUE);
9636 }
9637
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009638 gl::Context *context = gl::getNonLostContext();
9639
9640 if (context)
9641 {
9642 if (context->getClientVersion() < 3)
9643 {
9644 return gl::error(GL_INVALID_OPERATION);
9645 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009646
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009647 context->setVertexAttribDivisor(index, divisor);
9648 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009649 }
9650 catch(std::bad_alloc&)
9651 {
9652 return gl::error(GL_OUT_OF_MEMORY);
9653 }
9654}
9655
9656void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9657{
9658 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9659
9660 try
9661 {
9662 gl::Context *context = gl::getNonLostContext();
9663
9664 if (context)
9665 {
9666 if (context->getClientVersion() < 3)
9667 {
9668 return gl::error(GL_INVALID_OPERATION);
9669 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009670
Geoff Langc8058452014-02-03 12:04:11 -05009671 switch (target)
9672 {
9673 case GL_TRANSFORM_FEEDBACK:
9674 {
9675 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9676 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9677 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9678 {
9679 return gl::error(GL_INVALID_OPERATION);
9680 }
9681
9682 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9683 if (context->getTransformFeedback(id) == NULL)
9684 {
9685 return gl::error(GL_INVALID_OPERATION);
9686 }
9687
9688 context->bindTransformFeedback(id);
9689 }
9690 break;
9691
9692 default:
9693 return gl::error(GL_INVALID_ENUM);
9694 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009695 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009696 }
9697 catch(std::bad_alloc&)
9698 {
9699 return gl::error(GL_OUT_OF_MEMORY);
9700 }
9701}
9702
9703void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9704{
9705 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9706
9707 try
9708 {
9709 gl::Context *context = gl::getNonLostContext();
9710
9711 if (context)
9712 {
9713 if (context->getClientVersion() < 3)
9714 {
9715 return gl::error(GL_INVALID_OPERATION);
9716 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009717
Geoff Langc8058452014-02-03 12:04:11 -05009718 for (int i = 0; i < n; i++)
9719 {
9720 context->deleteTransformFeedback(ids[i]);
9721 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009722 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009723 }
9724 catch(std::bad_alloc&)
9725 {
9726 return gl::error(GL_OUT_OF_MEMORY);
9727 }
9728}
9729
9730void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9731{
9732 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9733
9734 try
9735 {
9736 gl::Context *context = gl::getNonLostContext();
9737
9738 if (context)
9739 {
9740 if (context->getClientVersion() < 3)
9741 {
9742 return gl::error(GL_INVALID_OPERATION);
9743 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009744
Geoff Langc8058452014-02-03 12:04:11 -05009745 for (int i = 0; i < n; i++)
9746 {
9747 ids[i] = context->createTransformFeedback();
9748 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009749 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009750 }
9751 catch(std::bad_alloc&)
9752 {
9753 return gl::error(GL_OUT_OF_MEMORY);
9754 }
9755}
9756
9757GLboolean __stdcall glIsTransformFeedback(GLuint id)
9758{
9759 EVENT("(GLuint id = %u)", id);
9760
9761 try
9762 {
9763 gl::Context *context = gl::getNonLostContext();
9764
9765 if (context)
9766 {
9767 if (context->getClientVersion() < 3)
9768 {
9769 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9770 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009771
Geoff Langc8058452014-02-03 12:04:11 -05009772 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009773 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009774 }
9775 catch(std::bad_alloc&)
9776 {
9777 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9778 }
9779
9780 return GL_FALSE;
9781}
9782
9783void __stdcall glPauseTransformFeedback(void)
9784{
9785 EVENT("(void)");
9786
9787 try
9788 {
9789 gl::Context *context = gl::getNonLostContext();
9790
9791 if (context)
9792 {
9793 if (context->getClientVersion() < 3)
9794 {
9795 return gl::error(GL_INVALID_OPERATION);
9796 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009797
Geoff Langc8058452014-02-03 12:04:11 -05009798 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9799 ASSERT(transformFeedback != NULL);
9800
9801 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9802 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9803 {
9804 return gl::error(GL_INVALID_OPERATION);
9805 }
9806
9807 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009808 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009809 }
9810 catch(std::bad_alloc&)
9811 {
9812 return gl::error(GL_OUT_OF_MEMORY);
9813 }
9814}
9815
9816void __stdcall glResumeTransformFeedback(void)
9817{
9818 EVENT("(void)");
9819
9820 try
9821 {
9822 gl::Context *context = gl::getNonLostContext();
9823
9824 if (context)
9825 {
9826 if (context->getClientVersion() < 3)
9827 {
9828 return gl::error(GL_INVALID_OPERATION);
9829 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009830
Geoff Langc8058452014-02-03 12:04:11 -05009831 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9832 ASSERT(transformFeedback != NULL);
9833
9834 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9835 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9836 {
9837 return gl::error(GL_INVALID_OPERATION);
9838 }
9839
9840 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009842 }
9843 catch(std::bad_alloc&)
9844 {
9845 return gl::error(GL_OUT_OF_MEMORY);
9846 }
9847}
9848
9849void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9850{
9851 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9852 program, bufSize, length, binaryFormat, binary);
9853
9854 try
9855 {
9856 gl::Context *context = gl::getNonLostContext();
9857
9858 if (context)
9859 {
9860 if (context->getClientVersion() < 3)
9861 {
9862 return gl::error(GL_INVALID_OPERATION);
9863 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009864
Jamie Madill54133512013-06-21 09:33:07 -04009865 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009866 UNIMPLEMENTED();
9867 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009868 }
9869 catch(std::bad_alloc&)
9870 {
9871 return gl::error(GL_OUT_OF_MEMORY);
9872 }
9873}
9874
9875void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9876{
9877 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9878 program, binaryFormat, binary, length);
9879
9880 try
9881 {
9882 gl::Context *context = gl::getNonLostContext();
9883
9884 if (context)
9885 {
9886 if (context->getClientVersion() < 3)
9887 {
9888 return gl::error(GL_INVALID_OPERATION);
9889 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009890
Jamie Madill54133512013-06-21 09:33:07 -04009891 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009892 UNIMPLEMENTED();
9893 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009894 }
9895 catch(std::bad_alloc&)
9896 {
9897 return gl::error(GL_OUT_OF_MEMORY);
9898 }
9899}
9900
9901void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9902{
9903 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9904 program, pname, value);
9905
9906 try
9907 {
9908 gl::Context *context = gl::getNonLostContext();
9909
9910 if (context)
9911 {
9912 if (context->getClientVersion() < 3)
9913 {
9914 return gl::error(GL_INVALID_OPERATION);
9915 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009916
Jamie Madill54133512013-06-21 09:33:07 -04009917 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009918 UNIMPLEMENTED();
9919 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009920 }
9921 catch(std::bad_alloc&)
9922 {
9923 return gl::error(GL_OUT_OF_MEMORY);
9924 }
9925}
9926
9927void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9928{
9929 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9930 target, numAttachments, attachments);
9931
9932 try
9933 {
9934 gl::Context *context = gl::getNonLostContext();
9935
9936 if (context)
9937 {
9938 if (context->getClientVersion() < 3)
9939 {
9940 return gl::error(GL_INVALID_OPERATION);
9941 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009942
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009943 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009944 {
9945 return;
9946 }
9947
9948 int maxDimension = context->getMaximumRenderbufferDimension();
9949 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9950 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009951 }
9952 catch(std::bad_alloc&)
9953 {
9954 return gl::error(GL_OUT_OF_MEMORY);
9955 }
9956}
9957
9958void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9959{
9960 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9961 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9962 target, numAttachments, attachments, x, y, width, height);
9963
9964 try
9965 {
9966 gl::Context *context = gl::getNonLostContext();
9967
9968 if (context)
9969 {
9970 if (context->getClientVersion() < 3)
9971 {
9972 return gl::error(GL_INVALID_OPERATION);
9973 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009974
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009975 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009976 {
9977 return;
9978 }
9979
9980 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9981 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009982 }
9983 catch(std::bad_alloc&)
9984 {
9985 return gl::error(GL_OUT_OF_MEMORY);
9986 }
9987}
9988
9989void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9990{
9991 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9992 target, levels, internalformat, width, height);
9993
9994 try
9995 {
9996 gl::Context *context = gl::getNonLostContext();
9997
9998 if (context)
9999 {
10000 if (context->getClientVersion() < 3)
10001 {
10002 return gl::error(GL_INVALID_OPERATION);
10003 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010004
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010005 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010006 {
10007 return;
10008 }
10009
10010 switch (target)
10011 {
10012 case GL_TEXTURE_2D:
10013 {
10014 gl::Texture2D *texture2d = context->getTexture2D();
10015 texture2d->storage(levels, internalformat, width, height);
10016 }
10017 break;
10018
Geoff Lang01c21d22013-09-24 11:52:16 -040010019 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010020 {
10021 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
10022 textureCube->storage(levels, internalformat, width);
10023 }
10024 break;
10025
10026 default:
10027 return gl::error(GL_INVALID_ENUM);
10028 }
10029 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010030 }
10031 catch(std::bad_alloc&)
10032 {
10033 return gl::error(GL_OUT_OF_MEMORY);
10034 }
10035}
10036
10037void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10038{
10039 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10040 "GLsizei height = %d, GLsizei depth = %d)",
10041 target, levels, internalformat, width, height, depth);
10042
10043 try
10044 {
10045 gl::Context *context = gl::getNonLostContext();
10046
10047 if (context)
10048 {
10049 if (context->getClientVersion() < 3)
10050 {
10051 return gl::error(GL_INVALID_OPERATION);
10052 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010053
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010054 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010055 {
10056 return;
10057 }
10058
10059 switch (target)
10060 {
10061 case GL_TEXTURE_3D:
10062 {
10063 gl::Texture3D *texture3d = context->getTexture3D();
10064 texture3d->storage(levels, internalformat, width, height, depth);
10065 }
10066 break;
10067
10068 case GL_TEXTURE_2D_ARRAY:
10069 {
10070 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
10071 texture2darray->storage(levels, internalformat, width, height, depth);
10072 }
10073 break;
10074
10075 default:
Geoff Lang01c21d22013-09-24 11:52:16 -040010076 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010077 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010078 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010079 }
10080 catch(std::bad_alloc&)
10081 {
10082 return gl::error(GL_OUT_OF_MEMORY);
10083 }
10084}
10085
10086void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10087{
10088 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10089 "GLint* params = 0x%0.8p)",
10090 target, internalformat, pname, bufSize, params);
10091
10092 try
10093 {
10094 gl::Context *context = gl::getNonLostContext();
10095
10096 if (context)
10097 {
10098 if (context->getClientVersion() < 3)
10099 {
10100 return gl::error(GL_INVALID_OPERATION);
10101 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010102
Shannon Woods809d2502013-07-08 10:32:18 -040010103 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10104 !gl::IsDepthRenderingSupported(internalformat, context) &&
10105 !gl::IsStencilRenderingSupported(internalformat, context))
10106 {
10107 return gl::error(GL_INVALID_ENUM);
10108 }
10109
10110 if (target != GL_RENDERBUFFER)
10111 {
10112 return gl::error(GL_INVALID_ENUM);
10113 }
10114
10115 if (bufSize < 0)
10116 {
10117 return gl::error(GL_INVALID_VALUE);
10118 }
10119
10120 switch (pname)
10121 {
10122 case GL_NUM_SAMPLE_COUNTS:
10123 if (bufSize != 0)
10124 *params = context->getNumSampleCounts(internalformat);
10125 break;
10126 case GL_SAMPLES:
10127 context->getSampleCounts(internalformat, bufSize, params);
10128 break;
10129 default:
10130 return gl::error(GL_INVALID_ENUM);
10131 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010132 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010133 }
10134 catch(std::bad_alloc&)
10135 {
10136 return gl::error(GL_OUT_OF_MEMORY);
10137 }
10138}
10139
10140// Extension functions
10141
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010142void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10143 GLbitfield mask, GLenum filter)
10144{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010145 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010146 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10147 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10148 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10149
10150 try
10151 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010152 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010153
10154 if (context)
10155 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010156 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010157 dstX0, dstY0, dstX1, dstY1, mask, filter,
10158 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010159 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010160 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010161 }
10162
Geoff Lang758d5b22013-06-11 11:42:50 -040010163 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10164 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010165 }
10166 }
10167 catch(std::bad_alloc&)
10168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010169 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010170 }
10171}
10172
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010173void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10174 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010175{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010176 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010177 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010178 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010179 target, level, internalformat, width, height, depth, border, format, type, pixels);
10180
10181 try
10182 {
10183 UNIMPLEMENTED(); // FIXME
10184 }
10185 catch(std::bad_alloc&)
10186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010187 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010188 }
10189}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010190
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010191void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10192 GLenum *binaryFormat, void *binary)
10193{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010194 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 +000010195 program, bufSize, length, binaryFormat, binary);
10196
10197 try
10198 {
10199 gl::Context *context = gl::getNonLostContext();
10200
10201 if (context)
10202 {
10203 gl::Program *programObject = context->getProgram(program);
10204
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010205 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010206 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010207 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010208 }
10209
10210 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10211
10212 if (!programBinary)
10213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010214 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010215 }
10216
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010217 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010219 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010220 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010221
10222 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010223 }
10224 }
10225 catch(std::bad_alloc&)
10226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010227 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010228 }
10229}
10230
10231void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10232 const void *binary, GLint length)
10233{
10234 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10235 program, binaryFormat, binary, length);
10236
10237 try
10238 {
10239 gl::Context *context = gl::getNonLostContext();
10240
10241 if (context)
10242 {
10243 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010245 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010246 }
10247
10248 gl::Program *programObject = context->getProgram(program);
10249
10250 if (!programObject)
10251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010252 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010253 }
10254
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010255 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010256 }
10257 }
10258 catch(std::bad_alloc&)
10259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010260 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010261 }
10262}
10263
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010264void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10265{
10266 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10267
10268 try
10269 {
10270 gl::Context *context = gl::getNonLostContext();
10271
10272 if (context)
10273 {
10274 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10275 {
10276 return gl::error(GL_INVALID_VALUE);
10277 }
10278
10279 if (context->getDrawFramebufferHandle() == 0)
10280 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010281 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010282 {
10283 return gl::error(GL_INVALID_OPERATION);
10284 }
10285
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010286 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010287 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010288 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010289 }
10290 }
10291 else
10292 {
10293 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10294 {
10295 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10296 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10297 {
10298 return gl::error(GL_INVALID_OPERATION);
10299 }
10300 }
10301 }
10302
10303 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10304
10305 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10306 {
10307 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10308 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010309
10310 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10311 {
10312 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10313 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010314 }
10315 }
10316 catch (std::bad_alloc&)
10317 {
10318 return gl::error(GL_OUT_OF_MEMORY);
10319 }
10320}
10321
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010322__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10323{
10324 struct Extension
10325 {
10326 const char *name;
10327 __eglMustCastToProperFunctionPointerType address;
10328 };
10329
10330 static const Extension glExtensions[] =
10331 {
10332 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010333 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010334 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010335 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10336 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10337 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10338 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10339 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10340 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10341 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010342 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010343 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010344 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10345 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10346 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10347 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010348 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10349 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10350 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10351 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10352 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10353 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10354 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010355 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010356 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10357 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10358 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010359 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10360 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010361
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010362 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010363 {
10364 if (strcmp(procname, glExtensions[ext].name) == 0)
10365 {
10366 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10367 }
10368 }
10369
10370 return NULL;
10371}
10372
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010373// Non-public functions used by EGL
10374
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010375bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010376{
10377 EVENT("(egl::Surface* surface = 0x%0.8p)",
10378 surface);
10379
10380 try
10381 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010382 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010383
10384 if (context)
10385 {
10386 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010387 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010388
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010389 if (textureObject->isImmutable())
10390 {
10391 return false;
10392 }
10393
Geoff Lang32d508e2014-02-11 09:39:48 -050010394 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010395 }
10396 }
10397 catch(std::bad_alloc&)
10398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010399 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010400 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010401
10402 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010403}
10404
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010405}