blob: 64ec9e75f5aa7abcb94ac5de54f6894651a00d9a [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"
Brandon Jones5bf98292014-06-06 17:19:38 -070025#include "libGLESv2/VertexAttribute.h"
Geoff Langc8058452014-02-03 12:04:11 -050026#include "libGLESv2/TransformFeedback.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000027
Geoff Lange8ebe7f2013-08-05 15:03:13 -040028#include "libGLESv2/validationES.h"
29#include "libGLESv2/validationES2.h"
30#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050031#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040032
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000033extern "C"
34{
35
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000036// OpenGL ES 2.0 functions
37
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000038void __stdcall glActiveTexture(GLenum texture)
39{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000040 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000041
42 try
43 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000044 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000045
46 if (context)
47 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000048 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
49 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000050 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000051 }
52
daniel@transgaming.com428d1582010-05-04 03:35:25 +000053 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000054 }
55 }
Jamie Madillde0ec752014-05-05 15:10:38 -040056 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000058 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000059 }
60}
61
62void __stdcall glAttachShader(GLuint program, GLuint shader)
63{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000064 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000065
66 try
67 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000068 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000069
70 if (context)
71 {
72 gl::Program *programObject = context->getProgram(program);
73 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000074
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000075 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000076 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000077 if (context->getShader(program))
78 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000079 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000080 }
81 else
82 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000083 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000084 }
85 }
86
87 if (!shaderObject)
88 {
89 if (context->getProgram(shader))
90 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000091 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000092 }
93 else
94 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000095 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000096 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000097 }
98
99 if (!programObject->attachShader(shaderObject))
100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000101 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000102 }
103 }
104 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400105 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000107 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000108 }
109}
110
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000111void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
112{
113 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
114
115 try
116 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000117 gl::Context *context = gl::getNonLostContext();
118
119 if (context)
120 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400121 if (!ValidateBeginQuery(context, target, id))
Geoff Lang37dde692014-01-31 16:34:54 -0500122 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400123 return;
Geoff Lang37dde692014-01-31 16:34:54 -0500124 }
125
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000126 context->beginQuery(target, id);
127 }
128 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400129 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000132 }
133}
134
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000135void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000136{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000137 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000138
139 try
140 {
141 if (index >= gl::MAX_VERTEX_ATTRIBS)
142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000143 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000144 }
145
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000146 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000147
148 if (context)
149 {
150 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000151
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000152 if (!programObject)
153 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000154 if (context->getShader(program))
155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000156 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000157 }
158 else
159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000160 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000161 }
162 }
163
164 if (strncmp(name, "gl_", 3) == 0)
165 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000166 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000167 }
168
169 programObject->bindAttributeLocation(index, name);
170 }
171 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400172 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000174 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000175 }
176}
177
178void __stdcall glBindBuffer(GLenum target, GLuint buffer)
179{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000180 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000181
182 try
183 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000184 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000185
186 if (context)
187 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500188 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000189 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500190 return gl::error(GL_INVALID_ENUM);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000191 }
192
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000193 switch (target)
194 {
195 case GL_ARRAY_BUFFER:
196 context->bindArrayBuffer(buffer);
197 return;
198 case GL_ELEMENT_ARRAY_BUFFER:
199 context->bindElementArrayBuffer(buffer);
200 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000201 case GL_COPY_READ_BUFFER:
202 context->bindCopyReadBuffer(buffer);
203 return;
204 case GL_COPY_WRITE_BUFFER:
205 context->bindCopyWriteBuffer(buffer);
206 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000207 case GL_PIXEL_PACK_BUFFER:
208 context->bindPixelPackBuffer(buffer);
209 return;
210 case GL_PIXEL_UNPACK_BUFFER:
211 context->bindPixelUnpackBuffer(buffer);
212 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000213 case GL_UNIFORM_BUFFER:
214 context->bindGenericUniformBuffer(buffer);
215 return;
216 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000217 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000218 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000219 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000220 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000221 }
222 }
223 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400224 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000226 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000227 }
228}
229
230void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
231{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000232 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000233
234 try
235 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500236 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000238 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000239 }
240
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000241 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000242
243 if (context)
244 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000245 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
246 {
247 context->bindReadFramebuffer(framebuffer);
248 }
249
250 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
251 {
252 context->bindDrawFramebuffer(framebuffer);
253 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000254 }
255 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400256 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000258 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000259 }
260}
261
262void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
263{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000264 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000265
266 try
267 {
268 if (target != GL_RENDERBUFFER)
269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000270 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000271 }
272
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000273 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000274
275 if (context)
276 {
277 context->bindRenderbuffer(renderbuffer);
278 }
279 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400280 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000282 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000283 }
284}
285
286void __stdcall glBindTexture(GLenum target, GLuint texture)
287{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000288 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000289
290 try
291 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000292 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000293
294 if (context)
295 {
296 gl::Texture *textureObject = context->getTexture(texture);
297
298 if (textureObject && textureObject->getTarget() != target && texture != 0)
299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000300 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000301 }
302
303 switch (target)
304 {
305 case GL_TEXTURE_2D:
306 context->bindTexture2D(texture);
307 return;
308 case GL_TEXTURE_CUBE_MAP:
309 context->bindTextureCubeMap(texture);
310 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000311 case GL_TEXTURE_3D:
312 if (context->getClientVersion() < 3)
313 {
314 return gl::error(GL_INVALID_ENUM);
315 }
316 context->bindTexture3D(texture);
317 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000318 case GL_TEXTURE_2D_ARRAY:
319 if (context->getClientVersion() < 3)
320 {
321 return gl::error(GL_INVALID_ENUM);
322 }
323 context->bindTexture2DArray(texture);
324 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000325 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000326 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000327 }
328 }
329 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400330 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000332 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000333 }
334}
335
336void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
337{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000338 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000339 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000340
341 try
342 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000343 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000344
345 if (context)
346 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000347 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000348 }
349 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400350 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000352 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000353 }
354}
355
356void __stdcall glBlendEquation(GLenum mode)
357{
358 glBlendEquationSeparate(mode, mode);
359}
360
361void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
362{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000363 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000364
365 try
366 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000367 gl::Context *context = gl::getNonLostContext();
368
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000369 switch (modeRGB)
370 {
371 case GL_FUNC_ADD:
372 case GL_FUNC_SUBTRACT:
373 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000374 case GL_MIN:
375 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000376 break;
377
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000378 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000379 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000380 }
381
382 switch (modeAlpha)
383 {
384 case GL_FUNC_ADD:
385 case GL_FUNC_SUBTRACT:
386 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000387 case GL_MIN:
388 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000389 break;
390
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000391 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000392 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000393 }
394
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000395 if (context)
396 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000397 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000398 }
399 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400400 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000402 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000403 }
404}
405
406void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
407{
408 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
409}
410
411void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
412{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000413 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 +0000414 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000415
416 try
417 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000418 gl::Context *context = gl::getNonLostContext();
419
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000420 switch (srcRGB)
421 {
422 case GL_ZERO:
423 case GL_ONE:
424 case GL_SRC_COLOR:
425 case GL_ONE_MINUS_SRC_COLOR:
426 case GL_DST_COLOR:
427 case GL_ONE_MINUS_DST_COLOR:
428 case GL_SRC_ALPHA:
429 case GL_ONE_MINUS_SRC_ALPHA:
430 case GL_DST_ALPHA:
431 case GL_ONE_MINUS_DST_ALPHA:
432 case GL_CONSTANT_COLOR:
433 case GL_ONE_MINUS_CONSTANT_COLOR:
434 case GL_CONSTANT_ALPHA:
435 case GL_ONE_MINUS_CONSTANT_ALPHA:
436 case GL_SRC_ALPHA_SATURATE:
437 break;
438 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000439 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000440 }
441
442 switch (dstRGB)
443 {
444 case GL_ZERO:
445 case GL_ONE:
446 case GL_SRC_COLOR:
447 case GL_ONE_MINUS_SRC_COLOR:
448 case GL_DST_COLOR:
449 case GL_ONE_MINUS_DST_COLOR:
450 case GL_SRC_ALPHA:
451 case GL_ONE_MINUS_SRC_ALPHA:
452 case GL_DST_ALPHA:
453 case GL_ONE_MINUS_DST_ALPHA:
454 case GL_CONSTANT_COLOR:
455 case GL_ONE_MINUS_CONSTANT_COLOR:
456 case GL_CONSTANT_ALPHA:
457 case GL_ONE_MINUS_CONSTANT_ALPHA:
458 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000459
460 case GL_SRC_ALPHA_SATURATE:
461 if (!context || context->getClientVersion() < 3)
462 {
463 return gl::error(GL_INVALID_ENUM);
464 }
465 break;
466
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000467 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000468 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000469 }
470
471 switch (srcAlpha)
472 {
473 case GL_ZERO:
474 case GL_ONE:
475 case GL_SRC_COLOR:
476 case GL_ONE_MINUS_SRC_COLOR:
477 case GL_DST_COLOR:
478 case GL_ONE_MINUS_DST_COLOR:
479 case GL_SRC_ALPHA:
480 case GL_ONE_MINUS_SRC_ALPHA:
481 case GL_DST_ALPHA:
482 case GL_ONE_MINUS_DST_ALPHA:
483 case GL_CONSTANT_COLOR:
484 case GL_ONE_MINUS_CONSTANT_COLOR:
485 case GL_CONSTANT_ALPHA:
486 case GL_ONE_MINUS_CONSTANT_ALPHA:
487 case GL_SRC_ALPHA_SATURATE:
488 break;
489 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000490 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000491 }
492
493 switch (dstAlpha)
494 {
495 case GL_ZERO:
496 case GL_ONE:
497 case GL_SRC_COLOR:
498 case GL_ONE_MINUS_SRC_COLOR:
499 case GL_DST_COLOR:
500 case GL_ONE_MINUS_DST_COLOR:
501 case GL_SRC_ALPHA:
502 case GL_ONE_MINUS_SRC_ALPHA:
503 case GL_DST_ALPHA:
504 case GL_ONE_MINUS_DST_ALPHA:
505 case GL_CONSTANT_COLOR:
506 case GL_ONE_MINUS_CONSTANT_COLOR:
507 case GL_CONSTANT_ALPHA:
508 case GL_ONE_MINUS_CONSTANT_ALPHA:
509 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000510
511 case GL_SRC_ALPHA_SATURATE:
512 if (!context || context->getClientVersion() < 3)
513 {
514 return gl::error(GL_INVALID_ENUM);
515 }
516 break;
517
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000518 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000519 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000520 }
521
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000522 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
523 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
524
525 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
526 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
527
528 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000529 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000530 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 +0000531 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000532 }
533
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000534 if (context)
535 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000536 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000537 }
538 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400539 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000540 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000541 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000542 }
543}
544
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000545void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000546{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000547 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 +0000548 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000549
550 try
551 {
552 if (size < 0)
553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000554 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000555 }
556
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000557 gl::Context *context = gl::getNonLostContext();
558
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000559 switch (usage)
560 {
561 case GL_STREAM_DRAW:
562 case GL_STATIC_DRAW:
563 case GL_DYNAMIC_DRAW:
564 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000565
566 case GL_STREAM_READ:
567 case GL_STREAM_COPY:
568 case GL_STATIC_READ:
569 case GL_STATIC_COPY:
570 case GL_DYNAMIC_READ:
571 case GL_DYNAMIC_COPY:
572 if (context && context->getClientVersion() < 3)
573 {
574 return gl::error(GL_INVALID_ENUM);
575 }
576 break;
577
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000578 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000579 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000580 }
581
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000582 if (context)
583 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500584 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000586 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000587 }
588
Jamie Madill8c96d582014-03-05 15:01:23 -0500589 gl::Buffer *buffer = context->getTargetBuffer(target);
590
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000591 if (!buffer)
592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000593 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000594 }
595
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000596 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000597 }
598 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400599 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000601 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000602 }
603}
604
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000605void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000606{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000607 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 +0000608 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000609
610 try
611 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000612 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000614 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000615 }
616
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000617 if (data == NULL)
618 {
619 return;
620 }
621
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000622 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000623
624 if (context)
625 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500626 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000628 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000629 }
630
Jamie Madill8c96d582014-03-05 15:01:23 -0500631 gl::Buffer *buffer = context->getTargetBuffer(target);
632
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000633 if (!buffer)
634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000635 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000636 }
637
Jamie Madill7a5f7382014-03-05 15:01:24 -0500638 if (buffer->mapped())
639 {
640 return gl::error(GL_INVALID_OPERATION);
641 }
642
Geoff Lang876dc722014-05-01 17:10:24 -0400643 // Check for possible overflow of size + offset
644 if (!rx::IsUnsignedAdditionSafe<size_t>(size, offset))
645 {
646 return gl::error(GL_OUT_OF_MEMORY);
647 }
648
649 if (size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000651 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000652 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000653
654 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000655 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000656 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400657 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000659 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000660 }
661}
662
663GLenum __stdcall glCheckFramebufferStatus(GLenum target)
664{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000665 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000666
667 try
668 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500669 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000671 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000672 }
673
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000674 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000675
676 if (context)
677 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500678 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
679 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000680 return framebuffer->completeness();
681 }
682 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400683 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000685 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000686 }
687
688 return 0;
689}
690
691void __stdcall glClear(GLbitfield mask)
692{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000693 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000694
695 try
696 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000697 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000698
699 if (context)
700 {
Geoff Lang0b833232013-08-21 10:13:29 -0400701 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
702
703 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
704 {
705 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
706 }
707
708 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
709 {
710 return gl::error(GL_INVALID_VALUE);
711 }
712
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000713 context->clear(mask);
714 }
715 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400716 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000718 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000719 }
720}
721
722void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
723{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000724 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000725 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000726
727 try
728 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000729 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000730
731 if (context)
732 {
733 context->setClearColor(red, green, blue, alpha);
734 }
735 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400736 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000738 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000739 }
740}
741
742void __stdcall glClearDepthf(GLclampf depth)
743{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000744 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000745
746 try
747 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000748 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000749
750 if (context)
751 {
752 context->setClearDepth(depth);
753 }
754 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400755 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000757 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000758 }
759}
760
761void __stdcall glClearStencil(GLint s)
762{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000763 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000764
765 try
766 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000767 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000768
769 if (context)
770 {
771 context->setClearStencil(s);
772 }
773 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400774 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000776 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000777 }
778}
779
780void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
781{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000782 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000783 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000784
785 try
786 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000787 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000788
789 if (context)
790 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000791 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000792 }
793 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400794 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000796 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000797 }
798}
799
800void __stdcall glCompileShader(GLuint shader)
801{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000802 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000803
804 try
805 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000806 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000807
808 if (context)
809 {
810 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000811
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000812 if (!shaderObject)
813 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000814 if (context->getProgram(shader))
815 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000816 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000817 }
818 else
819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000820 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000821 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000822 }
823
824 shaderObject->compile();
825 }
826 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400827 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000830 }
831}
832
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000833void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
834 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000835{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000836 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000837 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000838 target, level, internalformat, width, height, border, imageSize, data);
839
840 try
841 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000842 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000843
844 if (context)
845 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000846 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400847 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madill6f38f822014-06-06 17:12:20 -0400848 0, 0, width, height, border, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000849 {
850 return;
851 }
852
853 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400854 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madill6f38f822014-06-06 17:12:20 -0400855 0, 0, 0, width, height, 1, border, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000856 {
857 return;
858 }
859
860 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000862 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000863 }
864
865 switch (target)
866 {
867 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000868 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000869 gl::Texture2D *texture = context->getTexture2D();
870 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000871 }
872 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000873
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000874 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
875 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
876 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
877 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
878 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
879 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000880 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000881 gl::TextureCubeMap *texture = context->getTextureCubeMap();
882 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000883 }
884 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000885
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000886 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000887 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000888 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000889 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000890 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400891 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000893 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000894 }
895}
896
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000897void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
898 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000899{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000900 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000901 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000902 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000903 target, level, xoffset, yoffset, width, height, format, imageSize, data);
904
905 try
906 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000907 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000908
909 if (context)
910 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000911 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400912 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000913 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
914 {
915 return;
916 }
917
918 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400919 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400920 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000921 {
922 return;
923 }
924
925 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000927 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000928 }
929
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000930 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000931 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000932 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000933 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000934 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000935 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000936 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000937 break;
938
939 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
940 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
941 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
942 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
943 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
944 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000945 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000946 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000947 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000948 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000949 break;
950
951 default:
952 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000953 }
954 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000955 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400956 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000958 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000959 }
960}
961
962void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
963{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000964 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000965 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000966 target, level, internalformat, x, y, width, height, border);
967
968 try
969 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000971
972 if (context)
973 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000974 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400975 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000976 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000977 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000978 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000979 }
980
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000981 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400982 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000983 0, 0, 0, x, y, width, height, border))
984 {
985 return;
986 }
987
988 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
989
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000990 switch (target)
991 {
992 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000993 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000994 gl::Texture2D *texture = context->getTexture2D();
995 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000996 }
997 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000998
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000999 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1000 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1001 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1002 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1003 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1004 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001005 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001006 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1007 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001008 }
1009 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001010
1011 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001012 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001013 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001014 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001015 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001016 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001017 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001018 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001019 }
1020}
1021
1022void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1023{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001024 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001025 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001026 target, level, xoffset, yoffset, x, y, width, height);
1027
1028 try
1029 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001030 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001031
1032 if (context)
1033 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001034 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001035 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001036 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001037 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001038 return;
1039 }
1040
1041 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001042 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001043 xoffset, yoffset, 0, x, y, width, height, 0))
1044 {
1045 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001046 }
1047
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001048 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001049
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001050 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001051 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001052 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001053 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001054 gl::Texture2D *texture = context->getTexture2D();
1055 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001056 }
1057 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001058
1059 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1060 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1061 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1062 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1063 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1064 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001065 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001066 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1067 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001068 }
1069 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001070
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001071 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001072 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001073 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001074 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001075 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001076
Jamie Madillde0ec752014-05-05 15:10:38 -04001077 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001079 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001080 }
1081}
1082
1083GLuint __stdcall glCreateProgram(void)
1084{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001085 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001086
1087 try
1088 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001089 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001090
1091 if (context)
1092 {
1093 return context->createProgram();
1094 }
1095 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001096 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001098 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001099 }
1100
1101 return 0;
1102}
1103
1104GLuint __stdcall glCreateShader(GLenum type)
1105{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001106 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001107
1108 try
1109 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001110 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001111
1112 if (context)
1113 {
1114 switch (type)
1115 {
1116 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001117 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001118 return context->createShader(type);
1119 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001120 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001121 }
1122 }
1123 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001124 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001126 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001127 }
1128
1129 return 0;
1130}
1131
1132void __stdcall glCullFace(GLenum mode)
1133{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001134 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001135
1136 try
1137 {
1138 switch (mode)
1139 {
1140 case GL_FRONT:
1141 case GL_BACK:
1142 case GL_FRONT_AND_BACK:
1143 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001144 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001145
1146 if (context)
1147 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001148 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001149 }
1150 }
1151 break;
1152 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001153 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001154 }
1155 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001156 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001158 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001159 }
1160}
1161
1162void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1163{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001164 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001165
1166 try
1167 {
1168 if (n < 0)
1169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001170 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001171 }
1172
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001173 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001174
1175 if (context)
1176 {
1177 for (int i = 0; i < n; i++)
1178 {
1179 context->deleteBuffer(buffers[i]);
1180 }
1181 }
1182 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001183 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001185 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001186 }
1187}
1188
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001189void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1190{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001191 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001192
1193 try
1194 {
1195 if (n < 0)
1196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001197 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001198 }
1199
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001200 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001201
1202 if (context)
1203 {
1204 for (int i = 0; i < n; i++)
1205 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001206 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001207 }
1208 }
1209 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001210 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001212 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001213 }
1214}
1215
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001216void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1217{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001218 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001219
1220 try
1221 {
1222 if (n < 0)
1223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001224 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001225 }
1226
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001227 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001228
1229 if (context)
1230 {
1231 for (int i = 0; i < n; i++)
1232 {
1233 if (framebuffers[i] != 0)
1234 {
1235 context->deleteFramebuffer(framebuffers[i]);
1236 }
1237 }
1238 }
1239 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001240 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001242 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001243 }
1244}
1245
1246void __stdcall glDeleteProgram(GLuint program)
1247{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001248 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001249
1250 try
1251 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001252 if (program == 0)
1253 {
1254 return;
1255 }
1256
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001257 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001258
1259 if (context)
1260 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001261 if (!context->getProgram(program))
1262 {
1263 if(context->getShader(program))
1264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001265 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001266 }
1267 else
1268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001269 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001270 }
1271 }
1272
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001273 context->deleteProgram(program);
1274 }
1275 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001276 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001277 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001278 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001279 }
1280}
1281
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001282void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1283{
1284 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1285
1286 try
1287 {
1288 if (n < 0)
1289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001290 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001291 }
1292
1293 gl::Context *context = gl::getNonLostContext();
1294
1295 if (context)
1296 {
1297 for (int i = 0; i < n; i++)
1298 {
1299 context->deleteQuery(ids[i]);
1300 }
1301 }
1302 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001303 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001305 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001306 }
1307}
1308
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001309void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1310{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001311 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001312
1313 try
1314 {
1315 if (n < 0)
1316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001317 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001318 }
1319
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001320 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001321
1322 if (context)
1323 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001324 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001325 {
1326 context->deleteRenderbuffer(renderbuffers[i]);
1327 }
1328 }
1329 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001330 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001332 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001333 }
1334}
1335
1336void __stdcall glDeleteShader(GLuint shader)
1337{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001338 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001339
1340 try
1341 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001342 if (shader == 0)
1343 {
1344 return;
1345 }
1346
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001347 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001348
1349 if (context)
1350 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001351 if (!context->getShader(shader))
1352 {
1353 if(context->getProgram(shader))
1354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001355 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001356 }
1357 else
1358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001359 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001360 }
1361 }
1362
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001363 context->deleteShader(shader);
1364 }
1365 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001366 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001368 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001369 }
1370}
1371
1372void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1373{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001374 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001375
1376 try
1377 {
1378 if (n < 0)
1379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001380 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001381 }
1382
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001383 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001384
1385 if (context)
1386 {
1387 for (int i = 0; i < n; i++)
1388 {
1389 if (textures[i] != 0)
1390 {
1391 context->deleteTexture(textures[i]);
1392 }
1393 }
1394 }
1395 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001396 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001398 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001399 }
1400}
1401
1402void __stdcall glDepthFunc(GLenum func)
1403{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001404 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001405
1406 try
1407 {
1408 switch (func)
1409 {
1410 case GL_NEVER:
1411 case GL_ALWAYS:
1412 case GL_LESS:
1413 case GL_LEQUAL:
1414 case GL_EQUAL:
1415 case GL_GREATER:
1416 case GL_GEQUAL:
1417 case GL_NOTEQUAL:
1418 break;
1419 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001420 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001421 }
1422
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001423 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001424
1425 if (context)
1426 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001427 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001428 }
1429 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001430 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001432 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001433 }
1434}
1435
1436void __stdcall glDepthMask(GLboolean flag)
1437{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001438 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001439
1440 try
1441 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001442 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001443
1444 if (context)
1445 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001446 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001447 }
1448 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001449 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001450 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001451 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001452 }
1453}
1454
1455void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1456{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001457 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001458
1459 try
1460 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001461 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001462
1463 if (context)
1464 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001465 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001466 }
1467 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001468 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001470 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001471 }
1472}
1473
1474void __stdcall glDetachShader(GLuint program, GLuint shader)
1475{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001476 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001477
1478 try
1479 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001480 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001481
1482 if (context)
1483 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001484
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001485 gl::Program *programObject = context->getProgram(program);
1486 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001487
1488 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001489 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001490 gl::Shader *shaderByProgramHandle;
1491 shaderByProgramHandle = context->getShader(program);
1492 if (!shaderByProgramHandle)
1493 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001494 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001495 }
1496 else
1497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001498 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001499 }
1500 }
1501
1502 if (!shaderObject)
1503 {
1504 gl::Program *programByShaderHandle = context->getProgram(shader);
1505 if (!programByShaderHandle)
1506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001507 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001508 }
1509 else
1510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001511 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001512 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001513 }
1514
1515 if (!programObject->detachShader(shaderObject))
1516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001517 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001518 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001519 }
1520 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001521 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001523 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001524 }
1525}
1526
1527void __stdcall glDisable(GLenum cap)
1528{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001529 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001530
1531 try
1532 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001533 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001534
1535 if (context)
1536 {
Geoff Lang0550d032014-01-30 11:29:07 -05001537 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001539 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001540 }
Geoff Lang0550d032014-01-30 11:29:07 -05001541
1542 context->setCap(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001543 }
1544 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001545 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001547 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001548 }
1549}
1550
1551void __stdcall glDisableVertexAttribArray(GLuint index)
1552{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001553 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001554
1555 try
1556 {
1557 if (index >= gl::MAX_VERTEX_ATTRIBS)
1558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001559 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001560 }
1561
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001562 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001563
1564 if (context)
1565 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001566 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001567 }
1568 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001569 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001571 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001572 }
1573}
1574
1575void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1576{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001577 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001578
1579 try
1580 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001581 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001582
1583 if (context)
1584 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001585 if (!ValidateDrawArrays(context, mode, first, count))
Geoff Langeeba6e12014-02-03 13:12:30 -05001586 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001587 return;
Geoff Langeeba6e12014-02-03 13:12:30 -05001588 }
1589
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001590 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001591 }
1592 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001593 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001595 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001596 }
1597}
1598
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001599void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1600{
1601 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1602
1603 try
1604 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001605 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001606
Jamie Madill250d33f2014-06-06 17:09:03 -04001607 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001608 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001609 if (!ValidateDrawArraysInstanced(context, mode, first, count, primcount))
Jamie Madill7a5f7382014-03-05 15:01:24 -05001610 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001611 return;
Jamie Madill7a5f7382014-03-05 15:01:24 -05001612 }
1613
Jamie Madill250d33f2014-06-06 17:09:03 -04001614 context->drawArrays(mode, first, count, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001615 }
1616 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001617 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001619 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001620 }
1621}
1622
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001623void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001624{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001625 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 +00001626 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001627
1628 try
1629 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001630 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001631
1632 if (context)
1633 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001634 if (!ValidateDrawElements(context, mode, count, type, indices))
daniel@transgaming.com83921382011-01-08 05:46:00 +00001635 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001636 return;
Jamie Madill7a5f7382014-03-05 15:01:24 -05001637 }
1638
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001639 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001640 }
1641 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001642 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001644 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001645 }
1646}
1647
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001648void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1649{
1650 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1651 mode, count, type, indices, primcount);
1652
1653 try
1654 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001655 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001656
Jamie Madill250d33f2014-06-06 17:09:03 -04001657 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001658 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001659 if (!ValidateDrawElementsInstanced(context, mode, count, type, indices, primcount))
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001660 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001661 return;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001662 }
Jamie Madill250d33f2014-06-06 17:09:03 -04001663
1664 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001665 }
1666 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001667 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001669 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001670 }
1671}
1672
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001673void __stdcall glEnable(GLenum cap)
1674{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001675 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001676
1677 try
1678 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001679 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001680
1681 if (context)
1682 {
Geoff Lang0550d032014-01-30 11:29:07 -05001683 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001685 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001686 }
Geoff Lang0550d032014-01-30 11:29:07 -05001687
1688 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001689 }
1690 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001691 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001693 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001694 }
1695}
1696
1697void __stdcall glEnableVertexAttribArray(GLuint index)
1698{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001699 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001700
1701 try
1702 {
1703 if (index >= gl::MAX_VERTEX_ATTRIBS)
1704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001705 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001706 }
1707
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001708 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001709
1710 if (context)
1711 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001712 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001713 }
1714 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001715 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001717 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001718 }
1719}
1720
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001721void __stdcall glEndQueryEXT(GLenum target)
1722{
1723 EVENT("GLenum target = 0x%X)", target);
1724
1725 try
1726 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001727 gl::Context *context = gl::getNonLostContext();
1728
1729 if (context)
1730 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001731 if (!ValidateEndQuery(context, target))
Geoff Lang37dde692014-01-31 16:34:54 -05001732 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001733 return;
Geoff Lang37dde692014-01-31 16:34:54 -05001734 }
1735
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001736 context->endQuery(target);
1737 }
1738 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001739 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001741 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001742 }
1743}
1744
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001745void __stdcall glFinishFenceNV(GLuint fence)
1746{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001747 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001748
1749 try
1750 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001751 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001752
1753 if (context)
1754 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001755 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001756
1757 if (fenceObject == NULL)
1758 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001759 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001760 }
1761
Jamie Madillfb9a7402013-07-26 11:55:01 -04001762 if (fenceObject->isFence() != GL_TRUE)
1763 {
1764 return gl::error(GL_INVALID_OPERATION);
1765 }
1766
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001767 fenceObject->finishFence();
1768 }
1769 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001770 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001772 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001773 }
1774}
1775
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001776void __stdcall glFinish(void)
1777{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001778 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001779
1780 try
1781 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001782 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001783
1784 if (context)
1785 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001786 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001787 }
1788 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001789 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001791 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001792 }
1793}
1794
1795void __stdcall glFlush(void)
1796{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001797 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001798
1799 try
1800 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001801 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001802
1803 if (context)
1804 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001805 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001806 }
1807 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001808 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001810 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001811 }
1812}
1813
1814void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1815{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001816 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001817 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001818
1819 try
1820 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001821 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001823 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001824 }
1825
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001826 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001827
1828 if (context)
1829 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001830 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001831 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001832 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001833 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001834
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001835 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1836 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001837
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001838 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001839 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001840 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001841 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001842 }
1843 else
1844 {
1845 switch (attachment)
1846 {
1847 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001848 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001849 break;
1850 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001851 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001852 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001853 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001854 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1855 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001856 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001857 UNREACHABLE();
1858 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001859 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001860 }
1861 }
1862 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001863 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001865 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001866 }
1867}
1868
1869void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001871 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001872 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
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 if (context)
1878 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001879 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001880 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001881 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001882 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001883 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04001884
1885 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001886 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001887 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001888 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001889 }
1890
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001891 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001892 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001893 textarget = GL_NONE;
1894 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001895
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001896 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001897
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001898 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001899 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001900 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001901 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001902 }
1903 else
1904 {
1905 switch (attachment)
1906 {
Geoff Lang309c92a2013-07-25 16:23:19 -04001907 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
1908 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
1909 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001910 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001911 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001912 }
1913 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001914 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001916 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001917 }
1918}
1919
1920void __stdcall glFrontFace(GLenum mode)
1921{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001922 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001923
1924 try
1925 {
1926 switch (mode)
1927 {
1928 case GL_CW:
1929 case GL_CCW:
1930 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001931 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001932
1933 if (context)
1934 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001935 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001936 }
1937 }
1938 break;
1939 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001940 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001941 }
1942 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001943 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001945 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001946 }
1947}
1948
1949void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
1950{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001951 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001952
1953 try
1954 {
1955 if (n < 0)
1956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001957 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001958 }
1959
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001960 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001961
1962 if (context)
1963 {
1964 for (int i = 0; i < n; i++)
1965 {
1966 buffers[i] = context->createBuffer();
1967 }
1968 }
1969 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001970 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001972 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001973 }
1974}
1975
1976void __stdcall glGenerateMipmap(GLenum target)
1977{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001978 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001979
1980 try
1981 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001982 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001983
1984 if (context)
1985 {
Jamie Madill35d15012013-10-07 10:46:37 -04001986 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001988 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001989 }
Geoff Langae4852a2013-06-05 15:00:34 -04001990
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001991 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04001992
1993 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04001994 {
1995 return gl::error(GL_INVALID_OPERATION);
1996 }
1997
Geoff Lang005df412013-10-16 14:12:50 -04001998 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04001999
Geoff Langae4852a2013-06-05 15:00:34 -04002000 // Internally, all texture formats are sized so checking if the format
2001 // is color renderable and filterable will not fail.
Jamie Madill61b54432014-02-18 15:27:19 -05002002
Geoff Langcec35902014-04-16 10:52:36 -04002003 const gl::TextureCaps &formatCaps = context->getCaps().textureCaps.get(internalFormat);
2004
2005 bool validRenderable = (formatCaps.colorRendering ||
Jamie Madill61b54432014-02-18 15:27:19 -05002006 gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
2007
Geoff Langcec35902014-04-16 10:52:36 -04002008 if (formatCaps.depthRendering || gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
2009 !formatCaps.filtering || !validRenderable)
Geoff Langae4852a2013-06-05 15:00:34 -04002010 {
2011 return gl::error(GL_INVALID_OPERATION);
2012 }
2013
Jamie Madillc1f8b162013-10-07 10:46:38 -04002014 // Non-power of 2 ES2 check
Geoff Langcec35902014-04-16 10:52:36 -04002015 if (!context->getCaps().extensions.textureNPOT && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
Jamie Madillc1f8b162013-10-07 10:46:38 -04002016 {
2017 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2018 return gl::error(GL_INVALID_OPERATION);
2019 }
2020
2021 // Cube completeness check
2022 if (target == GL_TEXTURE_CUBE_MAP)
2023 {
2024 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2025 if (!textureCube->isCubeComplete())
2026 {
2027 return gl::error(GL_INVALID_OPERATION);
2028 }
2029 }
2030
Geoff Langae4852a2013-06-05 15:00:34 -04002031 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002032 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002033 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002034 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002036 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002037 }
2038}
2039
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002040void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2041{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002042 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002043
2044 try
2045 {
2046 if (n < 0)
2047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002048 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002049 }
2050
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002051 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002052
2053 if (context)
2054 {
2055 for (int i = 0; i < n; i++)
2056 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002057 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002058 }
2059 }
2060 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002061 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002063 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002064 }
2065}
2066
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002067void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2068{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002069 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002070
2071 try
2072 {
2073 if (n < 0)
2074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002075 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002076 }
2077
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002078 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002079
2080 if (context)
2081 {
2082 for (int i = 0; i < n; i++)
2083 {
2084 framebuffers[i] = context->createFramebuffer();
2085 }
2086 }
2087 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002088 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002090 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002091 }
2092}
2093
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002094void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2095{
2096 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2097
2098 try
2099 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002100 gl::Context *context = gl::getNonLostContext();
2101
2102 if (context)
2103 {
Geoff Lang37dde692014-01-31 16:34:54 -05002104 if (n < 0)
2105 {
2106 return gl::error(GL_INVALID_VALUE);
2107 }
2108
2109 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002110 {
2111 ids[i] = context->createQuery();
2112 }
2113 }
2114 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002115 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002116 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002117 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002118 }
2119}
2120
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002121void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2122{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002123 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002124
2125 try
2126 {
2127 if (n < 0)
2128 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002129 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002130 }
2131
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002132 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002133
2134 if (context)
2135 {
2136 for (int i = 0; i < n; i++)
2137 {
2138 renderbuffers[i] = context->createRenderbuffer();
2139 }
2140 }
2141 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002142 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002144 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002145 }
2146}
2147
2148void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2149{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002150 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002151
2152 try
2153 {
2154 if (n < 0)
2155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002156 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002157 }
2158
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002159 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002160
2161 if (context)
2162 {
2163 for (int i = 0; i < n; i++)
2164 {
2165 textures[i] = context->createTexture();
2166 }
2167 }
2168 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002169 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002171 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002172 }
2173}
2174
daniel@transgaming.com85423182010-04-22 13:35:27 +00002175void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002176{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002177 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002178 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002179 program, index, bufsize, length, size, type, name);
2180
2181 try
2182 {
2183 if (bufsize < 0)
2184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002185 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002186 }
2187
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002188 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002189
2190 if (context)
2191 {
2192 gl::Program *programObject = context->getProgram(program);
2193
2194 if (!programObject)
2195 {
2196 if (context->getShader(program))
2197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002198 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002199 }
2200 else
2201 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002202 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002203 }
2204 }
2205
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002206 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002208 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002209 }
2210
2211 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2212 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002213 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002214 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002216 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002217 }
2218}
2219
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002220void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002221{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002222 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002223 "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 +00002224 program, index, bufsize, length, size, type, name);
2225
2226 try
2227 {
2228 if (bufsize < 0)
2229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002230 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002231 }
2232
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002233 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002234
2235 if (context)
2236 {
2237 gl::Program *programObject = context->getProgram(program);
2238
2239 if (!programObject)
2240 {
2241 if (context->getShader(program))
2242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002243 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002244 }
2245 else
2246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002247 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002248 }
2249 }
2250
2251 if (index >= (GLuint)programObject->getActiveUniformCount())
2252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002253 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002254 }
2255
2256 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2257 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002258 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002259 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002260 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002261 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002262 }
2263}
2264
2265void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2266{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002267 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 +00002268 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002269
2270 try
2271 {
2272 if (maxcount < 0)
2273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002274 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002275 }
2276
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002277 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002278
2279 if (context)
2280 {
2281 gl::Program *programObject = context->getProgram(program);
2282
2283 if (!programObject)
2284 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002285 if (context->getShader(program))
2286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002287 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002288 }
2289 else
2290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002291 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002292 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002293 }
2294
2295 return programObject->getAttachedShaders(maxcount, count, shaders);
2296 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002297 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002298 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002300 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002301 }
2302}
2303
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002304int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002305{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002306 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002307
2308 try
2309 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002310 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002311
2312 if (context)
2313 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002314
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002315 gl::Program *programObject = context->getProgram(program);
2316
2317 if (!programObject)
2318 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002319 if (context->getShader(program))
2320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002321 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002322 }
2323 else
2324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002325 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002326 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002327 }
2328
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002329 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002330 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002332 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002333 }
2334
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002335 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002336 }
2337 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002338 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002340 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002341 }
2342
2343 return -1;
2344}
2345
2346void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2347{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002348 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002349
2350 try
2351 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002352 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002353
2354 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002355 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002356 GLenum nativeType;
2357 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002358 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2359 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002360 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002361 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002362
2363 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002364 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002365 context->getBooleanv(pname, params);
2366 }
Jamie Madill55856b12014-01-02 13:59:50 -05002367 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002368 {
Jamie Madill55856b12014-01-02 13:59:50 -05002369 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002370 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002371 }
2372 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002373 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002375 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002376 }
2377}
2378
2379void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2380{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002381 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 +00002382
2383 try
2384 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002385 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002386
2387 if (context)
2388 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002389 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002390 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002391 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002392 }
2393
Jamie Madill70656a62014-03-05 15:01:26 -05002394 if (!gl::ValidBufferParameter(context, pname))
2395 {
2396 return gl::error(GL_INVALID_ENUM);
2397 }
2398
Jamie Madill8c96d582014-03-05 15:01:23 -05002399 gl::Buffer *buffer = context->getTargetBuffer(target);
2400
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002401 if (!buffer)
2402 {
2403 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002404 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002405 }
2406
2407 switch (pname)
2408 {
2409 case GL_BUFFER_USAGE:
Jamie Madill70656a62014-03-05 15:01:26 -05002410 *params = static_cast<GLint>(buffer->usage());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002411 break;
2412 case GL_BUFFER_SIZE:
Jamie Madill70656a62014-03-05 15:01:26 -05002413 *params = gl::clampCast<GLint>(buffer->size());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002414 break;
Jamie Madill70656a62014-03-05 15:01:26 -05002415 case GL_BUFFER_ACCESS_FLAGS:
2416 *params = buffer->accessFlags();
2417 break;
2418 case GL_BUFFER_MAPPED:
2419 *params = static_cast<GLint>(buffer->mapped());
2420 break;
2421 case GL_BUFFER_MAP_OFFSET:
2422 *params = gl::clampCast<GLint>(buffer->mapOffset());
2423 break;
2424 case GL_BUFFER_MAP_LENGTH:
2425 *params = gl::clampCast<GLint>(buffer->mapLength());
2426 break;
2427 default: UNREACHABLE(); break;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002428 }
2429 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002431 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002433 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002434 }
2435}
2436
2437GLenum __stdcall glGetError(void)
2438{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002439 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002440
2441 gl::Context *context = gl::getContext();
2442
2443 if (context)
2444 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002445 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002446 }
2447
2448 return GL_NO_ERROR;
2449}
2450
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002451void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2452{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002453 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002454
2455 try
2456 {
2457
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002458 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002459
2460 if (context)
2461 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002462 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002463
2464 if (fenceObject == NULL)
2465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002466 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002467 }
2468
Jamie Madillfb9a7402013-07-26 11:55:01 -04002469 if (fenceObject->isFence() != GL_TRUE)
2470 {
2471 return gl::error(GL_INVALID_OPERATION);
2472 }
2473
2474 switch (pname)
2475 {
2476 case GL_FENCE_STATUS_NV:
2477 case GL_FENCE_CONDITION_NV:
2478 break;
2479
2480 default: return gl::error(GL_INVALID_ENUM);
2481 }
2482
2483 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002484 }
2485 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002486 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002488 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002489 }
2490}
2491
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002492void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2493{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002494 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002495
2496 try
2497 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002498 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002499
2500 if (context)
2501 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002502 GLenum nativeType;
2503 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002504 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2505 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002506 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002507 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002508
2509 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002510 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002511 context->getFloatv(pname, params);
2512 }
Jamie Madill55856b12014-01-02 13:59:50 -05002513 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002514 {
Jamie Madill55856b12014-01-02 13:59:50 -05002515 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002516 }
2517 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002518 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002519 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002521 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002522 }
2523}
2524
2525void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2526{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002527 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 +00002528 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002529
2530 try
2531 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002532 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002533
2534 if (context)
2535 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002536 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002538 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002539 }
2540
Jamie Madill1e3fa742014-06-16 10:34:00 -04002541 int clientVersion = context->getClientVersion();
2542
Geoff Lang646559f2013-08-15 11:08:15 -04002543 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002544 {
Geoff Lang646559f2013-08-15 11:08:15 -04002545 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2546 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2547 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2548 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2549 break;
2550 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2551 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2552 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2553 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2554 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2555 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2556 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2557 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2558 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002559 if (clientVersion >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002560 {
Geoff Lang646559f2013-08-15 11:08:15 -04002561 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002562 }
Geoff Lang646559f2013-08-15 11:08:15 -04002563 default:
2564 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002565 }
Geoff Lang646559f2013-08-15 11:08:15 -04002566
2567 // Determine if the attachment is a valid enum
2568 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002569 {
Geoff Lang646559f2013-08-15 11:08:15 -04002570 case GL_BACK:
2571 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002572 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002573 case GL_STENCIL:
2574 case GL_DEPTH_STENCIL_ATTACHMENT:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002575 if (clientVersion < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002576 {
Geoff Lang646559f2013-08-15 11:08:15 -04002577 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002578 }
Geoff Lang646559f2013-08-15 11:08:15 -04002579 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002580
Geoff Lang646559f2013-08-15 11:08:15 -04002581 case GL_DEPTH_ATTACHMENT:
2582 case GL_STENCIL_ATTACHMENT:
2583 break;
2584
2585 default:
2586 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2587 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2588 {
2589 return gl::error(GL_INVALID_ENUM);
2590 }
2591 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002592 }
2593
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002594 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2595 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002596 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2597
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002598 GLenum attachmentType;
2599 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002600 GLuint attachmentLevel;
2601 GLuint attachmentLayer;
Jamie Madill3c7fa222014-06-05 13:08:51 -04002602 gl::FramebufferAttachment *attachmentObject;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002603
Jamie Madill3c7fa222014-06-05 13:08:51 -04002604 if (framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002605 {
Jamie Madill1e3fa742014-06-16 10:34:00 -04002606 if (clientVersion < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002607 {
Geoff Lang646559f2013-08-15 11:08:15 -04002608 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002609 }
2610
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002611 switch (attachment)
2612 {
Geoff Lang646559f2013-08-15 11:08:15 -04002613 case GL_BACK:
2614 attachmentType = framebuffer->getColorbufferType(0);
2615 attachmentHandle = framebuffer->getColorbufferHandle(0);
2616 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2617 attachmentLayer = framebuffer->getColorbufferLayer(0);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002618 attachmentObject = framebuffer->getColorbuffer(0);
Geoff Lang646559f2013-08-15 11:08:15 -04002619 break;
2620 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002621 attachmentType = framebuffer->getDepthbufferType();
2622 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002623 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2624 attachmentLayer = framebuffer->getDepthbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002625 attachmentObject = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002626 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002627 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002628 attachmentType = framebuffer->getStencilbufferType();
2629 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002630 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2631 attachmentLayer = framebuffer->getStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002632 attachmentObject = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002633 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002634 default:
2635 return gl::error(GL_INVALID_OPERATION);
2636 }
2637 }
2638 else
2639 {
2640 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2641 {
2642 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2643 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2644 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2645 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2646 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002647 attachmentObject = framebuffer->getColorbuffer(colorAttachment);
Geoff Lang646559f2013-08-15 11:08:15 -04002648 }
2649 else
2650 {
2651 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002652 {
Geoff Lang646559f2013-08-15 11:08:15 -04002653 case GL_DEPTH_ATTACHMENT:
2654 attachmentType = framebuffer->getDepthbufferType();
2655 attachmentHandle = framebuffer->getDepthbufferHandle();
2656 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2657 attachmentLayer = framebuffer->getDepthbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002658 attachmentObject = framebuffer->getDepthbuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002659 break;
2660 case GL_STENCIL_ATTACHMENT:
2661 attachmentType = framebuffer->getStencilbufferType();
2662 attachmentHandle = framebuffer->getStencilbufferHandle();
2663 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2664 attachmentLayer = framebuffer->getStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002665 attachmentObject = framebuffer->getStencilbuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002666 break;
2667 case GL_DEPTH_STENCIL_ATTACHMENT:
2668 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2669 {
2670 return gl::error(GL_INVALID_OPERATION);
2671 }
2672 attachmentType = framebuffer->getDepthStencilbufferType();
2673 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2674 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2675 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002676 attachmentObject = framebuffer->getDepthStencilBuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002677 break;
2678 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002679 return gl::error(GL_INVALID_OPERATION);
2680 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002681 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002682 }
2683
2684 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002685 if (framebufferHandle == 0)
2686 {
2687 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2688 }
2689 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002690 {
2691 attachmentObjectType = attachmentType;
2692 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002693 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002694 {
2695 attachmentObjectType = GL_TEXTURE;
2696 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002697 else
2698 {
2699 UNREACHABLE();
2700 return;
2701 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002702
Geoff Lang646559f2013-08-15 11:08:15 -04002703 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002704 {
Geoff Lang646559f2013-08-15 11:08:15 -04002705 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2706 // is NONE, then querying any other pname will generate INVALID_ENUM.
2707
2708 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2709 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2710 // INVALID_OPERATION for all other pnames
2711
2712 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002713 {
Geoff Lang646559f2013-08-15 11:08:15 -04002714 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2715 *params = attachmentObjectType;
2716 break;
2717
2718 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002719 if (clientVersion < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002720 {
Geoff Lang646559f2013-08-15 11:08:15 -04002721 return gl::error(GL_INVALID_ENUM);
2722 }
2723 *params = 0;
2724 break;
2725
2726 default:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002727 if (clientVersion < 3)
Geoff Lang646559f2013-08-15 11:08:15 -04002728 {
2729 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002730 }
2731 else
2732 {
Geoff Lang646559f2013-08-15 11:08:15 -04002733 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002734 }
2735 }
Geoff Lang646559f2013-08-15 11:08:15 -04002736 }
2737 else
2738 {
2739 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2740 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002741 ASSERT(attachmentObject != NULL);
Geoff Lang646559f2013-08-15 11:08:15 -04002742
2743 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002744 {
Geoff Lang646559f2013-08-15 11:08:15 -04002745 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2746 *params = attachmentObjectType;
2747 break;
2748
2749 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2750 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2751 {
2752 return gl::error(GL_INVALID_ENUM);
2753 }
2754 *params = attachmentHandle;
2755 break;
2756
2757 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2758 if (attachmentObjectType != GL_TEXTURE)
2759 {
2760 return gl::error(GL_INVALID_ENUM);
2761 }
2762 *params = attachmentLevel;
2763 break;
2764
2765 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2766 if (attachmentObjectType != GL_TEXTURE)
2767 {
2768 return gl::error(GL_INVALID_ENUM);
2769 }
2770 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2771 break;
2772
2773 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002774 *params = attachmentObject->getRedSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002775 break;
2776
2777 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002778 *params = attachmentObject->getGreenSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002779 break;
2780
2781 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002782 *params = attachmentObject->getBlueSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002783 break;
2784
2785 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002786 *params = attachmentObject->getAlphaSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002787 break;
2788
2789 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002790 *params = attachmentObject->getDepthSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002791 break;
2792
2793 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002794 *params = attachmentObject->getStencilSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002795 break;
2796
2797 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2798 if (attachment == GL_DEPTH_STENCIL)
2799 {
2800 gl::error(GL_INVALID_OPERATION);
2801 }
Jamie Madill1e3fa742014-06-16 10:34:00 -04002802 *params = attachmentObject->getComponentType(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002803 break;
2804
2805 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002806 *params = attachmentObject->getColorEncoding(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002807 break;
2808
2809 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2810 if (attachmentObjectType != GL_TEXTURE)
2811 {
2812 return gl::error(GL_INVALID_ENUM);
2813 }
2814 *params = attachmentLayer;
2815 break;
2816
2817 default:
2818 UNREACHABLE();
2819 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002820 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002821 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002822 }
2823 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002824 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002826 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002827 }
2828}
2829
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002830GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2831{
2832 EVENT("()");
2833
2834 try
2835 {
2836 gl::Context *context = gl::getContext();
2837
2838 if (context)
2839 {
2840 return context->getResetStatus();
2841 }
2842
2843 return GL_NO_ERROR;
2844 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002845 catch (...)
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002846 {
2847 return GL_OUT_OF_MEMORY;
2848 }
2849}
2850
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002851void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2852{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002853 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002854
2855 try
2856 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002857 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002858
2859 if (context)
2860 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002861 GLenum nativeType;
2862 unsigned int numParams = 0;
Jamie Madill79f2f452013-12-19 11:13:02 -05002863
Jamie Madill893ab082014-05-16 16:56:10 -04002864 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2865 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002866 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002867 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002868
2869 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002870 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002871 context->getIntegerv(pname, params);
2872 }
Jamie Madill55856b12014-01-02 13:59:50 -05002873 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002874 {
Jamie Madill55856b12014-01-02 13:59:50 -05002875 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002876 }
2877 }
2878 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002879 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002880 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002881 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002882 }
2883}
2884
2885void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2886{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002887 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002888
2889 try
2890 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002891 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002892
2893 if (context)
2894 {
2895 gl::Program *programObject = context->getProgram(program);
2896
2897 if (!programObject)
2898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002899 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002900 }
2901
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002902 if (context->getClientVersion() < 3)
2903 {
2904 switch (pname)
2905 {
2906 case GL_ACTIVE_UNIFORM_BLOCKS:
2907 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002908 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2909 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2910 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002911 return gl::error(GL_INVALID_ENUM);
2912 }
2913 }
2914
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002915 switch (pname)
2916 {
2917 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002918 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002919 return;
2920 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002921 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002922 return;
2923 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00002924 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002925 return;
2926 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002927 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002928 return;
2929 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002930 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002931 return;
2932 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002933 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002934 return;
2935 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002936 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002937 return;
2938 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002939 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002940 return;
2941 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002942 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002943 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00002944 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00002945 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00002946 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002947 case GL_ACTIVE_UNIFORM_BLOCKS:
2948 *params = programObject->getActiveUniformBlockCount();
2949 return;
2950 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
2951 *params = programObject->getActiveUniformBlockMaxLength();
2952 break;
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002953 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2954 *params = programObject->getTransformFeedbackBufferMode();
2955 break;
2956 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2957 *params = programObject->getTransformFeedbackVaryingCount();
2958 break;
2959 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
2960 *params = programObject->getTransformFeedbackVaryingMaxLength();
2961 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002962 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002963 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002964 }
2965 }
2966 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002967 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002969 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002970 }
2971}
2972
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002973void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002974{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002975 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 +00002976 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002977
2978 try
2979 {
2980 if (bufsize < 0)
2981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002982 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002983 }
2984
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002985 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002986
2987 if (context)
2988 {
2989 gl::Program *programObject = context->getProgram(program);
2990
2991 if (!programObject)
2992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002993 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002994 }
2995
2996 programObject->getInfoLog(bufsize, length, infolog);
2997 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002998 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002999 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003001 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003002 }
3003}
3004
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003005void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3006{
3007 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3008
3009 try
3010 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003011 gl::Context *context = gl::getNonLostContext();
3012
3013 if (context)
3014 {
Geoff Lang37dde692014-01-31 16:34:54 -05003015 if (!ValidQueryType(context, target))
3016 {
3017 return gl::error(GL_INVALID_ENUM);
3018 }
3019
3020 switch (pname)
3021 {
3022 case GL_CURRENT_QUERY_EXT:
Jamie Madill45c785d2014-05-13 14:09:34 -04003023 params[0] = context->getActiveQueryId(target);
Geoff Lang37dde692014-01-31 16:34:54 -05003024 break;
3025
3026 default:
3027 return gl::error(GL_INVALID_ENUM);
3028 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003029 }
3030 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003031 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003033 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003034 }
3035}
3036
3037void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3038{
3039 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3040
3041 try
3042 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003043 gl::Context *context = gl::getNonLostContext();
3044
3045 if (context)
3046 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003047 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3048
3049 if (!queryObject)
3050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003051 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003052 }
3053
Jamie Madill45c785d2014-05-13 14:09:34 -04003054 if (context->getActiveQueryId(queryObject->getType()) == id)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003056 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003057 }
3058
3059 switch(pname)
3060 {
3061 case GL_QUERY_RESULT_EXT:
3062 params[0] = queryObject->getResult();
3063 break;
3064 case GL_QUERY_RESULT_AVAILABLE_EXT:
3065 params[0] = queryObject->isResultAvailable();
3066 break;
3067 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003068 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003069 }
3070 }
3071 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003072 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003074 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003075 }
3076}
3077
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003078void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3079{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003080 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 +00003081
3082 try
3083 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003084 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003085
3086 if (context)
3087 {
3088 if (target != GL_RENDERBUFFER)
3089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003090 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003091 }
3092
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003093 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003095 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003096 }
3097
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003098 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003099
3100 switch (pname)
3101 {
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003102 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3103 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3104 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3105 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3106 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3107 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3108 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3109 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3110 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003111 case GL_RENDERBUFFER_SAMPLES_ANGLE:
Geoff Langcec35902014-04-16 10:52:36 -04003112 if (!context->getCaps().extensions.framebufferMultisample)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003114 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003115 }
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003116 *params = renderbuffer->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003117 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003118 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003119 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003120 }
3121 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003122 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003123 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003125 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003126 }
3127}
3128
3129void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3130{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003131 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003132
3133 try
3134 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003135 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003136
3137 if (context)
3138 {
3139 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003140
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003141 if (!shaderObject)
3142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003143 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003144 }
3145
3146 switch (pname)
3147 {
3148 case GL_SHADER_TYPE:
3149 *params = shaderObject->getType();
3150 return;
3151 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003152 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003153 return;
3154 case GL_COMPILE_STATUS:
3155 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3156 return;
3157 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003158 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003159 return;
3160 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003161 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003162 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003163 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3164 *params = shaderObject->getTranslatedSourceLength();
3165 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003166 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003167 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003168 }
3169 }
3170 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003171 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003173 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003174 }
3175}
3176
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003177void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003178{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003179 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 +00003180 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003181
3182 try
3183 {
3184 if (bufsize < 0)
3185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003186 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003187 }
3188
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003189 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003190
3191 if (context)
3192 {
3193 gl::Shader *shaderObject = context->getShader(shader);
3194
3195 if (!shaderObject)
3196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003197 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003198 }
3199
3200 shaderObject->getInfoLog(bufsize, length, infolog);
3201 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003202 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003203 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003205 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003206 }
3207}
3208
3209void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3210{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003211 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 +00003212 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003213
3214 try
3215 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003216 switch (shadertype)
3217 {
3218 case GL_VERTEX_SHADER:
3219 case GL_FRAGMENT_SHADER:
3220 break;
3221 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003222 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003223 }
3224
3225 switch (precisiontype)
3226 {
3227 case GL_LOW_FLOAT:
3228 case GL_MEDIUM_FLOAT:
3229 case GL_HIGH_FLOAT:
3230 // Assume IEEE 754 precision
3231 range[0] = 127;
3232 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003233 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003234 break;
3235 case GL_LOW_INT:
3236 case GL_MEDIUM_INT:
3237 case GL_HIGH_INT:
3238 // Some (most) hardware only supports single-precision floating-point numbers,
3239 // which can accurately represent integers up to +/-16777216
3240 range[0] = 24;
3241 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003242 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003243 break;
3244 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003245 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003246 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003247 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003248 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003250 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003251 }
3252}
3253
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003254void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003255{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003256 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 +00003257 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003258
3259 try
3260 {
3261 if (bufsize < 0)
3262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003263 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003264 }
3265
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003266 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003267
3268 if (context)
3269 {
3270 gl::Shader *shaderObject = context->getShader(shader);
3271
3272 if (!shaderObject)
3273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003274 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003275 }
3276
3277 shaderObject->getSource(bufsize, length, source);
3278 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003279 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003280 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003282 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003283 }
3284}
3285
zmo@google.coma574f782011-10-03 21:45:23 +00003286void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3287{
3288 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3289 shader, bufsize, length, source);
3290
3291 try
3292 {
3293 if (bufsize < 0)
3294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003295 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003296 }
3297
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003298 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003299
3300 if (context)
3301 {
3302 gl::Shader *shaderObject = context->getShader(shader);
3303
3304 if (!shaderObject)
3305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003306 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003307 }
3308
3309 shaderObject->getTranslatedSource(bufsize, length, source);
3310 }
3311 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003312 catch (...)
zmo@google.coma574f782011-10-03 21:45:23 +00003313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003314 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003315 }
3316}
3317
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003318const GLubyte* __stdcall glGetString(GLenum name)
3319{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003320 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003321
3322 try
3323 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003324 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003325
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003326 switch (name)
3327 {
3328 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003329 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003330 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003331 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003332 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003333 if (context->getClientVersion() == 2)
3334 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003335 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003336 }
3337 else
3338 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003339 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003340 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003341 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003342 if (context->getClientVersion() == 2)
3343 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003344 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003345 }
3346 else
3347 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003348 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003349 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003350 case GL_EXTENSIONS:
Geoff Langcec35902014-04-16 10:52:36 -04003351 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003352 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003353 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003354 }
3355 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003356 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003358 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003359 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003360}
3361
3362void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3363{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003364 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 +00003365
3366 try
3367 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003368 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003369
3370 if (context)
3371 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003372 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003373
Jamie Madillfb8a8302013-07-03 14:24:12 -04003374 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003376 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003377 }
3378
3379 switch (pname)
3380 {
3381 case GL_TEXTURE_MAG_FILTER:
3382 *params = (GLfloat)texture->getMagFilter();
3383 break;
3384 case GL_TEXTURE_MIN_FILTER:
3385 *params = (GLfloat)texture->getMinFilter();
3386 break;
3387 case GL_TEXTURE_WRAP_S:
3388 *params = (GLfloat)texture->getWrapS();
3389 break;
3390 case GL_TEXTURE_WRAP_T:
3391 *params = (GLfloat)texture->getWrapT();
3392 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003393 case GL_TEXTURE_WRAP_R:
3394 if (context->getClientVersion() < 3)
3395 {
3396 return gl::error(GL_INVALID_ENUM);
3397 }
3398 *params = (GLfloat)texture->getWrapR();
3399 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003400 case GL_TEXTURE_IMMUTABLE_FORMAT:
3401 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003402 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3403 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003404 case GL_TEXTURE_IMMUTABLE_LEVELS:
3405 if (context->getClientVersion() < 3)
3406 {
3407 return gl::error(GL_INVALID_ENUM);
3408 }
Jamie Madill51a94372013-10-24 17:49:43 -04003409 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003410 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003411 case GL_TEXTURE_USAGE_ANGLE:
3412 *params = (GLfloat)texture->getUsage();
3413 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003414 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langcec35902014-04-16 10:52:36 -04003415 if (!context->getCaps().extensions.textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003417 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003418 }
3419 *params = (GLfloat)texture->getMaxAnisotropy();
3420 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003421 case GL_TEXTURE_SWIZZLE_R:
3422 if (context->getClientVersion() < 3)
3423 {
3424 return gl::error(GL_INVALID_ENUM);
3425 }
3426 *params = (GLfloat)texture->getSwizzleRed();
3427 break;
3428 case GL_TEXTURE_SWIZZLE_G:
3429 if (context->getClientVersion() < 3)
3430 {
3431 return gl::error(GL_INVALID_ENUM);
3432 }
3433 *params = (GLfloat)texture->getSwizzleGreen();
3434 break;
3435 case GL_TEXTURE_SWIZZLE_B:
3436 if (context->getClientVersion() < 3)
3437 {
3438 return gl::error(GL_INVALID_ENUM);
3439 }
3440 *params = (GLfloat)texture->getSwizzleBlue();
3441 break;
3442 case GL_TEXTURE_SWIZZLE_A:
3443 if (context->getClientVersion() < 3)
3444 {
3445 return gl::error(GL_INVALID_ENUM);
3446 }
3447 *params = (GLfloat)texture->getSwizzleAlpha();
3448 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003449 case GL_TEXTURE_BASE_LEVEL:
3450 if (context->getClientVersion() < 3)
3451 {
3452 return gl::error(GL_INVALID_ENUM);
3453 }
3454 *params = (GLfloat)texture->getBaseLevel();
3455 break;
3456 case GL_TEXTURE_MAX_LEVEL:
3457 if (context->getClientVersion() < 3)
3458 {
3459 return gl::error(GL_INVALID_ENUM);
3460 }
3461 *params = (GLfloat)texture->getMaxLevel();
3462 break;
3463 case GL_TEXTURE_MIN_LOD:
3464 if (context->getClientVersion() < 3)
3465 {
3466 return gl::error(GL_INVALID_ENUM);
3467 }
3468 *params = texture->getMinLod();
3469 break;
3470 case GL_TEXTURE_MAX_LOD:
3471 if (context->getClientVersion() < 3)
3472 {
3473 return gl::error(GL_INVALID_ENUM);
3474 }
3475 *params = texture->getMaxLod();
3476 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003477 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003478 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003479 }
3480 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003481 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003482 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003484 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003485 }
3486}
3487
3488void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3489{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003490 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 +00003491
3492 try
3493 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003494 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003495
3496 if (context)
3497 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003498 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003499
Jamie Madillfb8a8302013-07-03 14:24:12 -04003500 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003502 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003503 }
3504
3505 switch (pname)
3506 {
3507 case GL_TEXTURE_MAG_FILTER:
3508 *params = texture->getMagFilter();
3509 break;
3510 case GL_TEXTURE_MIN_FILTER:
3511 *params = texture->getMinFilter();
3512 break;
3513 case GL_TEXTURE_WRAP_S:
3514 *params = texture->getWrapS();
3515 break;
3516 case GL_TEXTURE_WRAP_T:
3517 *params = texture->getWrapT();
3518 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003519 case GL_TEXTURE_WRAP_R:
3520 if (context->getClientVersion() < 3)
3521 {
3522 return gl::error(GL_INVALID_ENUM);
3523 }
3524 *params = texture->getWrapR();
3525 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003526 case GL_TEXTURE_IMMUTABLE_FORMAT:
3527 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003528 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3529 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003530 case GL_TEXTURE_IMMUTABLE_LEVELS:
3531 if (context->getClientVersion() < 3)
3532 {
3533 return gl::error(GL_INVALID_ENUM);
3534 }
Jamie Madill51a94372013-10-24 17:49:43 -04003535 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003536 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003537 case GL_TEXTURE_USAGE_ANGLE:
3538 *params = texture->getUsage();
3539 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003540 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langcec35902014-04-16 10:52:36 -04003541 if (!context->getCaps().extensions.textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003543 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003544 }
3545 *params = (GLint)texture->getMaxAnisotropy();
3546 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003547 case GL_TEXTURE_SWIZZLE_R:
3548 if (context->getClientVersion() < 3)
3549 {
3550 return gl::error(GL_INVALID_ENUM);
3551 }
3552 *params = texture->getSwizzleRed();
3553 break;
3554 case GL_TEXTURE_SWIZZLE_G:
3555 if (context->getClientVersion() < 3)
3556 {
3557 return gl::error(GL_INVALID_ENUM);
3558 }
3559 *params = texture->getSwizzleGreen();
3560 break;
3561 case GL_TEXTURE_SWIZZLE_B:
3562 if (context->getClientVersion() < 3)
3563 {
3564 return gl::error(GL_INVALID_ENUM);
3565 }
3566 *params = texture->getSwizzleBlue();
3567 break;
3568 case GL_TEXTURE_SWIZZLE_A:
3569 if (context->getClientVersion() < 3)
3570 {
3571 return gl::error(GL_INVALID_ENUM);
3572 }
3573 *params = texture->getSwizzleAlpha();
3574 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003575 case GL_TEXTURE_BASE_LEVEL:
3576 if (context->getClientVersion() < 3)
3577 {
3578 return gl::error(GL_INVALID_ENUM);
3579 }
3580 *params = texture->getBaseLevel();
3581 break;
3582 case GL_TEXTURE_MAX_LEVEL:
3583 if (context->getClientVersion() < 3)
3584 {
3585 return gl::error(GL_INVALID_ENUM);
3586 }
3587 *params = texture->getMaxLevel();
3588 break;
3589 case GL_TEXTURE_MIN_LOD:
3590 if (context->getClientVersion() < 3)
3591 {
3592 return gl::error(GL_INVALID_ENUM);
3593 }
3594 *params = (GLint)texture->getMinLod();
3595 break;
3596 case GL_TEXTURE_MAX_LOD:
3597 if (context->getClientVersion() < 3)
3598 {
3599 return gl::error(GL_INVALID_ENUM);
3600 }
3601 *params = (GLint)texture->getMaxLod();
3602 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003603 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003604 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003605 }
3606 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003607 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003608 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003610 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003611 }
3612}
3613
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003614void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3615{
3616 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3617 program, location, bufSize, params);
3618
3619 try
3620 {
3621 if (bufSize < 0)
3622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003623 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003624 }
3625
3626 gl::Context *context = gl::getNonLostContext();
3627
3628 if (context)
3629 {
3630 if (program == 0)
3631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003632 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003633 }
3634
3635 gl::Program *programObject = context->getProgram(program);
3636
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003637 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003640 }
3641
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003642 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3643 if (!programBinary)
3644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003645 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003646 }
3647
3648 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003650 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003651 }
3652 }
3653 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003654 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003656 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003657 }
3658}
3659
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003660void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3661{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003662 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003663
3664 try
3665 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003666 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003667
3668 if (context)
3669 {
3670 if (program == 0)
3671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003672 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003673 }
3674
3675 gl::Program *programObject = context->getProgram(program);
3676
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003677 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003679 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003680 }
3681
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003682 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3683 if (!programBinary)
3684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003685 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003686 }
3687
3688 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003690 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003691 }
3692 }
3693 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003694 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003695 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003696 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003697 }
3698}
3699
3700void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3701{
3702 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3703 program, location, bufSize, params);
3704
3705 try
3706 {
3707 if (bufSize < 0)
3708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003709 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003710 }
3711
3712 gl::Context *context = gl::getNonLostContext();
3713
3714 if (context)
3715 {
3716 if (program == 0)
3717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003718 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003719 }
3720
3721 gl::Program *programObject = context->getProgram(program);
3722
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003723 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003725 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003726 }
3727
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003728 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3729 if (!programBinary)
3730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003731 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003732 }
3733
3734 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003736 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003737 }
3738 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003739 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003740 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003742 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003743 }
3744}
3745
3746void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3747{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003748 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003749
3750 try
3751 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003752 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003753
3754 if (context)
3755 {
3756 if (program == 0)
3757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003758 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003759 }
3760
3761 gl::Program *programObject = context->getProgram(program);
3762
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003763 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003765 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003766 }
3767
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003768 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3769 if (!programBinary)
3770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003771 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003772 }
3773
3774 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003776 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003777 }
3778 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003779 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003780 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003781 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003782 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003783 }
3784}
3785
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003786int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003787{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003788 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003789
3790 try
3791 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003792 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003793
3794 if (strstr(name, "gl_") == name)
3795 {
3796 return -1;
3797 }
3798
3799 if (context)
3800 {
3801 gl::Program *programObject = context->getProgram(program);
3802
3803 if (!programObject)
3804 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003805 if (context->getShader(program))
3806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003807 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003808 }
3809 else
3810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003811 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003812 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003813 }
3814
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003815 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003816 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003818 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003819 }
3820
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003821 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003822 }
3823 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003824 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003826 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003827 }
3828
3829 return -1;
3830}
3831
3832void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3833{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003834 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003835
3836 try
3837 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003838 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003839
daniel@transgaming.come0078962010-04-15 20:45:08 +00003840 if (context)
3841 {
3842 if (index >= gl::MAX_VERTEX_ATTRIBS)
3843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003844 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003845 }
3846
daniel@transgaming.com83921382011-01-08 05:46:00 +00003847 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003848
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003849 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003850 {
Jamie Madillaff71502013-07-02 11:57:05 -04003851 return;
3852 }
3853
3854 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3855 {
3856 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3857 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003858 {
Jamie Madillaff71502013-07-02 11:57:05 -04003859 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003860 }
Jamie Madillaff71502013-07-02 11:57:05 -04003861 }
3862 else
3863 {
Brandon Jones5bf98292014-06-06 17:19:38 -07003864 *params = gl::QuerySingleVertexAttributeParameter<GLfloat>(attribState, pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003865 }
3866 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003867 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003868 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003870 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003871 }
3872}
3873
3874void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3875{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003876 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003877
3878 try
3879 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003880 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003881
daniel@transgaming.come0078962010-04-15 20:45:08 +00003882 if (context)
3883 {
3884 if (index >= gl::MAX_VERTEX_ATTRIBS)
3885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003886 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003887 }
3888
daniel@transgaming.com83921382011-01-08 05:46:00 +00003889 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003890
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003891 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003892 {
Jamie Madillaff71502013-07-02 11:57:05 -04003893 return;
3894 }
3895
3896 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3897 {
3898 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3899 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003900 {
Jamie Madillaff71502013-07-02 11:57:05 -04003901 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003902 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003903 }
Jamie Madillaff71502013-07-02 11:57:05 -04003904 }
3905 else
3906 {
Brandon Jones5bf98292014-06-06 17:19:38 -07003907 *params = gl::QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003908 }
3909 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003910 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003911 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003912 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003913 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003914 }
3915}
3916
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003917void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003918{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003919 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003920
3921 try
3922 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003923 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003924
daniel@transgaming.come0078962010-04-15 20:45:08 +00003925 if (context)
3926 {
3927 if (index >= gl::MAX_VERTEX_ATTRIBS)
3928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003929 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003930 }
3931
3932 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003934 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003935 }
3936
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003937 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003938 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003939 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003940 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003942 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003943 }
3944}
3945
3946void __stdcall glHint(GLenum target, GLenum mode)
3947{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003948 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003949
3950 try
3951 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003952 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003953 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003954 case GL_FASTEST:
3955 case GL_NICEST:
3956 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003957 break;
3958 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003959 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003960 }
3961
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003962 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003963 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003964 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003965 case GL_GENERATE_MIPMAP_HINT:
3966 if (context) context->setGenerateMipmapHint(mode);
3967 break;
3968 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
3969 if (context) context->setFragmentShaderDerivativeHint(mode);
3970 break;
3971 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003972 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003973 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003974 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003975 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003977 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003978 }
3979}
3980
3981GLboolean __stdcall glIsBuffer(GLuint buffer)
3982{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003983 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003984
3985 try
3986 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003987 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003988
3989 if (context && buffer)
3990 {
3991 gl::Buffer *bufferObject = context->getBuffer(buffer);
3992
3993 if (bufferObject)
3994 {
3995 return GL_TRUE;
3996 }
3997 }
3998 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003999 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004001 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004002 }
4003
4004 return GL_FALSE;
4005}
4006
4007GLboolean __stdcall glIsEnabled(GLenum cap)
4008{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004009 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004010
4011 try
4012 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004013 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004014
4015 if (context)
4016 {
Geoff Lang0550d032014-01-30 11:29:07 -05004017 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004019 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004020 }
Geoff Lang0550d032014-01-30 11:29:07 -05004021
4022 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004023 }
4024 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004025 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004026 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004027 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004028 }
4029
4030 return false;
4031}
4032
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004033GLboolean __stdcall glIsFenceNV(GLuint fence)
4034{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004035 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004036
4037 try
4038 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004039 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004040
4041 if (context)
4042 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004043 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004044
4045 if (fenceObject == NULL)
4046 {
4047 return GL_FALSE;
4048 }
4049
4050 return fenceObject->isFence();
4051 }
4052 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004053 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004055 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004056 }
4057
4058 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004059}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004060
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004061GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4062{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004063 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004064
4065 try
4066 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004068
4069 if (context && framebuffer)
4070 {
4071 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4072
4073 if (framebufferObject)
4074 {
4075 return GL_TRUE;
4076 }
4077 }
4078 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004079 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004080 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004081 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004082 }
4083
4084 return GL_FALSE;
4085}
4086
4087GLboolean __stdcall glIsProgram(GLuint program)
4088{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004089 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004090
4091 try
4092 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004093 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004094
4095 if (context && program)
4096 {
4097 gl::Program *programObject = context->getProgram(program);
4098
4099 if (programObject)
4100 {
4101 return GL_TRUE;
4102 }
4103 }
4104 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004105 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004107 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004108 }
4109
4110 return GL_FALSE;
4111}
4112
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004113GLboolean __stdcall glIsQueryEXT(GLuint id)
4114{
4115 EVENT("(GLuint id = %d)", id);
4116
4117 try
4118 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004119 gl::Context *context = gl::getNonLostContext();
4120
4121 if (context)
4122 {
Geoff Lang37dde692014-01-31 16:34:54 -05004123 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004124 }
4125 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004126 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004128 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004129 }
4130
4131 return GL_FALSE;
4132}
4133
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004134GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004136 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004137
4138 try
4139 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004140 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004141
4142 if (context && renderbuffer)
4143 {
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04004144 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004145
4146 if (renderbufferObject)
4147 {
4148 return GL_TRUE;
4149 }
4150 }
4151 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004152 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004154 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004155 }
4156
4157 return GL_FALSE;
4158}
4159
4160GLboolean __stdcall glIsShader(GLuint shader)
4161{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004162 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004163
4164 try
4165 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004166 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004167
4168 if (context && shader)
4169 {
4170 gl::Shader *shaderObject = context->getShader(shader);
4171
4172 if (shaderObject)
4173 {
4174 return GL_TRUE;
4175 }
4176 }
4177 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004178 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004180 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004181 }
4182
4183 return GL_FALSE;
4184}
4185
4186GLboolean __stdcall glIsTexture(GLuint texture)
4187{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004188 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004189
4190 try
4191 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004192 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004193
4194 if (context && texture)
4195 {
4196 gl::Texture *textureObject = context->getTexture(texture);
4197
4198 if (textureObject)
4199 {
4200 return GL_TRUE;
4201 }
4202 }
4203 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004204 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004205 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004206 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004207 }
4208
4209 return GL_FALSE;
4210}
4211
4212void __stdcall glLineWidth(GLfloat width)
4213{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004214 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004215
4216 try
4217 {
4218 if (width <= 0.0f)
4219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004220 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004221 }
4222
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004223 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004224
4225 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004226 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004227 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004228 }
4229 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004230 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004232 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004233 }
4234}
4235
4236void __stdcall glLinkProgram(GLuint program)
4237{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004238 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004239
4240 try
4241 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004242 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004243
4244 if (context)
4245 {
4246 gl::Program *programObject = context->getProgram(program);
4247
4248 if (!programObject)
4249 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004250 if (context->getShader(program))
4251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004252 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004253 }
4254 else
4255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004256 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004257 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004258 }
4259
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004260 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004261 }
4262 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004263 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004265 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004266 }
4267}
4268
4269void __stdcall glPixelStorei(GLenum pname, GLint param)
4270{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004271 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004272
4273 try
4274 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004275 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004276
4277 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004278 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004279 switch (pname)
4280 {
4281 case GL_UNPACK_ALIGNMENT:
4282 if (param != 1 && param != 2 && param != 4 && param != 8)
4283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004284 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004285 }
4286
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004287 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004288 break;
4289
4290 case GL_PACK_ALIGNMENT:
4291 if (param != 1 && param != 2 && param != 4 && param != 8)
4292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004293 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004294 }
4295
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004296 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004297 break;
4298
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004299 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4300 context->setPackReverseRowOrder(param != 0);
4301 break;
4302
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004303 case GL_UNPACK_IMAGE_HEIGHT:
4304 case GL_UNPACK_SKIP_IMAGES:
4305 case GL_UNPACK_ROW_LENGTH:
4306 case GL_UNPACK_SKIP_ROWS:
4307 case GL_UNPACK_SKIP_PIXELS:
4308 case GL_PACK_ROW_LENGTH:
4309 case GL_PACK_SKIP_ROWS:
4310 case GL_PACK_SKIP_PIXELS:
4311 if (context->getClientVersion() < 3)
4312 {
4313 return gl::error(GL_INVALID_ENUM);
4314 }
4315 UNIMPLEMENTED();
4316 break;
4317
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004318 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004319 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004320 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004321 }
4322 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004323 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004325 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004326 }
4327}
4328
4329void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4330{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004331 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004332
4333 try
4334 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004335 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004336
4337 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004338 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004339 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004340 }
4341 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004342 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004344 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004345 }
4346}
4347
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004348void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4349 GLenum format, GLenum type, GLsizei bufSize,
4350 GLvoid *data)
4351{
4352 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4353 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4354 x, y, width, height, format, type, bufSize, data);
4355
4356 try
4357 {
4358 if (width < 0 || height < 0 || bufSize < 0)
4359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004360 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004361 }
4362
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004363 gl::Context *context = gl::getNonLostContext();
4364
4365 if (context)
4366 {
Jamie Madill26e91952014-03-05 15:01:27 -05004367 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4368 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004369 {
Jamie Madill26e91952014-03-05 15:01:27 -05004370 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004371 }
4372
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004373 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4374 }
4375 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004376 catch (...)
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004378 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004379 }
4380}
4381
4382void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4383 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004384{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004385 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004386 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004387 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004388
4389 try
4390 {
4391 if (width < 0 || height < 0)
4392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004393 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004394 }
4395
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004396 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004397
4398 if (context)
4399 {
Jamie Madill26e91952014-03-05 15:01:27 -05004400 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4401 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004402 {
Jamie Madill26e91952014-03-05 15:01:27 -05004403 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004404 }
4405
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004406 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004407 }
4408 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004409 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004411 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004412 }
4413}
4414
4415void __stdcall glReleaseShaderCompiler(void)
4416{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004417 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004418
4419 try
4420 {
4421 gl::Shader::releaseCompiler();
4422 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004423 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004425 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004426 }
4427}
4428
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004429void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004430{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004431 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 +00004432 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004433
4434 try
4435 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004436 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004437
4438 if (context)
4439 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004440 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004441 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004442 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004443 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004444 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004445
4446 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004447 }
4448 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004449 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004450 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004451 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004452 }
4453}
4454
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004455void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4456{
4457 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4458}
4459
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004460void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4461{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004462 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004463
4464 try
4465 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004466 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004467
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004468 if (context)
4469 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004470 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004471 }
4472 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004473 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004475 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004476 }
4477}
4478
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004479void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4480{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004481 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004482
4483 try
4484 {
4485 if (condition != GL_ALL_COMPLETED_NV)
4486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004487 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004488 }
4489
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004490 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004491
4492 if (context)
4493 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004494 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004495
4496 if (fenceObject == NULL)
4497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004498 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004499 }
4500
4501 fenceObject->setFence(condition);
4502 }
4503 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004504 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004506 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004507 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004508}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004509
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004510void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4511{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004512 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 +00004513
4514 try
4515 {
4516 if (width < 0 || height < 0)
4517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004518 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004519 }
4520
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004521 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004522
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004523 if (context)
4524 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004525 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004526 }
4527 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004528 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004529 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004530 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004531 }
4532}
4533
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004534void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004535{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004536 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004537 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004538 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004539
4540 try
4541 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004542 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004543 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004544 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004545 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004547 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004548 }
4549}
4550
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004551void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004552{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004553 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 +00004554 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004555
4556 try
4557 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004558 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004560 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004561 }
4562
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004563 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004564
4565 if (context)
4566 {
4567 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004568
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004569 if (!shaderObject)
4570 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004571 if (context->getProgram(shader))
4572 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004573 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004574 }
4575 else
4576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004577 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004578 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004579 }
4580
4581 shaderObject->setSource(count, string, length);
4582 }
4583 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004584 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004586 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004587 }
4588}
4589
4590void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4591{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004592 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593}
4594
4595void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4596{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004597 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 +00004598
4599 try
4600 {
4601 switch (face)
4602 {
4603 case GL_FRONT:
4604 case GL_BACK:
4605 case GL_FRONT_AND_BACK:
4606 break;
4607 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004608 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004609 }
4610
4611 switch (func)
4612 {
4613 case GL_NEVER:
4614 case GL_ALWAYS:
4615 case GL_LESS:
4616 case GL_LEQUAL:
4617 case GL_EQUAL:
4618 case GL_GEQUAL:
4619 case GL_GREATER:
4620 case GL_NOTEQUAL:
4621 break;
4622 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004623 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004624 }
4625
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004626 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004627
4628 if (context)
4629 {
4630 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4631 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004632 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004633 }
4634
4635 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4636 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004637 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004638 }
4639 }
4640 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004641 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004643 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004644 }
4645}
4646
4647void __stdcall glStencilMask(GLuint mask)
4648{
4649 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4650}
4651
4652void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4653{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004654 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004655
4656 try
4657 {
4658 switch (face)
4659 {
4660 case GL_FRONT:
4661 case GL_BACK:
4662 case GL_FRONT_AND_BACK:
4663 break;
4664 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004665 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004666 }
4667
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004668 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004669
4670 if (context)
4671 {
4672 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4673 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004674 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004675 }
4676
4677 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4678 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004679 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004680 }
4681 }
4682 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004683 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004685 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004686 }
4687}
4688
4689void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4690{
4691 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4692}
4693
4694void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4695{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004696 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 +00004697 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004698
4699 try
4700 {
4701 switch (face)
4702 {
4703 case GL_FRONT:
4704 case GL_BACK:
4705 case GL_FRONT_AND_BACK:
4706 break;
4707 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004708 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004709 }
4710
4711 switch (fail)
4712 {
4713 case GL_ZERO:
4714 case GL_KEEP:
4715 case GL_REPLACE:
4716 case GL_INCR:
4717 case GL_DECR:
4718 case GL_INVERT:
4719 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004720 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004721 break;
4722 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004723 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004724 }
4725
4726 switch (zfail)
4727 {
4728 case GL_ZERO:
4729 case GL_KEEP:
4730 case GL_REPLACE:
4731 case GL_INCR:
4732 case GL_DECR:
4733 case GL_INVERT:
4734 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004735 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004736 break;
4737 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004738 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004739 }
4740
4741 switch (zpass)
4742 {
4743 case GL_ZERO:
4744 case GL_KEEP:
4745 case GL_REPLACE:
4746 case GL_INCR:
4747 case GL_DECR:
4748 case GL_INVERT:
4749 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004750 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004751 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
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004756 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004757
4758 if (context)
4759 {
4760 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4761 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004762 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004763 }
4764
4765 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4766 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004767 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004768 }
4769 }
4770 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004771 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004773 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004774 }
4775}
4776
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004777GLboolean __stdcall glTestFenceNV(GLuint fence)
4778{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004779 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004780
4781 try
4782 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004783 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004784
4785 if (context)
4786 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004787 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004788
4789 if (fenceObject == NULL)
4790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004791 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004792 }
4793
Jamie Madillfb9a7402013-07-26 11:55:01 -04004794 if (fenceObject->isFence() != GL_TRUE)
4795 {
4796 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4797 }
4798
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004799 return fenceObject->testFence();
4800 }
4801 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004802 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004804 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004805 }
4806
4807 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004808}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004809
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004810void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4811 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004812{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004813 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004814 "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 +00004815 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004816
4817 try
4818 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004819 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004820
4821 if (context)
4822 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004823 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004824 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004825 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004826 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004827 return;
4828 }
4829
4830 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004831 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004832 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004833 {
4834 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004835 }
4836
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004837 switch (target)
4838 {
4839 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004840 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004841 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004842 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004843 }
4844 break;
4845 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004846 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004847 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004848 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004849 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004850 break;
4851 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4852 {
4853 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004854 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004855 }
4856 break;
4857 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4858 {
4859 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004860 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004861 }
4862 break;
4863 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4864 {
4865 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004866 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004867 }
4868 break;
4869 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4870 {
4871 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004872 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004873 }
4874 break;
4875 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4876 {
4877 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004878 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004879 }
4880 break;
4881 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004882 }
4883 }
4884 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004885 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004887 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004888 }
4889}
4890
4891void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4892{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004893 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4894
4895 try
4896 {
4897 gl::Context *context = gl::getNonLostContext();
4898
4899 if (context)
4900 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004901 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004902 {
4903 return;
4904 }
4905
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004906 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004907
Jamie Madillfb8a8302013-07-03 14:24:12 -04004908 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004910 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004911 }
4912
4913 switch (pname)
4914 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004915 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
4916 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
4917 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
4918 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
4919 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
4920 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
Geoff Langcec35902014-04-16 10:52:36 -04004921 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(param, context->getCaps().extensions.maxTextureAnisotropy); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004922 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
4923 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004924 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
4925 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
4926 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
4927 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04004928 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(gl::iround<GLint>(param)); break;
4929 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(gl::iround<GLint>(param)); break;
4930 case GL_TEXTURE_MIN_LOD: texture->setMinLod(param); break;
4931 case GL_TEXTURE_MAX_LOD: texture->setMaxLod(param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004932 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004933 }
4934 }
4935 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004936 catch (...)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004938 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004939 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004940}
4941
4942void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4943{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004944 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004945}
4946
4947void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004949 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004950
4951 try
4952 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004953 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004954
4955 if (context)
4956 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004957 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04004958 {
4959 return;
4960 }
4961
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004962 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004963
Jamie Madillfb8a8302013-07-03 14:24:12 -04004964 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004966 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004967 }
4968
4969 switch (pname)
4970 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004971 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
4972 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
4973 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
4974 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
4975 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
4976 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
Geoff Langcec35902014-04-16 10:52:36 -04004977 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getCaps().extensions.maxTextureAnisotropy); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004978 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
4979 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004980 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
4981 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
4982 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
4983 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04004984 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(param); break;
4985 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(param); break;
4986 case GL_TEXTURE_MIN_LOD: texture->setMinLod((GLfloat)param); break;
4987 case GL_TEXTURE_MAX_LOD: texture->setMaxLod((GLfloat)param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004988 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004989 }
4990 }
4991 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004992 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004994 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004995 }
4996}
4997
4998void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
4999{
5000 glTexParameteri(target, pname, *params);
5001}
5002
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005003void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5004{
5005 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5006 target, levels, internalformat, width, height);
5007
5008 try
5009 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005010 gl::Context *context = gl::getNonLostContext();
5011
5012 if (context)
5013 {
Geoff Langcec35902014-04-16 10:52:36 -04005014 if (!context->getCaps().extensions.textureStorage)
5015 {
5016 return gl::error(GL_INVALID_OPERATION);
5017 }
5018
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005019 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005020 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005021 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005022 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005023 }
5024
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005025 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005026 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005027 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005028 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005029 }
5030
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005031 switch (target)
5032 {
5033 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005034 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005035 gl::Texture2D *texture2d = context->getTexture2D();
5036 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005037 }
5038 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005039
Geoff Lang01c21d22013-09-24 11:52:16 -04005040 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005041 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005042 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5043 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005044 }
5045 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005046
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005047 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005048 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005049 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005050 }
5051 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005052 catch (...)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005054 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005055 }
5056}
5057
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005058void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5059 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005060{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005061 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005062 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005063 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005064 target, level, xoffset, yoffset, width, height, format, type, pixels);
5065
5066 try
5067 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005068 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005069
5070 if (context)
5071 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005072 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005073 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005074 xoffset, yoffset, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005075 {
5076 return;
5077 }
5078
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005079 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005080 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005081 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005082 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005083 return;
5084 }
5085
Geoff Langc41e42d2014-04-28 10:58:16 -04005086 // Zero sized uploads are valid but no-ops
5087 if (width == 0 || height == 0)
5088 {
5089 return;
5090 }
5091
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005092 switch (target)
5093 {
5094 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005095 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005096 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005097 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005098 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005099 break;
5100
5101 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5102 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5103 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5104 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5105 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5106 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005107 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005108 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005109 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005110 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005111 break;
5112
5113 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005114 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005115 }
5116 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005117 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005118 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005119 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005120 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005121 }
5122}
5123
5124void __stdcall glUniform1f(GLint location, GLfloat x)
5125{
5126 glUniform1fv(location, 1, &x);
5127}
5128
5129void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5130{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005131 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005132
5133 try
5134 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005135 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005136
5137 if (context)
5138 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005139 if (!ValidateUniform(context, GL_FLOAT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005140 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005141 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005142 }
5143
Jamie Madillaa981bd2014-05-20 10:55:55 -04005144 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005145 programBinary->setUniform1fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005146 }
5147 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005148 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005150 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005151 }
5152}
5153
5154void __stdcall glUniform1i(GLint location, GLint x)
5155{
5156 glUniform1iv(location, 1, &x);
5157}
5158
5159void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5160{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005161 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005162
5163 try
5164 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005165 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005166
5167 if (context)
5168 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005169 if (!ValidateUniform(context, GL_INT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005170 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005171 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005172 }
5173
Jamie Madillaa981bd2014-05-20 10:55:55 -04005174 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005175 programBinary->setUniform1iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005176 }
5177 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005178 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005180 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005181 }
5182}
5183
5184void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5185{
5186 GLfloat xy[2] = {x, y};
5187
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005188 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005189}
5190
5191void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5192{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005193 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005194
5195 try
5196 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005197 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005198
5199 if (context)
5200 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005201 if (!ValidateUniform(context, GL_FLOAT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005202 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005203 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005204 }
5205
Jamie Madillaa981bd2014-05-20 10:55:55 -04005206 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005207 programBinary->setUniform2fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005208 }
5209 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005210 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005212 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005213 }
5214}
5215
5216void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5217{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005218 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005219
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005220 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005221}
5222
5223void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5224{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005225 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005226
5227 try
5228 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005229 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005230
5231 if (context)
5232 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005233 if (!ValidateUniform(context, GL_INT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005234 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005235 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005236 }
5237
Jamie Madillaa981bd2014-05-20 10:55:55 -04005238 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005239 programBinary->setUniform2iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005240 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005241 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005242 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005243 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005244 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005245 }
5246}
5247
5248void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5249{
5250 GLfloat xyz[3] = {x, y, z};
5251
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005252 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253}
5254
5255void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5256{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005257 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005258
5259 try
5260 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005261 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005262
5263 if (context)
5264 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005265 if (!ValidateUniform(context, GL_FLOAT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005266 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005267 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005268 }
5269
Jamie Madillaa981bd2014-05-20 10:55:55 -04005270 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005271 programBinary->setUniform3fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005272 }
5273 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005274 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005276 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005277 }
5278}
5279
5280void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5281{
5282 GLint xyz[3] = {x, y, z};
5283
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005284 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005285}
5286
5287void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5288{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005289 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005290
5291 try
5292 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005293 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005294
5295 if (context)
5296 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005297 if (!ValidateUniform(context, GL_INT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005298 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005299 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005300 }
5301
Jamie Madillaa981bd2014-05-20 10:55:55 -04005302 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005303 programBinary->setUniform3iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005304 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005305 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005306 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005307 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005308 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005309 }
5310}
5311
5312void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5313{
5314 GLfloat xyzw[4] = {x, y, z, w};
5315
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005316 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005317}
5318
5319void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5320{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005321 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005322
5323 try
5324 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005325 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005326
5327 if (context)
5328 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005329 if (!ValidateUniform(context, GL_FLOAT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005330 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005331 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005332 }
5333
Jamie Madillaa981bd2014-05-20 10:55:55 -04005334 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005335 programBinary->setUniform4fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005336 }
5337 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005338 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005340 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005341 }
5342}
5343
5344void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5345{
5346 GLint xyzw[4] = {x, y, z, w};
5347
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005348 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005349}
5350
5351void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5352{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005353 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005354
5355 try
5356 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005357 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005358
5359 if (context)
5360 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005361 if (!ValidateUniform(context, GL_INT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005362 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005363 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005364 }
5365
Jamie Madillaa981bd2014-05-20 10:55:55 -04005366 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005367 programBinary->setUniform4iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005368 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005369 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005370 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005372 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005373 }
5374}
5375
5376void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5377{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005378 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005379 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005380
5381 try
5382 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005383 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005384
5385 if (context)
5386 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005387 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005388 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005389 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005390 }
5391
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005392 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005393 programBinary->setUniformMatrix2fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005394 }
5395 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005396 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005398 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005399 }
5400}
5401
5402void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5403{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005404 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005405 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005406
5407 try
5408 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005409 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005410
5411 if (context)
5412 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005413 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005414 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005415 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005416 }
5417
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005418 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005419 programBinary->setUniformMatrix3fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005420 }
5421 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005422 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005424 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005425 }
5426}
5427
5428void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5429{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005430 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005431 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005432
5433 try
5434 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005435 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005436
5437 if (context)
5438 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005439 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005440 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005441 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005442 }
5443
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005444 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005445 programBinary->setUniformMatrix4fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005446 }
5447 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005448 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005450 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005451 }
5452}
5453
5454void __stdcall glUseProgram(GLuint program)
5455{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005456 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005457
5458 try
5459 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005460 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005461
5462 if (context)
5463 {
5464 gl::Program *programObject = context->getProgram(program);
5465
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005466 if (!programObject && program != 0)
5467 {
5468 if (context->getShader(program))
5469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005470 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005471 }
5472 else
5473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005474 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005475 }
5476 }
5477
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005478 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005480 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005481 }
5482
5483 context->useProgram(program);
5484 }
5485 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005486 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005488 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005489 }
5490}
5491
5492void __stdcall glValidateProgram(GLuint program)
5493{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005494 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005495
5496 try
5497 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005498 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005499
5500 if (context)
5501 {
5502 gl::Program *programObject = context->getProgram(program);
5503
5504 if (!programObject)
5505 {
5506 if (context->getShader(program))
5507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005508 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005509 }
5510 else
5511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005512 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005513 }
5514 }
5515
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005516 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005517 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005518 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005519 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005521 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005522 }
5523}
5524
5525void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5526{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005527 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005528
5529 try
5530 {
5531 if (index >= gl::MAX_VERTEX_ATTRIBS)
5532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005533 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005534 }
5535
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005536 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005537
5538 if (context)
5539 {
5540 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005541 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005542 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005543 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005544 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005546 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005547 }
5548}
5549
5550void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5551{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005552 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005553
5554 try
5555 {
5556 if (index >= gl::MAX_VERTEX_ATTRIBS)
5557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005559 }
5560
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005561 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005562
5563 if (context)
5564 {
5565 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005566 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005567 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005568 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005569 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005571 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005572 }
5573}
5574
5575void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5576{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005577 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005578
5579 try
5580 {
5581 if (index >= gl::MAX_VERTEX_ATTRIBS)
5582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005583 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005584 }
5585
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005586 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005587
5588 if (context)
5589 {
5590 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005591 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005592 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005593 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005594 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005596 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005597 }
5598}
5599
5600void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5601{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005602 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005603
5604 try
5605 {
5606 if (index >= gl::MAX_VERTEX_ATTRIBS)
5607 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005608 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005609 }
5610
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005611 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005612
5613 if (context)
5614 {
5615 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005616 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005617 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005618 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005619 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005621 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005622 }
5623}
5624
5625void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5626{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005627 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 +00005628
5629 try
5630 {
5631 if (index >= gl::MAX_VERTEX_ATTRIBS)
5632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005633 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005634 }
5635
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005636 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005637
5638 if (context)
5639 {
5640 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005641 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005642 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005643 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005644 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005645 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005646 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005647 }
5648}
5649
5650void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5651{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005652 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005653
5654 try
5655 {
5656 if (index >= gl::MAX_VERTEX_ATTRIBS)
5657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005658 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005659 }
5660
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005661 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005662
5663 if (context)
5664 {
5665 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005666 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005667 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005668 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005669 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005671 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005672 }
5673}
5674
5675void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5676{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005677 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 +00005678
5679 try
5680 {
5681 if (index >= gl::MAX_VERTEX_ATTRIBS)
5682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005683 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005684 }
5685
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005686 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005687
5688 if (context)
5689 {
5690 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005691 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005692 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005693 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005694 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005695 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005696 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005697 }
5698}
5699
5700void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5701{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005702 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005703
5704 try
5705 {
5706 if (index >= gl::MAX_VERTEX_ATTRIBS)
5707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005708 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005709 }
5710
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005711 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005712
5713 if (context)
5714 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005715 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005716 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005717 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005718 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005720 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005721 }
5722}
5723
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005724void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5725{
5726 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5727
5728 try
5729 {
5730 if (index >= gl::MAX_VERTEX_ATTRIBS)
5731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005732 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005733 }
5734
5735 gl::Context *context = gl::getNonLostContext();
5736
5737 if (context)
5738 {
5739 context->setVertexAttribDivisor(index, divisor);
5740 }
5741 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005742 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005744 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005745 }
5746}
5747
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005748void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005749{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005750 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005751 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005752 index, size, type, normalized, stride, ptr);
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
5761 if (size < 1 || size > 4)
5762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005763 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005764 }
5765
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005766 gl::Context *context = gl::getNonLostContext();
5767
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005768 switch (type)
5769 {
5770 case GL_BYTE:
5771 case GL_UNSIGNED_BYTE:
5772 case GL_SHORT:
5773 case GL_UNSIGNED_SHORT:
5774 case GL_FIXED:
5775 case GL_FLOAT:
5776 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005777 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005778 case GL_INT:
5779 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005780 case GL_INT_2_10_10_10_REV:
5781 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005782 if (context && context->getClientVersion() < 3)
5783 {
5784 return gl::error(GL_INVALID_ENUM);
5785 }
5786 else
5787 {
5788 break;
5789 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005790 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005791 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005792 }
5793
5794 if (stride < 0)
5795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005796 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005797 }
5798
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005799 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
5800 {
5801 return gl::error(GL_INVALID_OPERATION);
5802 }
5803
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005804 if (context)
5805 {
Jamie Madilld8db8662013-07-02 11:57:04 -04005806 // [OpenGL ES 3.0.2] Section 2.8 page 24:
5807 // An INVALID_OPERATION error is generated when a non-zero vertex array object
5808 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
5809 // and the pointer argument is not NULL.
5810 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
5811 {
5812 return gl::error(GL_INVALID_OPERATION);
5813 }
5814
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00005815 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
5816 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005817 }
5818 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005819 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005820 {
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 glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
5826{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005827 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 +00005828
5829 try
5830 {
5831 if (width < 0 || height < 0)
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.com4f39fd92010-03-08 20:26:45 +00005837
5838 if (context)
5839 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005840 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005841 }
5842 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005843 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005845 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005846 }
5847}
5848
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005849// OpenGL ES 3.0 functions
5850
5851void __stdcall glReadBuffer(GLenum mode)
5852{
5853 EVENT("(GLenum mode = 0x%X)", mode);
5854
5855 try
5856 {
5857 gl::Context *context = gl::getNonLostContext();
5858
5859 if (context)
5860 {
5861 if (context->getClientVersion() < 3)
5862 {
5863 return gl::error(GL_INVALID_OPERATION);
5864 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005865
Jamie Madill54133512013-06-21 09:33:07 -04005866 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005867 UNIMPLEMENTED();
5868 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005869 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005870 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005871 {
5872 return gl::error(GL_OUT_OF_MEMORY);
5873 }
5874}
5875
5876void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
5877{
5878 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
5879 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
5880
5881 try
5882 {
5883 gl::Context *context = gl::getNonLostContext();
5884
5885 if (context)
5886 {
5887 if (context->getClientVersion() < 3)
5888 {
5889 return gl::error(GL_INVALID_OPERATION);
5890 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005891
Jamie Madill54133512013-06-21 09:33:07 -04005892 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005893 UNIMPLEMENTED();
5894 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005895 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005896 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005897 {
5898 return gl::error(GL_OUT_OF_MEMORY);
5899 }
5900}
5901
5902void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
5903{
5904 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
5905 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
5906 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5907 target, level, internalformat, width, height, depth, border, format, type, pixels);
5908
5909 try
5910 {
5911 gl::Context *context = gl::getNonLostContext();
5912
5913 if (context)
5914 {
5915 if (context->getClientVersion() < 3)
5916 {
5917 return gl::error(GL_INVALID_OPERATION);
5918 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005919
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005920 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005921 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005922 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005923 {
5924 return;
5925 }
5926
5927 switch(target)
5928 {
5929 case GL_TEXTURE_3D:
5930 {
5931 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005932 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005933 }
5934 break;
5935
5936 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005937 {
5938 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04005939 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005940 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005941 break;
5942
5943 default:
5944 return gl::error(GL_INVALID_ENUM);
5945 }
5946 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005947 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005948 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005949 {
5950 return gl::error(GL_OUT_OF_MEMORY);
5951 }
5952}
5953
5954void __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)
5955{
5956 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
5957 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
5958 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5959 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
5960
5961 try
5962 {
5963 gl::Context *context = gl::getNonLostContext();
5964
5965 if (context)
5966 {
5967 if (context->getClientVersion() < 3)
5968 {
5969 return gl::error(GL_INVALID_OPERATION);
5970 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005971
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005972 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005973 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005974 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005975 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005976 {
5977 return;
5978 }
5979
Geoff Langc41e42d2014-04-28 10:58:16 -04005980 // Zero sized uploads are valid but no-ops
5981 if (width == 0 || height == 0 || depth == 0)
5982 {
5983 return;
5984 }
5985
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005986 switch(target)
5987 {
5988 case GL_TEXTURE_3D:
5989 {
5990 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005991 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 +00005992 }
5993 break;
5994
5995 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005996 {
5997 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04005998 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 +00005999 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006000 break;
6001
6002 default:
6003 return gl::error(GL_INVALID_ENUM);
6004 }
6005 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006006 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006007 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006008 {
6009 return gl::error(GL_OUT_OF_MEMORY);
6010 }
6011}
6012
6013void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6014{
6015 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6016 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6017 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6018
6019 try
6020 {
6021 gl::Context *context = gl::getNonLostContext();
6022
6023 if (context)
6024 {
6025 if (context->getClientVersion() < 3)
6026 {
6027 return gl::error(GL_INVALID_OPERATION);
6028 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006029
Jamie Madill6f38f822014-06-06 17:12:20 -04006030 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006031 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006032 {
6033 return;
6034 }
6035
6036 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6037 gl::Texture *texture = NULL;
6038 switch (target)
6039 {
6040 case GL_TEXTURE_3D:
6041 texture = context->getTexture3D();
6042 break;
6043
6044 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006045 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006046 break;
6047
6048 default:
6049 return gl::error(GL_INVALID_ENUM);
6050 }
6051
6052 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6053 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006054 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006055 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006056 {
6057 return gl::error(GL_OUT_OF_MEMORY);
6058 }
6059}
6060
6061void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6062{
Geoff Langeef52cc2013-10-16 15:07:39 -04006063 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 +00006064 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6065 "const GLvoid* data = 0x%0.8p)",
6066 target, level, internalformat, width, height, depth, border, imageSize, data);
6067
6068 try
6069 {
6070 gl::Context *context = gl::getNonLostContext();
6071
6072 if (context)
6073 {
6074 if (context->getClientVersion() < 3)
6075 {
6076 return gl::error(GL_INVALID_OPERATION);
6077 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006078
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006079 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 +00006080 {
6081 return gl::error(GL_INVALID_VALUE);
6082 }
6083
6084 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006085 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006086 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006087 {
6088 return;
6089 }
6090
6091 switch(target)
6092 {
6093 case GL_TEXTURE_3D:
6094 {
6095 gl::Texture3D *texture = context->getTexture3D();
6096 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6097 }
6098 break;
6099
6100 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006101 {
6102 gl::Texture2DArray *texture = context->getTexture2DArray();
6103 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6104 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006105 break;
6106
6107 default:
6108 return gl::error(GL_INVALID_ENUM);
6109 }
6110 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006111 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006112 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006113 {
6114 return gl::error(GL_OUT_OF_MEMORY);
6115 }
6116}
6117
6118void __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)
6119{
6120 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6121 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6122 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6123 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6124
6125 try
6126 {
6127 gl::Context *context = gl::getNonLostContext();
6128
6129 if (context)
6130 {
6131 if (context->getClientVersion() < 3)
6132 {
6133 return gl::error(GL_INVALID_OPERATION);
6134 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006135
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006136 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 +00006137 {
6138 return gl::error(GL_INVALID_VALUE);
6139 }
6140
6141 if (!data)
6142 {
6143 return gl::error(GL_INVALID_VALUE);
6144 }
6145
6146 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006147 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006148 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006149 {
6150 return;
6151 }
6152
Geoff Langc41e42d2014-04-28 10:58:16 -04006153 // Zero sized uploads are valid but no-ops
6154 if (width == 0 || height == 0)
6155 {
6156 return;
6157 }
6158
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006159 switch(target)
6160 {
6161 case GL_TEXTURE_3D:
6162 {
6163 gl::Texture3D *texture = context->getTexture3D();
6164 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6165 format, imageSize, data);
6166 }
6167 break;
6168
6169 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006170 {
6171 gl::Texture2DArray *texture = context->getTexture2DArray();
6172 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6173 format, imageSize, data);
6174 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006175 break;
6176
6177 default:
6178 return gl::error(GL_INVALID_ENUM);
6179 }
6180 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006181 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006182 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006183 {
6184 return gl::error(GL_OUT_OF_MEMORY);
6185 }
6186}
6187
6188void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6189{
6190 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6191
6192 try
6193 {
6194 gl::Context *context = gl::getNonLostContext();
6195
6196 if (context)
6197 {
6198 if (context->getClientVersion() < 3)
6199 {
6200 return gl::error(GL_INVALID_OPERATION);
6201 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006202
Geoff Lang37dde692014-01-31 16:34:54 -05006203 if (n < 0)
6204 {
6205 return gl::error(GL_INVALID_VALUE);
6206 }
6207
6208 for (GLsizei i = 0; i < n; i++)
6209 {
6210 ids[i] = context->createQuery();
6211 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006212 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006213 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006214 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006215 {
6216 return gl::error(GL_OUT_OF_MEMORY);
6217 }
6218}
6219
6220void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6221{
6222 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6223
6224 try
6225 {
6226 gl::Context *context = gl::getNonLostContext();
6227
6228 if (context)
6229 {
6230 if (context->getClientVersion() < 3)
6231 {
6232 return gl::error(GL_INVALID_OPERATION);
6233 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006234
Geoff Lang37dde692014-01-31 16:34:54 -05006235 if (n < 0)
6236 {
6237 return gl::error(GL_INVALID_VALUE);
6238 }
6239
6240 for (GLsizei i = 0; i < n; i++)
6241 {
6242 context->deleteQuery(ids[i]);
6243 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006244 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006245 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006246 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006247 {
6248 return gl::error(GL_OUT_OF_MEMORY);
6249 }
6250}
6251
6252GLboolean __stdcall glIsQuery(GLuint id)
6253{
6254 EVENT("(GLuint id = %u)", id);
6255
6256 try
6257 {
6258 gl::Context *context = gl::getNonLostContext();
6259
6260 if (context)
6261 {
6262 if (context->getClientVersion() < 3)
6263 {
6264 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6265 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006266
Geoff Lang37dde692014-01-31 16:34:54 -05006267 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006268 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006269 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006270 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006271 {
6272 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6273 }
6274
6275 return GL_FALSE;
6276}
6277
6278void __stdcall glBeginQuery(GLenum target, GLuint id)
6279{
6280 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6281
6282 try
6283 {
6284 gl::Context *context = gl::getNonLostContext();
6285
6286 if (context)
6287 {
6288 if (context->getClientVersion() < 3)
6289 {
6290 return gl::error(GL_INVALID_OPERATION);
6291 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006292
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006293 if (!ValidateBeginQuery(context, target, id))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006294 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006295 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006296 }
Geoff Lang37dde692014-01-31 16:34:54 -05006297 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006298 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006299 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006300 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006301 {
6302 return gl::error(GL_OUT_OF_MEMORY);
6303 }
6304}
6305
6306void __stdcall glEndQuery(GLenum target)
6307{
6308 EVENT("(GLenum target = 0x%X)", target);
6309
6310 try
6311 {
6312 gl::Context *context = gl::getNonLostContext();
6313
6314 if (context)
6315 {
6316 if (context->getClientVersion() < 3)
6317 {
6318 return gl::error(GL_INVALID_OPERATION);
6319 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006320
Jamie Madill45c785d2014-05-13 14:09:34 -04006321 if (!ValidateEndQuery(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006322 {
Jamie Madill45c785d2014-05-13 14:09:34 -04006323 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006324 }
Geoff Lang37dde692014-01-31 16:34:54 -05006325
6326 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006327 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006328 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006329 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006330 {
6331 return gl::error(GL_OUT_OF_MEMORY);
6332 }
6333}
6334
6335void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6336{
6337 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6338
6339 try
6340 {
6341 gl::Context *context = gl::getNonLostContext();
6342
6343 if (context)
6344 {
6345 if (context->getClientVersion() < 3)
6346 {
6347 return gl::error(GL_INVALID_OPERATION);
6348 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006349
Geoff Lang37dde692014-01-31 16:34:54 -05006350 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006351 {
Geoff Lang37dde692014-01-31 16:34:54 -05006352 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006353 }
Geoff Lang37dde692014-01-31 16:34:54 -05006354
6355 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006356 {
Geoff Lang37dde692014-01-31 16:34:54 -05006357 case GL_CURRENT_QUERY:
Jamie Madill45c785d2014-05-13 14:09:34 -04006358 params[0] = static_cast<GLint>(context->getActiveQueryId(target));
Geoff Lang37dde692014-01-31 16:34:54 -05006359 break;
6360
6361 default:
6362 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006363 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006364 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006365 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006366 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006367 {
6368 return gl::error(GL_OUT_OF_MEMORY);
6369 }
6370}
6371
6372void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6373{
6374 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6375
6376 try
6377 {
6378 gl::Context *context = gl::getNonLostContext();
6379
6380 if (context)
6381 {
6382 if (context->getClientVersion() < 3)
6383 {
6384 return gl::error(GL_INVALID_OPERATION);
6385 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006386
Geoff Lang37dde692014-01-31 16:34:54 -05006387 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6388
6389 if (!queryObject)
6390 {
6391 return gl::error(GL_INVALID_OPERATION);
6392 }
6393
Jamie Madill45c785d2014-05-13 14:09:34 -04006394 if (context->getActiveQueryId(queryObject->getType()) == id)
Geoff Lang37dde692014-01-31 16:34:54 -05006395 {
6396 return gl::error(GL_INVALID_OPERATION);
6397 }
6398
6399 switch(pname)
6400 {
6401 case GL_QUERY_RESULT:
6402 params[0] = queryObject->getResult();
6403 break;
6404 case GL_QUERY_RESULT_AVAILABLE:
6405 params[0] = queryObject->isResultAvailable();
6406 break;
6407 default:
6408 return gl::error(GL_INVALID_ENUM);
6409 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006410 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006411 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006412 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006413 {
6414 return gl::error(GL_OUT_OF_MEMORY);
6415 }
6416}
6417
6418GLboolean __stdcall glUnmapBuffer(GLenum target)
6419{
6420 EVENT("(GLenum target = 0x%X)", target);
6421
6422 try
6423 {
6424 gl::Context *context = gl::getNonLostContext();
6425
6426 if (context)
6427 {
6428 if (context->getClientVersion() < 3)
6429 {
6430 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6431 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006432
Shannon Woodsb3801742014-03-27 14:59:19 -04006433 return glUnmapBufferOES(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006434 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006435 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006436 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006437 {
6438 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6439 }
6440
6441 return GL_FALSE;
6442}
6443
6444void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6445{
6446 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6447
6448 try
6449 {
6450 gl::Context *context = gl::getNonLostContext();
6451
6452 if (context)
6453 {
6454 if (context->getClientVersion() < 3)
6455 {
6456 return gl::error(GL_INVALID_OPERATION);
6457 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006458
Shannon Woodsb3801742014-03-27 14:59:19 -04006459 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006460 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006461 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006462 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006463 {
6464 return gl::error(GL_OUT_OF_MEMORY);
6465 }
6466}
6467
6468void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6469{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006470 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
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006481 glDrawBuffersEXT(n, bufs);
6482 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006483 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006484 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006485 {
6486 return gl::error(GL_OUT_OF_MEMORY);
6487 }
6488}
6489
6490void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6491{
6492 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6493 location, count, transpose, value);
6494
6495 try
6496 {
6497 gl::Context *context = gl::getNonLostContext();
6498
6499 if (context)
6500 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006501 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006502 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006503 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006504 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006505
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006506 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006507 programBinary->setUniformMatrix2x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006508 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006509 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006510 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006511 {
6512 return gl::error(GL_OUT_OF_MEMORY);
6513 }
6514}
6515
6516void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6517{
6518 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6519 location, count, transpose, value);
6520
6521 try
6522 {
6523 gl::Context *context = gl::getNonLostContext();
6524
6525 if (context)
6526 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006527 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006528 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006529 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006530 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006531
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006532 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006533 programBinary->setUniformMatrix3x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006534 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006535 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006536 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006537 {
6538 return gl::error(GL_OUT_OF_MEMORY);
6539 }
6540}
6541
6542void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6543{
6544 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6545 location, count, transpose, value);
6546
6547 try
6548 {
6549 gl::Context *context = gl::getNonLostContext();
6550
6551 if (context)
6552 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006553 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006554 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006555 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006556 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006557
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006558 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006559 programBinary->setUniformMatrix2x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006560 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006561 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006562 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006563 {
6564 return gl::error(GL_OUT_OF_MEMORY);
6565 }
6566}
6567
6568void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6569{
6570 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6571 location, count, transpose, value);
6572
6573 try
6574 {
6575 gl::Context *context = gl::getNonLostContext();
6576
6577 if (context)
6578 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006579 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006580 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006581 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006582 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006583
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006584 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006585 programBinary->setUniformMatrix4x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006586 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006587 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006588 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006589 {
6590 return gl::error(GL_OUT_OF_MEMORY);
6591 }
6592}
6593
6594void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6595{
6596 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6597 location, count, transpose, value);
6598
6599 try
6600 {
6601 gl::Context *context = gl::getNonLostContext();
6602
6603 if (context)
6604 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006605 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006606 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006607 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006608 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006609
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006610 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006611 programBinary->setUniformMatrix3x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006612 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006613 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006614 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006615 {
6616 return gl::error(GL_OUT_OF_MEMORY);
6617 }
6618}
6619
6620void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6621{
6622 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6623 location, count, transpose, value);
6624
6625 try
6626 {
6627 gl::Context *context = gl::getNonLostContext();
6628
6629 if (context)
6630 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006631 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006632 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006633 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006634 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006635
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006636 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006637 programBinary->setUniformMatrix4x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006638 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006639 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006640 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006641 {
6642 return gl::error(GL_OUT_OF_MEMORY);
6643 }
6644}
6645
6646void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6647{
6648 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6649 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6650 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6651
6652 try
6653 {
6654 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006655 if (context)
6656 {
6657 if (context->getClientVersion() < 3)
6658 {
6659 return gl::error(GL_INVALID_OPERATION);
6660 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006661
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006662 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006663 dstX0, dstY0, dstX1, dstY1, mask, filter,
6664 false))
6665 {
6666 return;
6667 }
6668
6669 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6670 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006671 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006672 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006673 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006674 {
6675 return gl::error(GL_OUT_OF_MEMORY);
6676 }
6677}
6678
6679void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
6680{
6681 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6682 target, samples, internalformat, width, height);
6683
6684 try
6685 {
6686 gl::Context *context = gl::getNonLostContext();
6687
6688 if (context)
6689 {
6690 if (context->getClientVersion() < 3)
6691 {
6692 return gl::error(GL_INVALID_OPERATION);
6693 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006694
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006695 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04006696 width, height, false))
6697 {
6698 return;
6699 }
6700
6701 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006702 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006703 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006704 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006705 {
6706 return gl::error(GL_OUT_OF_MEMORY);
6707 }
6708}
6709
6710void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
6711{
6712 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
6713 target, attachment, texture, level, layer);
6714
6715 try
6716 {
6717 gl::Context *context = gl::getNonLostContext();
6718
6719 if (context)
6720 {
6721 if (context->getClientVersion() < 3)
6722 {
6723 return gl::error(GL_INVALID_OPERATION);
6724 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006725
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006726 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04006727 {
6728 return;
6729 }
6730
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05006731 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
6732 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04006733
6734 gl::Texture *textureObject = context->getTexture(texture);
6735 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
6736
6737 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
6738 {
6739 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
6740 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
6741 }
6742 else
6743 {
6744 switch (attachment)
6745 {
6746 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
6747 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
6748 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
6749 }
6750 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006751 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006752 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006753 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006754 {
6755 return gl::error(GL_OUT_OF_MEMORY);
6756 }
6757}
6758
6759GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
6760{
6761 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
6762 target, offset, length, access);
6763
6764 try
6765 {
6766 gl::Context *context = gl::getNonLostContext();
6767
6768 if (context)
6769 {
6770 if (context->getClientVersion() < 3)
6771 {
6772 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
6773 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006774
Shannon Woods916e7692014-03-27 16:58:22 -04006775 return glMapBufferRangeEXT(target, offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006776 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006777 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006778 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006779 {
6780 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
6781 }
6782
6783 return NULL;
6784}
6785
6786void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
6787{
6788 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
6789
6790 try
6791 {
6792 gl::Context *context = gl::getNonLostContext();
6793
6794 if (context)
6795 {
6796 if (context->getClientVersion() < 3)
6797 {
6798 return gl::error(GL_INVALID_OPERATION);
6799 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006800
Shannon Woods916e7692014-03-27 16:58:22 -04006801 glFlushMappedBufferRangeEXT(target, offset, length);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006802 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006803 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006804 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006805 {
6806 return gl::error(GL_OUT_OF_MEMORY);
6807 }
6808}
6809
6810void __stdcall glBindVertexArray(GLuint array)
6811{
6812 EVENT("(GLuint array = %u)", array);
6813
6814 try
6815 {
6816 gl::Context *context = gl::getNonLostContext();
6817
6818 if (context)
6819 {
6820 if (context->getClientVersion() < 3)
6821 {
6822 return gl::error(GL_INVALID_OPERATION);
6823 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006824
Jamie Madilld1028542013-07-02 11:57:04 -04006825 gl::VertexArray *vao = context->getVertexArray(array);
6826
6827 if (!vao)
6828 {
6829 // The default VAO should always exist
6830 ASSERT(array != 0);
6831 return gl::error(GL_INVALID_OPERATION);
6832 }
6833
6834 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006835 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006836 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006837 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006838 {
6839 return gl::error(GL_OUT_OF_MEMORY);
6840 }
6841}
6842
6843void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
6844{
6845 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
6846
6847 try
6848 {
6849 gl::Context *context = gl::getNonLostContext();
6850
6851 if (context)
6852 {
6853 if (context->getClientVersion() < 3)
6854 {
6855 return gl::error(GL_INVALID_OPERATION);
6856 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006857
Jamie Madilld1028542013-07-02 11:57:04 -04006858 if (n < 0)
6859 {
6860 return gl::error(GL_INVALID_VALUE);
6861 }
6862
6863 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6864 {
6865 if (arrays[arrayIndex] != 0)
6866 {
6867 context->deleteVertexArray(arrays[arrayIndex]);
6868 }
6869 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006870 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006871 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006872 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006873 {
6874 return gl::error(GL_OUT_OF_MEMORY);
6875 }
6876}
6877
6878void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
6879{
6880 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
6881
6882 try
6883 {
6884 gl::Context *context = gl::getNonLostContext();
6885
6886 if (context)
6887 {
6888 if (context->getClientVersion() < 3)
6889 {
6890 return gl::error(GL_INVALID_OPERATION);
6891 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006892
Jamie Madilld1028542013-07-02 11:57:04 -04006893 if (n < 0)
6894 {
6895 return gl::error(GL_INVALID_VALUE);
6896 }
6897
6898 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6899 {
6900 arrays[arrayIndex] = context->createVertexArray();
6901 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006902 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006903 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006904 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006905 {
6906 return gl::error(GL_OUT_OF_MEMORY);
6907 }
6908}
6909
6910GLboolean __stdcall glIsVertexArray(GLuint array)
6911{
6912 EVENT("(GLuint array = %u)", array);
6913
6914 try
6915 {
6916 gl::Context *context = gl::getNonLostContext();
6917
6918 if (context)
6919 {
6920 if (context->getClientVersion() < 3)
6921 {
6922 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006924
Jamie Madilld1028542013-07-02 11:57:04 -04006925 if (array == 0)
6926 {
6927 return GL_FALSE;
6928 }
6929
6930 gl::VertexArray *vao = context->getVertexArray(array);
6931
6932 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006933 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006934 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006935 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006936 {
6937 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6938 }
6939
6940 return GL_FALSE;
6941}
6942
6943void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
6944{
6945 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
6946 target, index, data);
6947
6948 try
6949 {
6950 gl::Context *context = gl::getNonLostContext();
6951
6952 if (context)
6953 {
6954 if (context->getClientVersion() < 3)
6955 {
6956 return gl::error(GL_INVALID_OPERATION);
6957 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006958
Shannon Woods15934d52013-08-19 14:28:49 -04006959 switch (target)
6960 {
6961 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
6962 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
6963 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
6964 if (index >= context->getMaxTransformFeedbackBufferBindings())
6965 return gl::error(GL_INVALID_VALUE);
6966 break;
6967 case GL_UNIFORM_BUFFER_START:
6968 case GL_UNIFORM_BUFFER_SIZE:
6969 case GL_UNIFORM_BUFFER_BINDING:
6970 if (index >= context->getMaximumCombinedUniformBufferBindings())
6971 return gl::error(GL_INVALID_VALUE);
6972 break;
6973 default:
6974 return gl::error(GL_INVALID_ENUM);
6975 }
6976
6977 if (!(context->getIndexedIntegerv(target, index, data)))
6978 {
6979 GLenum nativeType;
6980 unsigned int numParams = 0;
6981 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
6982 return gl::error(GL_INVALID_ENUM);
6983
6984 if (numParams == 0)
6985 return; // it is known that pname is valid, but there are no parameters to return
6986
6987 if (nativeType == GL_INT_64_ANGLEX)
6988 {
6989 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
6990 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
6991 GLint64 *int64Params = new GLint64[numParams];
6992
6993 context->getIndexedInteger64v(target, index, int64Params);
6994
6995 for (unsigned int i = 0; i < numParams; ++i)
6996 {
6997 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
6998 data[i] = static_cast<GLint>(clampedValue);
6999 }
7000
7001 delete [] int64Params;
7002 }
7003 else
7004 {
7005 UNREACHABLE();
7006 }
7007 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007008 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007009 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007010 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007011 {
7012 return gl::error(GL_OUT_OF_MEMORY);
7013 }
7014}
7015
7016void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7017{
7018 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7019
7020 try
7021 {
7022 gl::Context *context = gl::getNonLostContext();
7023
7024 if (context)
7025 {
7026 if (context->getClientVersion() < 3)
7027 {
7028 return gl::error(GL_INVALID_OPERATION);
7029 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007030
Geoff Langc8058452014-02-03 12:04:11 -05007031 switch (primitiveMode)
7032 {
7033 case GL_TRIANGLES:
7034 case GL_LINES:
7035 case GL_POINTS:
7036 break;
7037 default:
7038 return gl::error(GL_INVALID_ENUM);
7039 }
7040
7041 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7042 ASSERT(transformFeedback != NULL);
7043
7044 if (transformFeedback->isStarted())
7045 {
7046 return gl::error(GL_INVALID_OPERATION);
7047 }
7048
7049 if (transformFeedback->isPaused())
7050 {
7051 transformFeedback->resume();
7052 }
7053 else
7054 {
7055 transformFeedback->start(primitiveMode);
7056 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007057 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007058 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007059 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007060 {
7061 return gl::error(GL_OUT_OF_MEMORY);
7062 }
7063}
7064
7065void __stdcall glEndTransformFeedback(void)
7066{
7067 EVENT("(void)");
7068
7069 try
7070 {
7071 gl::Context *context = gl::getNonLostContext();
7072
7073 if (context)
7074 {
7075 if (context->getClientVersion() < 3)
7076 {
7077 return gl::error(GL_INVALID_OPERATION);
7078 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007079
Geoff Langc8058452014-02-03 12:04:11 -05007080 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7081 ASSERT(transformFeedback != NULL);
7082
7083 if (!transformFeedback->isStarted())
7084 {
7085 return gl::error(GL_INVALID_OPERATION);
7086 }
7087
7088 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007089 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007090 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007091 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007092 {
7093 return gl::error(GL_OUT_OF_MEMORY);
7094 }
7095}
7096
7097void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7098{
7099 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7100 target, index, buffer, offset, size);
7101
7102 try
7103 {
7104 gl::Context *context = gl::getNonLostContext();
7105
7106 if (context)
7107 {
7108 if (context->getClientVersion() < 3)
7109 {
7110 return gl::error(GL_INVALID_OPERATION);
7111 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007112
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007113 switch (target)
7114 {
7115 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007116 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007117 {
7118 return gl::error(GL_INVALID_VALUE);
7119 }
7120 break;
7121
7122 case GL_UNIFORM_BUFFER:
7123 if (index >= context->getMaximumCombinedUniformBufferBindings())
7124 {
7125 return gl::error(GL_INVALID_VALUE);
7126 }
7127 break;
7128
7129 default:
7130 return gl::error(GL_INVALID_ENUM);
7131 }
7132
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007133 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007134 {
7135 return gl::error(GL_INVALID_VALUE);
7136 }
7137
7138 switch (target)
7139 {
7140 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007141
7142 // size and offset must be a multiple of 4
7143 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7144 {
7145 return gl::error(GL_INVALID_VALUE);
7146 }
7147
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007148 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7149 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007150 break;
7151
7152 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007153
7154 // it is an error to bind an offset not a multiple of the alignment
7155 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7156 {
7157 return gl::error(GL_INVALID_VALUE);
7158 }
7159
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007160 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7161 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007162 break;
7163
7164 default:
7165 UNREACHABLE();
7166 }
7167 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007168 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007169 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007170 {
7171 return gl::error(GL_OUT_OF_MEMORY);
7172 }
7173}
7174
7175void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7176{
7177 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7178 target, index, buffer);
7179
7180 try
7181 {
7182 gl::Context *context = gl::getNonLostContext();
7183
7184 if (context)
7185 {
7186 if (context->getClientVersion() < 3)
7187 {
7188 return gl::error(GL_INVALID_OPERATION);
7189 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007190
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007191 switch (target)
7192 {
7193 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007194 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007195 {
7196 return gl::error(GL_INVALID_VALUE);
7197 }
7198 break;
7199
7200 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007201 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007202 {
7203 return gl::error(GL_INVALID_VALUE);
7204 }
7205 break;
7206
7207 default:
7208 return gl::error(GL_INVALID_ENUM);
7209 }
7210
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007211 switch (target)
7212 {
7213 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007214 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007215 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007216 break;
7217
7218 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007219 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007220 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007221 break;
7222
7223 default:
7224 UNREACHABLE();
7225 }
7226 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007227 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007228 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007229 {
7230 return gl::error(GL_OUT_OF_MEMORY);
7231 }
7232}
7233
7234void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7235{
7236 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7237 program, count, varyings, bufferMode);
7238
7239 try
7240 {
7241 gl::Context *context = gl::getNonLostContext();
7242
7243 if (context)
7244 {
7245 if (context->getClientVersion() < 3)
7246 {
7247 return gl::error(GL_INVALID_OPERATION);
7248 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007249
Geoff Lang48dcae72014-02-05 16:28:24 -05007250 if (count < 0)
7251 {
7252 return gl::error(GL_INVALID_VALUE);
7253 }
7254
7255 switch (bufferMode)
7256 {
7257 case GL_INTERLEAVED_ATTRIBS:
7258 break;
7259 case GL_SEPARATE_ATTRIBS:
7260 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7261 {
7262 return gl::error(GL_INVALID_VALUE);
7263 }
7264 break;
7265 default:
7266 return gl::error(GL_INVALID_ENUM);
7267 }
7268
7269 if (!gl::ValidProgram(context, program))
7270 {
7271 return;
7272 }
7273
7274 gl::Program *programObject = context->getProgram(program);
7275 ASSERT(programObject);
7276
7277 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007278 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007279 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007280 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007281 {
7282 return gl::error(GL_OUT_OF_MEMORY);
7283 }
7284}
7285
7286void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7287{
7288 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7289 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7290 program, index, bufSize, length, size, type, name);
7291
7292 try
7293 {
7294 gl::Context *context = gl::getNonLostContext();
7295
7296 if (context)
7297 {
7298 if (context->getClientVersion() < 3)
7299 {
7300 return gl::error(GL_INVALID_OPERATION);
7301 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007302
Geoff Lang48dcae72014-02-05 16:28:24 -05007303 if (bufSize < 0)
7304 {
7305 return gl::error(GL_INVALID_VALUE);
7306 }
7307
7308 if (!gl::ValidProgram(context, program))
7309 {
7310 return;
7311 }
7312
7313 gl::Program *programObject = context->getProgram(program);
7314 ASSERT(programObject);
7315
7316 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7317 {
7318 return gl::error(GL_INVALID_VALUE);
7319 }
7320
7321 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007322 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007323 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007324 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007325 {
7326 return gl::error(GL_OUT_OF_MEMORY);
7327 }
7328}
7329
7330void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7331{
7332 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7333 index, size, type, stride, pointer);
7334
7335 try
7336 {
7337 gl::Context *context = gl::getNonLostContext();
7338
7339 if (context)
7340 {
7341 if (context->getClientVersion() < 3)
7342 {
7343 return gl::error(GL_INVALID_OPERATION);
7344 }
7345 }
7346
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007347 if (index >= gl::MAX_VERTEX_ATTRIBS)
7348 {
7349 return gl::error(GL_INVALID_VALUE);
7350 }
7351
7352 if (size < 1 || size > 4)
7353 {
7354 return gl::error(GL_INVALID_VALUE);
7355 }
7356
7357 switch (type)
7358 {
7359 case GL_BYTE:
7360 case GL_UNSIGNED_BYTE:
7361 case GL_SHORT:
7362 case GL_UNSIGNED_SHORT:
7363 case GL_INT:
7364 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007365 case GL_INT_2_10_10_10_REV:
7366 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007367 break;
7368 default:
7369 return gl::error(GL_INVALID_ENUM);
7370 }
7371
7372 if (stride < 0)
7373 {
7374 return gl::error(GL_INVALID_VALUE);
7375 }
7376
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007377 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7378 {
7379 return gl::error(GL_INVALID_OPERATION);
7380 }
7381
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007382 if (context)
7383 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007384 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7385 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7386 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7387 // and the pointer argument is not NULL.
7388 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7389 {
7390 return gl::error(GL_INVALID_OPERATION);
7391 }
7392
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007393 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7394 stride, pointer);
7395 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007396 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007397 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007398 {
7399 return gl::error(GL_OUT_OF_MEMORY);
7400 }
7401}
7402
7403void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7404{
7405 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7406 index, pname, params);
7407
7408 try
7409 {
7410 gl::Context *context = gl::getNonLostContext();
7411
7412 if (context)
7413 {
7414 if (context->getClientVersion() < 3)
7415 {
7416 return gl::error(GL_INVALID_OPERATION);
7417 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007418
Jamie Madilla7d05862013-07-02 11:57:06 -04007419 if (index >= gl::MAX_VERTEX_ATTRIBS)
7420 {
7421 return gl::error(GL_INVALID_VALUE);
7422 }
7423
7424 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7425
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007426 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007427 {
7428 return;
7429 }
7430
7431 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7432 {
7433 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7434 for (int i = 0; i < 4; ++i)
7435 {
7436 params[i] = currentValueData.IntValues[i];
7437 }
7438 }
7439 else
7440 {
Brandon Jones5bf98292014-06-06 17:19:38 -07007441 *params = gl::QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
Jamie Madilla7d05862013-07-02 11:57:06 -04007442 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007443 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007444 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007445 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007446 {
7447 return gl::error(GL_OUT_OF_MEMORY);
7448 }
7449}
7450
7451void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7452{
7453 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7454 index, pname, params);
7455
7456 try
7457 {
7458 gl::Context *context = gl::getNonLostContext();
7459
7460 if (context)
7461 {
7462 if (context->getClientVersion() < 3)
7463 {
7464 return gl::error(GL_INVALID_OPERATION);
7465 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007466
Jamie Madilla7d05862013-07-02 11:57:06 -04007467 if (index >= gl::MAX_VERTEX_ATTRIBS)
7468 {
7469 return gl::error(GL_INVALID_VALUE);
7470 }
7471
7472 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7473
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007474 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007475 {
7476 return;
7477 }
7478
7479 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7480 {
7481 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7482 for (int i = 0; i < 4; ++i)
7483 {
7484 params[i] = currentValueData.UnsignedIntValues[i];
7485 }
7486 }
7487 else
7488 {
Brandon Jones5bf98292014-06-06 17:19:38 -07007489 *params = gl::QuerySingleVertexAttributeParameter<GLuint>(attribState, pname);
Jamie Madilla7d05862013-07-02 11:57:06 -04007490 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007491 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007492 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007493 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007494 {
7495 return gl::error(GL_OUT_OF_MEMORY);
7496 }
7497}
7498
7499void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7500{
7501 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7502 index, x, y, z, w);
7503
7504 try
7505 {
7506 gl::Context *context = gl::getNonLostContext();
7507
7508 if (context)
7509 {
7510 if (context->getClientVersion() < 3)
7511 {
7512 return gl::error(GL_INVALID_OPERATION);
7513 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007514
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007515 if (index >= gl::MAX_VERTEX_ATTRIBS)
7516 {
7517 return gl::error(GL_INVALID_VALUE);
7518 }
7519
7520 GLint vals[4] = { x, y, z, w };
7521 context->setVertexAttribi(index, vals);
7522 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007523 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007524 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007525 {
7526 return gl::error(GL_OUT_OF_MEMORY);
7527 }
7528}
7529
7530void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7531{
7532 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7533 index, x, y, z, w);
7534
7535 try
7536 {
7537 gl::Context *context = gl::getNonLostContext();
7538
7539 if (context)
7540 {
7541 if (context->getClientVersion() < 3)
7542 {
7543 return gl::error(GL_INVALID_OPERATION);
7544 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007545
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007546 if (index >= gl::MAX_VERTEX_ATTRIBS)
7547 {
7548 return gl::error(GL_INVALID_VALUE);
7549 }
7550
7551 GLuint vals[4] = { x, y, z, w };
7552 context->setVertexAttribu(index, vals);
7553 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007554 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007555 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007556 {
7557 return gl::error(GL_OUT_OF_MEMORY);
7558 }
7559}
7560
7561void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7562{
7563 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7564
7565 try
7566 {
7567 gl::Context *context = gl::getNonLostContext();
7568
7569 if (context)
7570 {
7571 if (context->getClientVersion() < 3)
7572 {
7573 return gl::error(GL_INVALID_OPERATION);
7574 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007575
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007576 if (index >= gl::MAX_VERTEX_ATTRIBS)
7577 {
7578 return gl::error(GL_INVALID_VALUE);
7579 }
7580
7581 context->setVertexAttribi(index, v);
7582 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007583 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007584 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007585 {
7586 return gl::error(GL_OUT_OF_MEMORY);
7587 }
7588}
7589
7590void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7591{
7592 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7593
7594 try
7595 {
7596 gl::Context *context = gl::getNonLostContext();
7597
7598 if (context)
7599 {
7600 if (context->getClientVersion() < 3)
7601 {
7602 return gl::error(GL_INVALID_OPERATION);
7603 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007604
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007605 if (index >= gl::MAX_VERTEX_ATTRIBS)
7606 {
7607 return gl::error(GL_INVALID_VALUE);
7608 }
7609
7610 context->setVertexAttribu(index, v);
7611 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007612 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007613 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007614 {
7615 return gl::error(GL_OUT_OF_MEMORY);
7616 }
7617}
7618
7619void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7620{
7621 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7622 program, location, params);
7623
7624 try
7625 {
7626 gl::Context *context = gl::getNonLostContext();
7627
7628 if (context)
7629 {
7630 if (context->getClientVersion() < 3)
7631 {
7632 return gl::error(GL_INVALID_OPERATION);
7633 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007634
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007635 if (program == 0)
7636 {
7637 return gl::error(GL_INVALID_VALUE);
7638 }
7639
7640 gl::Program *programObject = context->getProgram(program);
7641
7642 if (!programObject || !programObject->isLinked())
7643 {
7644 return gl::error(GL_INVALID_OPERATION);
7645 }
7646
7647 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7648 if (!programBinary)
7649 {
7650 return gl::error(GL_INVALID_OPERATION);
7651 }
7652
7653 if (!programBinary->getUniformuiv(location, NULL, params))
7654 {
7655 return gl::error(GL_INVALID_OPERATION);
7656 }
7657 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007658 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007659 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007660 {
7661 return gl::error(GL_OUT_OF_MEMORY);
7662 }
7663}
7664
7665GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7666{
7667 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7668 program, name);
7669
7670 try
7671 {
7672 gl::Context *context = gl::getNonLostContext();
7673
7674 if (context)
7675 {
7676 if (context->getClientVersion() < 3)
7677 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007678 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007679 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007680
Jamie Madilld1e78c92013-06-20 11:55:50 -04007681 if (program == 0)
7682 {
7683 return gl::error(GL_INVALID_VALUE, -1);
7684 }
7685
7686 gl::Program *programObject = context->getProgram(program);
7687
7688 if (!programObject || !programObject->isLinked())
7689 {
7690 return gl::error(GL_INVALID_OPERATION, -1);
7691 }
7692
7693 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7694 if (!programBinary)
7695 {
7696 return gl::error(GL_INVALID_OPERATION, -1);
7697 }
7698
7699 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007700 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007701 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007702 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007703 {
7704 return gl::error(GL_OUT_OF_MEMORY, 0);
7705 }
7706
7707 return 0;
7708}
7709
7710void __stdcall glUniform1ui(GLint location, GLuint v0)
7711{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007712 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007713}
7714
7715void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
7716{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007717 const GLuint xy[] = { v0, v1 };
7718 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007719}
7720
7721void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
7722{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007723 const GLuint xyz[] = { v0, v1, v2 };
7724 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007725}
7726
7727void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
7728{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007729 const GLuint xyzw[] = { v0, v1, v2, v3 };
7730 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007731}
7732
7733void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
7734{
7735 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7736 location, count, value);
7737
7738 try
7739 {
7740 gl::Context *context = gl::getNonLostContext();
7741
7742 if (context)
7743 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007744 if (!ValidateUniform(context, GL_UNSIGNED_INT, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007745 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007746 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007747 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007748
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007749 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007750 programBinary->setUniform1uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007751 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007752 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007753 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007754 {
7755 return gl::error(GL_OUT_OF_MEMORY);
7756 }
7757}
7758
7759void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
7760{
7761 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7762 location, count, value);
7763
7764 try
7765 {
7766 gl::Context *context = gl::getNonLostContext();
7767
7768 if (context)
7769 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007770 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC2, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007771 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007772 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007773 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007774
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007775 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007776 programBinary->setUniform2uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007777 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007778 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007779 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007780 {
7781 return gl::error(GL_OUT_OF_MEMORY);
7782 }
7783}
7784
7785void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
7786{
7787 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
7788 location, count, value);
7789
7790 try
7791 {
7792 gl::Context *context = gl::getNonLostContext();
7793
7794 if (context)
7795 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007796 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC3, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007797 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007798 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007799 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007800
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007801 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007802 programBinary->setUniform3uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007803 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007804 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007805 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007806 {
7807 return gl::error(GL_OUT_OF_MEMORY);
7808 }
7809}
7810
7811void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
7812{
7813 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7814 location, count, value);
7815
7816 try
7817 {
7818 gl::Context *context = gl::getNonLostContext();
7819
7820 if (context)
7821 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007822 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC4, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007823 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007824 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007825 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007826
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007827 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007828 programBinary->setUniform4uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007829 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007830 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007831 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007832 {
7833 return gl::error(GL_OUT_OF_MEMORY);
7834 }
7835}
7836
7837void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
7838{
7839 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
7840 buffer, drawbuffer, value);
7841
7842 try
7843 {
7844 gl::Context *context = gl::getNonLostContext();
7845
7846 if (context)
7847 {
7848 if (context->getClientVersion() < 3)
7849 {
7850 return gl::error(GL_INVALID_OPERATION);
7851 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007852
Geoff Lang42359ca2013-08-21 13:25:17 -04007853 switch (buffer)
7854 {
7855 case GL_COLOR:
7856 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7857 {
7858 return gl::error(GL_INVALID_VALUE);
7859 }
7860 break;
7861 case GL_STENCIL:
7862 if (drawbuffer != 0)
7863 {
7864 return gl::error(GL_INVALID_VALUE);
7865 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05007866 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04007867 default:
7868 return gl::error(GL_INVALID_ENUM);
7869 }
7870
7871 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007872 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007873 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007874 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007875 {
7876 return gl::error(GL_OUT_OF_MEMORY);
7877 }
7878}
7879
7880void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
7881{
7882 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
7883 buffer, drawbuffer, value);
7884
7885 try
7886 {
7887 gl::Context *context = gl::getNonLostContext();
7888
7889 if (context)
7890 {
7891 if (context->getClientVersion() < 3)
7892 {
7893 return gl::error(GL_INVALID_OPERATION);
7894 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007895
Geoff Lang42359ca2013-08-21 13:25:17 -04007896 switch (buffer)
7897 {
7898 case GL_COLOR:
7899 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7900 {
7901 return gl::error(GL_INVALID_VALUE);
7902 }
7903 break;
7904 default:
7905 return gl::error(GL_INVALID_ENUM);
7906 }
7907
7908 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007909 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007910 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007911 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007912 {
7913 return gl::error(GL_OUT_OF_MEMORY);
7914 }
7915}
7916
7917void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
7918{
7919 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
7920 buffer, drawbuffer, value);
7921
7922 try
7923 {
7924 gl::Context *context = gl::getNonLostContext();
7925
7926 if (context)
7927 {
7928 if (context->getClientVersion() < 3)
7929 {
7930 return gl::error(GL_INVALID_OPERATION);
7931 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007932
Geoff Lang42359ca2013-08-21 13:25:17 -04007933 switch (buffer)
7934 {
7935 case GL_COLOR:
7936 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7937 {
7938 return gl::error(GL_INVALID_VALUE);
7939 }
7940 break;
7941 case GL_DEPTH:
7942 if (drawbuffer != 0)
7943 {
7944 return gl::error(GL_INVALID_VALUE);
7945 }
7946 break;
7947 default:
7948 return gl::error(GL_INVALID_ENUM);
7949 }
7950
7951 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007952 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007953 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007954 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007955 {
7956 return gl::error(GL_OUT_OF_MEMORY);
7957 }
7958}
7959
7960void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
7961{
7962 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
7963 buffer, drawbuffer, depth, stencil);
7964
7965 try
7966 {
7967 gl::Context *context = gl::getNonLostContext();
7968
7969 if (context)
7970 {
7971 if (context->getClientVersion() < 3)
7972 {
7973 return gl::error(GL_INVALID_OPERATION);
7974 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007975
Geoff Lang42359ca2013-08-21 13:25:17 -04007976 switch (buffer)
7977 {
7978 case GL_DEPTH_STENCIL:
7979 if (drawbuffer != 0)
7980 {
7981 return gl::error(GL_INVALID_VALUE);
7982 }
7983 break;
7984 default:
7985 return gl::error(GL_INVALID_ENUM);
7986 }
7987
7988 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007989 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007990 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007991 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007992 {
7993 return gl::error(GL_OUT_OF_MEMORY);
7994 }
7995}
7996
7997const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
7998{
7999 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8000
8001 try
8002 {
8003 gl::Context *context = gl::getNonLostContext();
8004
8005 if (context)
8006 {
8007 if (context->getClientVersion() < 3)
8008 {
8009 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8010 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008011
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008012 if (name != GL_EXTENSIONS)
8013 {
8014 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8015 }
8016
Geoff Langcec35902014-04-16 10:52:36 -04008017 if (index >= context->getExtensionStringCount())
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008018 {
8019 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8020 }
Geoff Langcec35902014-04-16 10:52:36 -04008021
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008022 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8023 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008024 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008025 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008026 {
8027 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8028 }
8029
8030 return NULL;
8031}
8032
8033void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8034{
8035 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8036 readTarget, writeTarget, readOffset, writeOffset, size);
8037
8038 try
8039 {
8040 gl::Context *context = gl::getNonLostContext();
8041
8042 if (context)
8043 {
8044 if (context->getClientVersion() < 3)
8045 {
8046 return gl::error(GL_INVALID_OPERATION);
8047 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008048
Jamie Madill8c96d582014-03-05 15:01:23 -05008049 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008050 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008051 return gl::error(GL_INVALID_ENUM);
8052 }
8053
Jamie Madill8c96d582014-03-05 15:01:23 -05008054 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8055 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008056
8057 if (!readBuffer || !writeBuffer)
8058 {
8059 return gl::error(GL_INVALID_OPERATION);
8060 }
8061
Jamie Madill7a5f7382014-03-05 15:01:24 -05008062 if (readBuffer->mapped() || writeBuffer->mapped())
8063 {
8064 return gl::error(GL_INVALID_OPERATION);
8065 }
8066
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008067 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8068 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8069 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8070 {
8071 return gl::error(GL_INVALID_VALUE);
8072 }
8073
8074 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8075 {
8076 return gl::error(GL_INVALID_VALUE);
8077 }
8078
8079 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8080
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008081 // if size is zero, the copy is a successful no-op
8082 if (size > 0)
8083 {
8084 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8085 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008086 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008087 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008088 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008089 {
8090 return gl::error(GL_OUT_OF_MEMORY);
8091 }
8092}
8093
8094void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8095{
8096 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8097 program, uniformCount, uniformNames, uniformIndices);
8098
8099 try
8100 {
8101 gl::Context *context = gl::getNonLostContext();
8102
8103 if (context)
8104 {
8105 if (context->getClientVersion() < 3)
8106 {
8107 return gl::error(GL_INVALID_OPERATION);
8108 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008109
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008110 if (uniformCount < 0)
8111 {
8112 return gl::error(GL_INVALID_VALUE);
8113 }
8114
8115 gl::Program *programObject = context->getProgram(program);
8116
8117 if (!programObject)
8118 {
8119 if (context->getShader(program))
8120 {
8121 return gl::error(GL_INVALID_OPERATION);
8122 }
8123 else
8124 {
8125 return gl::error(GL_INVALID_VALUE);
8126 }
8127 }
8128
8129 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8130 if (!programObject->isLinked() || !programBinary)
8131 {
8132 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8133 {
8134 uniformIndices[uniformId] = GL_INVALID_INDEX;
8135 }
8136 }
8137 else
8138 {
8139 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8140 {
8141 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8142 }
8143 }
8144 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008145 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008146 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008147 {
8148 return gl::error(GL_OUT_OF_MEMORY);
8149 }
8150}
8151
8152void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8153{
8154 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8155 program, uniformCount, uniformIndices, pname, params);
8156
8157 try
8158 {
8159 gl::Context *context = gl::getNonLostContext();
8160
8161 if (context)
8162 {
8163 if (context->getClientVersion() < 3)
8164 {
8165 return gl::error(GL_INVALID_OPERATION);
8166 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008167
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008168 if (uniformCount < 0)
8169 {
8170 return gl::error(GL_INVALID_VALUE);
8171 }
8172
8173 gl::Program *programObject = context->getProgram(program);
8174
8175 if (!programObject)
8176 {
8177 if (context->getShader(program))
8178 {
8179 return gl::error(GL_INVALID_OPERATION);
8180 }
8181 else
8182 {
8183 return gl::error(GL_INVALID_VALUE);
8184 }
8185 }
8186
8187 switch (pname)
8188 {
8189 case GL_UNIFORM_TYPE:
8190 case GL_UNIFORM_SIZE:
8191 case GL_UNIFORM_NAME_LENGTH:
8192 case GL_UNIFORM_BLOCK_INDEX:
8193 case GL_UNIFORM_OFFSET:
8194 case GL_UNIFORM_ARRAY_STRIDE:
8195 case GL_UNIFORM_MATRIX_STRIDE:
8196 case GL_UNIFORM_IS_ROW_MAJOR:
8197 break;
8198 default:
8199 return gl::error(GL_INVALID_ENUM);
8200 }
8201
8202 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8203
8204 if (!programBinary && uniformCount > 0)
8205 {
8206 return gl::error(GL_INVALID_VALUE);
8207 }
8208
8209 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8210 {
8211 const GLuint index = uniformIndices[uniformId];
8212
8213 if (index >= (GLuint)programBinary->getActiveUniformCount())
8214 {
8215 return gl::error(GL_INVALID_VALUE);
8216 }
8217 }
8218
8219 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8220 {
8221 const GLuint index = uniformIndices[uniformId];
8222 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8223 }
8224 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008225 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008226 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008227 {
8228 return gl::error(GL_OUT_OF_MEMORY);
8229 }
8230}
8231
8232GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8233{
8234 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8235
8236 try
8237 {
8238 gl::Context *context = gl::getNonLostContext();
8239
8240 if (context)
8241 {
8242 if (context->getClientVersion() < 3)
8243 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008244 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008245 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008246
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008247 gl::Program *programObject = context->getProgram(program);
8248
8249 if (!programObject)
8250 {
8251 if (context->getShader(program))
8252 {
8253 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8254 }
8255 else
8256 {
8257 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8258 }
8259 }
8260
8261 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8262 if (!programBinary)
8263 {
8264 return GL_INVALID_INDEX;
8265 }
8266
8267 return programBinary->getUniformBlockIndex(uniformBlockName);
8268 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008269 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008270 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008271 {
8272 return gl::error(GL_OUT_OF_MEMORY, 0);
8273 }
8274
8275 return 0;
8276}
8277
8278void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8279{
8280 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8281 program, uniformBlockIndex, pname, params);
8282
8283 try
8284 {
8285 gl::Context *context = gl::getNonLostContext();
8286
8287 if (context)
8288 {
8289 if (context->getClientVersion() < 3)
8290 {
8291 return gl::error(GL_INVALID_OPERATION);
8292 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008293 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008294
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008295 if (!programObject)
8296 {
8297 if (context->getShader(program))
8298 {
8299 return gl::error(GL_INVALID_OPERATION);
8300 }
8301 else
8302 {
8303 return gl::error(GL_INVALID_VALUE);
8304 }
8305 }
8306
8307 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8308
8309 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8310 {
8311 return gl::error(GL_INVALID_VALUE);
8312 }
8313
8314 switch (pname)
8315 {
8316 case GL_UNIFORM_BLOCK_BINDING:
8317 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8318 break;
8319
8320 case GL_UNIFORM_BLOCK_DATA_SIZE:
8321 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8322 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8323 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8324 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8325 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8326 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8327 break;
8328
8329 default:
8330 return gl::error(GL_INVALID_ENUM);
8331 }
8332 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008333 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008334 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008335 {
8336 return gl::error(GL_OUT_OF_MEMORY);
8337 }
8338}
8339
8340void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8341{
8342 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8343 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8344
8345 try
8346 {
8347 gl::Context *context = gl::getNonLostContext();
8348
8349 if (context)
8350 {
8351 if (context->getClientVersion() < 3)
8352 {
8353 return gl::error(GL_INVALID_OPERATION);
8354 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008355
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008356 gl::Program *programObject = context->getProgram(program);
8357
8358 if (!programObject)
8359 {
8360 if (context->getShader(program))
8361 {
8362 return gl::error(GL_INVALID_OPERATION);
8363 }
8364 else
8365 {
8366 return gl::error(GL_INVALID_VALUE);
8367 }
8368 }
8369
8370 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8371
8372 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8373 {
8374 return gl::error(GL_INVALID_VALUE);
8375 }
8376
8377 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8378 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008379 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008380 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008381 {
8382 return gl::error(GL_OUT_OF_MEMORY);
8383 }
8384}
8385
8386void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8387{
8388 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8389 program, uniformBlockIndex, uniformBlockBinding);
8390
8391 try
8392 {
8393 gl::Context *context = gl::getNonLostContext();
8394
8395 if (context)
8396 {
8397 if (context->getClientVersion() < 3)
8398 {
8399 return gl::error(GL_INVALID_OPERATION);
8400 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008401
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008402 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8403 {
8404 return gl::error(GL_INVALID_VALUE);
8405 }
8406
8407 gl::Program *programObject = context->getProgram(program);
8408
8409 if (!programObject)
8410 {
8411 if (context->getShader(program))
8412 {
8413 return gl::error(GL_INVALID_OPERATION);
8414 }
8415 else
8416 {
8417 return gl::error(GL_INVALID_VALUE);
8418 }
8419 }
8420
8421 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8422
8423 // if never linked, there won't be any uniform blocks
8424 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8425 {
8426 return gl::error(GL_INVALID_VALUE);
8427 }
8428
8429 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8430 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008431 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008432 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008433 {
8434 return gl::error(GL_OUT_OF_MEMORY);
8435 }
8436}
8437
8438void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8439{
8440 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8441 mode, first, count, instanceCount);
8442
8443 try
8444 {
8445 gl::Context *context = gl::getNonLostContext();
8446
8447 if (context)
8448 {
8449 if (context->getClientVersion() < 3)
8450 {
8451 return gl::error(GL_INVALID_OPERATION);
8452 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008453
Jamie Madill54133512013-06-21 09:33:07 -04008454 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008455 UNIMPLEMENTED();
8456 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008457 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008458 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008459 {
8460 return gl::error(GL_OUT_OF_MEMORY);
8461 }
8462}
8463
8464void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8465{
8466 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8467 mode, count, type, indices, instanceCount);
8468
8469 try
8470 {
8471 gl::Context *context = gl::getNonLostContext();
8472
8473 if (context)
8474 {
8475 if (context->getClientVersion() < 3)
8476 {
8477 return gl::error(GL_INVALID_OPERATION);
8478 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008479
Jamie Madill54133512013-06-21 09:33:07 -04008480 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008481 UNIMPLEMENTED();
8482 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008483 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008484 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008485 {
8486 return gl::error(GL_OUT_OF_MEMORY);
8487 }
8488}
8489
8490GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8491{
8492 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8493
8494 try
8495 {
8496 gl::Context *context = gl::getNonLostContext();
8497
8498 if (context)
8499 {
8500 if (context->getClientVersion() < 3)
8501 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008502 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008503 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008504
Jamie Madill5215e1a2013-07-26 11:55:19 -04008505 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8506 {
8507 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8508 }
8509
8510 if (flags != 0)
8511 {
8512 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8513 }
8514
8515 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008516 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008517 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008518 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008519 {
8520 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8521 }
8522
8523 return NULL;
8524}
8525
8526GLboolean __stdcall glIsSync(GLsync sync)
8527{
8528 EVENT("(GLsync sync = 0x%0.8p)", sync);
8529
8530 try
8531 {
8532 gl::Context *context = gl::getNonLostContext();
8533
8534 if (context)
8535 {
8536 if (context->getClientVersion() < 3)
8537 {
8538 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8539 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008540
Jamie Madill5215e1a2013-07-26 11:55:19 -04008541 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008542 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008543 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008544 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008545 {
8546 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8547 }
8548
8549 return GL_FALSE;
8550}
8551
8552void __stdcall glDeleteSync(GLsync sync)
8553{
8554 EVENT("(GLsync sync = 0x%0.8p)", sync);
8555
8556 try
8557 {
8558 gl::Context *context = gl::getNonLostContext();
8559
8560 if (context)
8561 {
8562 if (context->getClientVersion() < 3)
8563 {
8564 return gl::error(GL_INVALID_OPERATION);
8565 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008566
Jamie Madill5215e1a2013-07-26 11:55:19 -04008567 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8568 {
8569 return gl::error(GL_INVALID_VALUE);
8570 }
8571
8572 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008573 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008574 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008575 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008576 {
8577 return gl::error(GL_OUT_OF_MEMORY);
8578 }
8579}
8580
8581GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8582{
8583 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8584 sync, flags, timeout);
8585
8586 try
8587 {
8588 gl::Context *context = gl::getNonLostContext();
8589
8590 if (context)
8591 {
8592 if (context->getClientVersion() < 3)
8593 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008594 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008595 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008596
Jamie Madill5215e1a2013-07-26 11:55:19 -04008597 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8598 {
8599 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8600 }
8601
8602 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8603
8604 if (!fenceSync)
8605 {
8606 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8607 }
8608
8609 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008610 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008611 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008612 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008613 {
8614 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8615 }
8616
8617 return GL_FALSE;
8618}
8619
8620void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8621{
8622 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8623 sync, flags, timeout);
8624
8625 try
8626 {
8627 gl::Context *context = gl::getNonLostContext();
8628
8629 if (context)
8630 {
8631 if (context->getClientVersion() < 3)
8632 {
8633 return gl::error(GL_INVALID_OPERATION);
8634 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008635
Jamie Madill5215e1a2013-07-26 11:55:19 -04008636 if (flags != 0)
8637 {
8638 return gl::error(GL_INVALID_VALUE);
8639 }
8640
8641 if (timeout != GL_TIMEOUT_IGNORED)
8642 {
8643 return gl::error(GL_INVALID_VALUE);
8644 }
8645
8646 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8647
8648 if (!fenceSync)
8649 {
8650 return gl::error(GL_INVALID_VALUE);
8651 }
8652
8653 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008654 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008655 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008656 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008657 {
8658 return gl::error(GL_OUT_OF_MEMORY);
8659 }
8660}
8661
8662void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8663{
8664 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8665 pname, params);
8666
8667 try
8668 {
8669 gl::Context *context = gl::getNonLostContext();
8670
8671 if (context)
8672 {
8673 if (context->getClientVersion() < 3)
8674 {
8675 return gl::error(GL_INVALID_OPERATION);
8676 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008677
Jamie Madill79f2f452013-12-19 11:13:02 -05008678 GLenum nativeType;
8679 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04008680 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
8681 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008682 return;
Jamie Madill893ab082014-05-16 16:56:10 -04008683 }
Jamie Madill79f2f452013-12-19 11:13:02 -05008684
8685 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04008686 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008687 context->getInteger64v(pname, params);
8688 }
Jamie Madill55856b12014-01-02 13:59:50 -05008689 else
Jamie Madill79f2f452013-12-19 11:13:02 -05008690 {
Jamie Madill55856b12014-01-02 13:59:50 -05008691 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04008692 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008693 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008694 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008695 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008696 {
8697 return gl::error(GL_OUT_OF_MEMORY);
8698 }
8699}
8700
8701void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8702{
8703 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8704 sync, pname, bufSize, length, values);
8705
8706 try
8707 {
8708 gl::Context *context = gl::getNonLostContext();
8709
8710 if (context)
8711 {
8712 if (context->getClientVersion() < 3)
8713 {
8714 return gl::error(GL_INVALID_OPERATION);
8715 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008716
Jamie Madill5215e1a2013-07-26 11:55:19 -04008717 if (bufSize < 0)
8718 {
8719 return gl::error(GL_INVALID_VALUE);
8720 }
8721
8722 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8723
8724 if (!fenceSync)
8725 {
8726 return gl::error(GL_INVALID_VALUE);
8727 }
8728
8729 switch (pname)
8730 {
8731 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
8732 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
8733 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
8734 case GL_SYNC_FLAGS: values[0] = 0; break;
8735
8736 default:
8737 return gl::error(GL_INVALID_ENUM);
8738 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008739 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008740 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008741 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008742 {
8743 return gl::error(GL_OUT_OF_MEMORY);
8744 }
8745}
8746
8747void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8748{
8749 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8750 target, index, data);
8751
8752 try
8753 {
8754 gl::Context *context = gl::getNonLostContext();
8755
8756 if (context)
8757 {
8758 if (context->getClientVersion() < 3)
8759 {
8760 return gl::error(GL_INVALID_OPERATION);
8761 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008762
Shannon Woods15934d52013-08-19 14:28:49 -04008763 switch (target)
8764 {
8765 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
8766 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
8767 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
8768 if (index >= context->getMaxTransformFeedbackBufferBindings())
8769 return gl::error(GL_INVALID_VALUE);
8770 break;
8771 case GL_UNIFORM_BUFFER_START:
8772 case GL_UNIFORM_BUFFER_SIZE:
8773 case GL_UNIFORM_BUFFER_BINDING:
8774 if (index >= context->getMaximumCombinedUniformBufferBindings())
8775 return gl::error(GL_INVALID_VALUE);
8776 break;
8777 default:
8778 return gl::error(GL_INVALID_ENUM);
8779 }
8780
8781 if (!(context->getIndexedInteger64v(target, index, data)))
8782 {
8783 GLenum nativeType;
8784 unsigned int numParams = 0;
8785 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
8786 return gl::error(GL_INVALID_ENUM);
8787
8788 if (numParams == 0)
8789 return; // it is known that pname is valid, but there are no parameters to return
8790
8791 if (nativeType == GL_INT)
8792 {
8793 GLint *intParams = new GLint[numParams];
8794
8795 context->getIndexedIntegerv(target, index, intParams);
8796
8797 for (unsigned int i = 0; i < numParams; ++i)
8798 {
8799 data[i] = static_cast<GLint64>(intParams[i]);
8800 }
8801
8802 delete [] intParams;
8803 }
8804 else
8805 {
8806 UNREACHABLE();
8807 }
8808 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008809 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008810 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008811 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008812 {
8813 return gl::error(GL_OUT_OF_MEMORY);
8814 }
8815}
8816
8817void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8818{
8819 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8820 target, pname, params);
8821
8822 try
8823 {
8824 gl::Context *context = gl::getNonLostContext();
8825
8826 if (context)
8827 {
8828 if (context->getClientVersion() < 3)
8829 {
8830 return gl::error(GL_INVALID_OPERATION);
8831 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008832
Jamie Madill70656a62014-03-05 15:01:26 -05008833 if (!gl::ValidBufferTarget(context, target))
8834 {
8835 return gl::error(GL_INVALID_ENUM);
8836 }
8837
8838 if (!gl::ValidBufferParameter(context, pname))
8839 {
8840 return gl::error(GL_INVALID_ENUM);
8841 }
8842
8843 gl::Buffer *buffer = context->getTargetBuffer(target);
8844
8845 if (!buffer)
8846 {
8847 // A null buffer means that "0" is bound to the requested buffer target
8848 return gl::error(GL_INVALID_OPERATION);
8849 }
8850
8851 switch (pname)
8852 {
8853 case GL_BUFFER_USAGE:
8854 *params = static_cast<GLint64>(buffer->usage());
8855 break;
8856 case GL_BUFFER_SIZE:
8857 *params = buffer->size();
8858 break;
8859 case GL_BUFFER_ACCESS_FLAGS:
8860 *params = static_cast<GLint64>(buffer->accessFlags());
8861 break;
8862 case GL_BUFFER_MAPPED:
8863 *params = static_cast<GLint64>(buffer->mapped());
8864 break;
8865 case GL_BUFFER_MAP_OFFSET:
8866 *params = buffer->mapOffset();
8867 break;
8868 case GL_BUFFER_MAP_LENGTH:
8869 *params = buffer->mapLength();
8870 break;
8871 default: UNREACHABLE(); break;
8872 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008873 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008874 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008875 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008876 {
8877 return gl::error(GL_OUT_OF_MEMORY);
8878 }
8879}
8880
8881void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
8882{
8883 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
8884
8885 try
8886 {
8887 gl::Context *context = gl::getNonLostContext();
8888
8889 if (context)
8890 {
8891 if (context->getClientVersion() < 3)
8892 {
8893 return gl::error(GL_INVALID_OPERATION);
8894 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008895
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008896 if (count < 0)
8897 {
8898 return gl::error(GL_INVALID_VALUE);
8899 }
8900
8901 for (int i = 0; i < count; i++)
8902 {
8903 samplers[i] = context->createSampler();
8904 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008905 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008906 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008907 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008908 {
8909 return gl::error(GL_OUT_OF_MEMORY);
8910 }
8911}
8912
8913void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
8914{
8915 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
8916
8917 try
8918 {
8919 gl::Context *context = gl::getNonLostContext();
8920
8921 if (context)
8922 {
8923 if (context->getClientVersion() < 3)
8924 {
8925 return gl::error(GL_INVALID_OPERATION);
8926 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008927
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008928 if (count < 0)
8929 {
8930 return gl::error(GL_INVALID_VALUE);
8931 }
8932
8933 for (int i = 0; i < count; i++)
8934 {
8935 context->deleteSampler(samplers[i]);
8936 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008937 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008938 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008939 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008940 {
8941 return gl::error(GL_OUT_OF_MEMORY);
8942 }
8943}
8944
8945GLboolean __stdcall glIsSampler(GLuint sampler)
8946{
8947 EVENT("(GLuint sampler = %u)", sampler);
8948
8949 try
8950 {
8951 gl::Context *context = gl::getNonLostContext();
8952
8953 if (context)
8954 {
8955 if (context->getClientVersion() < 3)
8956 {
8957 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8958 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008959
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008960 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008962 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008963 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008964 {
8965 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8966 }
8967
8968 return GL_FALSE;
8969}
8970
8971void __stdcall glBindSampler(GLuint unit, GLuint sampler)
8972{
8973 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
8974
8975 try
8976 {
8977 gl::Context *context = gl::getNonLostContext();
8978
8979 if (context)
8980 {
8981 if (context->getClientVersion() < 3)
8982 {
8983 return gl::error(GL_INVALID_OPERATION);
8984 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008985
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008986 if (sampler != 0 && !context->isSampler(sampler))
8987 {
8988 return gl::error(GL_INVALID_OPERATION);
8989 }
8990
8991 if (unit >= context->getMaximumCombinedTextureImageUnits())
8992 {
8993 return gl::error(GL_INVALID_VALUE);
8994 }
8995
8996 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008997 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008998 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008999 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009000 {
9001 return gl::error(GL_OUT_OF_MEMORY);
9002 }
9003}
9004
9005void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9006{
9007 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9008
9009 try
9010 {
9011 gl::Context *context = gl::getNonLostContext();
9012
9013 if (context)
9014 {
9015 if (context->getClientVersion() < 3)
9016 {
9017 return gl::error(GL_INVALID_OPERATION);
9018 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009019
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009020 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009021 {
9022 return;
9023 }
9024
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009025 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009026 {
9027 return;
9028 }
9029
9030 if (!context->isSampler(sampler))
9031 {
9032 return gl::error(GL_INVALID_OPERATION);
9033 }
9034
9035 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009036 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009037 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009038 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009039 {
9040 return gl::error(GL_OUT_OF_MEMORY);
9041 }
9042}
9043
9044void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9045{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009046 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009047}
9048
9049void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9050{
9051 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9052
9053 try
9054 {
9055 gl::Context *context = gl::getNonLostContext();
9056
9057 if (context)
9058 {
9059 if (context->getClientVersion() < 3)
9060 {
9061 return gl::error(GL_INVALID_OPERATION);
9062 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009063
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009064 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009065 {
9066 return;
9067 }
9068
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009069 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009070 {
9071 return;
9072 }
9073
9074 if (!context->isSampler(sampler))
9075 {
9076 return gl::error(GL_INVALID_OPERATION);
9077 }
9078
9079 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009080 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009081 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009082 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009083 {
9084 return gl::error(GL_OUT_OF_MEMORY);
9085 }
9086}
9087
9088void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9089{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009090 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009091}
9092
9093void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9094{
9095 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9096
9097 try
9098 {
9099 gl::Context *context = gl::getNonLostContext();
9100
9101 if (context)
9102 {
9103 if (context->getClientVersion() < 3)
9104 {
9105 return gl::error(GL_INVALID_OPERATION);
9106 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009107
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009108 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009109 {
9110 return;
9111 }
9112
9113 if (!context->isSampler(sampler))
9114 {
9115 return gl::error(GL_INVALID_OPERATION);
9116 }
9117
9118 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009119 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009120 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009121 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009122 {
9123 return gl::error(GL_OUT_OF_MEMORY);
9124 }
9125}
9126
9127void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9128{
9129 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, 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
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009142 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009143 {
9144 return;
9145 }
9146
9147 if (!context->isSampler(sampler))
9148 {
9149 return gl::error(GL_INVALID_OPERATION);
9150 }
9151
9152 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009153 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009154 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009155 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009156 {
9157 return gl::error(GL_OUT_OF_MEMORY);
9158 }
9159}
9160
9161void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9162{
9163 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9164
9165 try
9166 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009167 if (index >= gl::MAX_VERTEX_ATTRIBS)
9168 {
9169 return gl::error(GL_INVALID_VALUE);
9170 }
9171
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009172 gl::Context *context = gl::getNonLostContext();
9173
9174 if (context)
9175 {
9176 if (context->getClientVersion() < 3)
9177 {
9178 return gl::error(GL_INVALID_OPERATION);
9179 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009180
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009181 context->setVertexAttribDivisor(index, divisor);
9182 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009183 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009184 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009185 {
9186 return gl::error(GL_OUT_OF_MEMORY);
9187 }
9188}
9189
9190void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9191{
9192 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9193
9194 try
9195 {
9196 gl::Context *context = gl::getNonLostContext();
9197
9198 if (context)
9199 {
9200 if (context->getClientVersion() < 3)
9201 {
9202 return gl::error(GL_INVALID_OPERATION);
9203 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009204
Geoff Langc8058452014-02-03 12:04:11 -05009205 switch (target)
9206 {
9207 case GL_TRANSFORM_FEEDBACK:
9208 {
9209 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9210 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9211 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9212 {
9213 return gl::error(GL_INVALID_OPERATION);
9214 }
9215
9216 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9217 if (context->getTransformFeedback(id) == NULL)
9218 {
9219 return gl::error(GL_INVALID_OPERATION);
9220 }
9221
9222 context->bindTransformFeedback(id);
9223 }
9224 break;
9225
9226 default:
9227 return gl::error(GL_INVALID_ENUM);
9228 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009229 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009230 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009231 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009232 {
9233 return gl::error(GL_OUT_OF_MEMORY);
9234 }
9235}
9236
9237void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9238{
9239 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9240
9241 try
9242 {
9243 gl::Context *context = gl::getNonLostContext();
9244
9245 if (context)
9246 {
9247 if (context->getClientVersion() < 3)
9248 {
9249 return gl::error(GL_INVALID_OPERATION);
9250 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009251
Geoff Langc8058452014-02-03 12:04:11 -05009252 for (int i = 0; i < n; i++)
9253 {
9254 context->deleteTransformFeedback(ids[i]);
9255 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009256 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009257 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009258 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009259 {
9260 return gl::error(GL_OUT_OF_MEMORY);
9261 }
9262}
9263
9264void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9265{
9266 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9267
9268 try
9269 {
9270 gl::Context *context = gl::getNonLostContext();
9271
9272 if (context)
9273 {
9274 if (context->getClientVersion() < 3)
9275 {
9276 return gl::error(GL_INVALID_OPERATION);
9277 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009278
Geoff Langc8058452014-02-03 12:04:11 -05009279 for (int i = 0; i < n; i++)
9280 {
9281 ids[i] = context->createTransformFeedback();
9282 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009283 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009284 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009285 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009286 {
9287 return gl::error(GL_OUT_OF_MEMORY);
9288 }
9289}
9290
9291GLboolean __stdcall glIsTransformFeedback(GLuint id)
9292{
9293 EVENT("(GLuint id = %u)", id);
9294
9295 try
9296 {
9297 gl::Context *context = gl::getNonLostContext();
9298
9299 if (context)
9300 {
9301 if (context->getClientVersion() < 3)
9302 {
9303 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9304 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009305
Geoff Langc8058452014-02-03 12:04:11 -05009306 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009307 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009308 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009309 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009310 {
9311 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9312 }
9313
9314 return GL_FALSE;
9315}
9316
9317void __stdcall glPauseTransformFeedback(void)
9318{
9319 EVENT("(void)");
9320
9321 try
9322 {
9323 gl::Context *context = gl::getNonLostContext();
9324
9325 if (context)
9326 {
9327 if (context->getClientVersion() < 3)
9328 {
9329 return gl::error(GL_INVALID_OPERATION);
9330 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009331
Geoff Langc8058452014-02-03 12:04:11 -05009332 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9333 ASSERT(transformFeedback != NULL);
9334
9335 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9336 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9337 {
9338 return gl::error(GL_INVALID_OPERATION);
9339 }
9340
9341 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009342 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009343 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009344 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009345 {
9346 return gl::error(GL_OUT_OF_MEMORY);
9347 }
9348}
9349
9350void __stdcall glResumeTransformFeedback(void)
9351{
9352 EVENT("(void)");
9353
9354 try
9355 {
9356 gl::Context *context = gl::getNonLostContext();
9357
9358 if (context)
9359 {
9360 if (context->getClientVersion() < 3)
9361 {
9362 return gl::error(GL_INVALID_OPERATION);
9363 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009364
Geoff Langc8058452014-02-03 12:04:11 -05009365 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9366 ASSERT(transformFeedback != NULL);
9367
9368 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9369 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9370 {
9371 return gl::error(GL_INVALID_OPERATION);
9372 }
9373
9374 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009375 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009376 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009377 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009378 {
9379 return gl::error(GL_OUT_OF_MEMORY);
9380 }
9381}
9382
9383void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9384{
9385 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9386 program, bufSize, length, binaryFormat, binary);
9387
9388 try
9389 {
9390 gl::Context *context = gl::getNonLostContext();
9391
9392 if (context)
9393 {
9394 if (context->getClientVersion() < 3)
9395 {
9396 return gl::error(GL_INVALID_OPERATION);
9397 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009398
Jamie Madill54133512013-06-21 09:33:07 -04009399 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009400 UNIMPLEMENTED();
9401 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009402 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009403 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009404 {
9405 return gl::error(GL_OUT_OF_MEMORY);
9406 }
9407}
9408
9409void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9410{
9411 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9412 program, binaryFormat, binary, length);
9413
9414 try
9415 {
9416 gl::Context *context = gl::getNonLostContext();
9417
9418 if (context)
9419 {
9420 if (context->getClientVersion() < 3)
9421 {
9422 return gl::error(GL_INVALID_OPERATION);
9423 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009424
Jamie Madill54133512013-06-21 09:33:07 -04009425 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009426 UNIMPLEMENTED();
9427 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009428 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009429 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009430 {
9431 return gl::error(GL_OUT_OF_MEMORY);
9432 }
9433}
9434
9435void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9436{
9437 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9438 program, pname, value);
9439
9440 try
9441 {
9442 gl::Context *context = gl::getNonLostContext();
9443
9444 if (context)
9445 {
9446 if (context->getClientVersion() < 3)
9447 {
9448 return gl::error(GL_INVALID_OPERATION);
9449 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009450
Jamie Madill54133512013-06-21 09:33:07 -04009451 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009452 UNIMPLEMENTED();
9453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009454 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009455 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009456 {
9457 return gl::error(GL_OUT_OF_MEMORY);
9458 }
9459}
9460
9461void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9462{
9463 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9464 target, numAttachments, attachments);
9465
9466 try
9467 {
9468 gl::Context *context = gl::getNonLostContext();
9469
9470 if (context)
9471 {
9472 if (context->getClientVersion() < 3)
9473 {
9474 return gl::error(GL_INVALID_OPERATION);
9475 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009476
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009477 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009478 {
9479 return;
9480 }
9481
9482 int maxDimension = context->getMaximumRenderbufferDimension();
9483 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9484 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009485 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009486 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009487 {
9488 return gl::error(GL_OUT_OF_MEMORY);
9489 }
9490}
9491
9492void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9493{
9494 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9495 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9496 target, numAttachments, attachments, x, y, width, height);
9497
9498 try
9499 {
9500 gl::Context *context = gl::getNonLostContext();
9501
9502 if (context)
9503 {
9504 if (context->getClientVersion() < 3)
9505 {
9506 return gl::error(GL_INVALID_OPERATION);
9507 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009508
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009509 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009510 {
9511 return;
9512 }
9513
9514 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9515 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009516 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009517 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009518 {
9519 return gl::error(GL_OUT_OF_MEMORY);
9520 }
9521}
9522
9523void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9524{
9525 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9526 target, levels, internalformat, width, height);
9527
9528 try
9529 {
9530 gl::Context *context = gl::getNonLostContext();
9531
9532 if (context)
9533 {
9534 if (context->getClientVersion() < 3)
9535 {
9536 return gl::error(GL_INVALID_OPERATION);
9537 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009538
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009539 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009540 {
9541 return;
9542 }
9543
9544 switch (target)
9545 {
9546 case GL_TEXTURE_2D:
9547 {
9548 gl::Texture2D *texture2d = context->getTexture2D();
9549 texture2d->storage(levels, internalformat, width, height);
9550 }
9551 break;
9552
Geoff Lang01c21d22013-09-24 11:52:16 -04009553 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009554 {
9555 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9556 textureCube->storage(levels, internalformat, width);
9557 }
9558 break;
9559
9560 default:
9561 return gl::error(GL_INVALID_ENUM);
9562 }
9563 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009564 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009565 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009566 {
9567 return gl::error(GL_OUT_OF_MEMORY);
9568 }
9569}
9570
9571void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9572{
9573 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9574 "GLsizei height = %d, GLsizei depth = %d)",
9575 target, levels, internalformat, width, height, depth);
9576
9577 try
9578 {
9579 gl::Context *context = gl::getNonLostContext();
9580
9581 if (context)
9582 {
9583 if (context->getClientVersion() < 3)
9584 {
9585 return gl::error(GL_INVALID_OPERATION);
9586 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009587
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009588 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009589 {
9590 return;
9591 }
9592
9593 switch (target)
9594 {
9595 case GL_TEXTURE_3D:
9596 {
9597 gl::Texture3D *texture3d = context->getTexture3D();
9598 texture3d->storage(levels, internalformat, width, height, depth);
9599 }
9600 break;
9601
9602 case GL_TEXTURE_2D_ARRAY:
9603 {
9604 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9605 texture2darray->storage(levels, internalformat, width, height, depth);
9606 }
9607 break;
9608
9609 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009610 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009611 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009612 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009613 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009614 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009615 {
9616 return gl::error(GL_OUT_OF_MEMORY);
9617 }
9618}
9619
9620void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9621{
9622 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9623 "GLint* params = 0x%0.8p)",
9624 target, internalformat, pname, bufSize, params);
9625
9626 try
9627 {
9628 gl::Context *context = gl::getNonLostContext();
9629
9630 if (context)
9631 {
9632 if (context->getClientVersion() < 3)
9633 {
9634 return gl::error(GL_INVALID_OPERATION);
9635 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009636
Geoff Langcec35902014-04-16 10:52:36 -04009637 const gl::TextureCaps &formatCaps = context->getCaps().textureCaps.get(internalformat);
9638 if (!formatCaps.colorRendering && !formatCaps.depthRendering && !formatCaps.stencilRendering)
Shannon Woods809d2502013-07-08 10:32:18 -04009639 {
9640 return gl::error(GL_INVALID_ENUM);
9641 }
9642
9643 if (target != GL_RENDERBUFFER)
9644 {
9645 return gl::error(GL_INVALID_ENUM);
9646 }
9647
9648 if (bufSize < 0)
9649 {
9650 return gl::error(GL_INVALID_VALUE);
9651 }
9652
9653 switch (pname)
9654 {
9655 case GL_NUM_SAMPLE_COUNTS:
9656 if (bufSize != 0)
9657 *params = context->getNumSampleCounts(internalformat);
9658 break;
9659 case GL_SAMPLES:
9660 context->getSampleCounts(internalformat, bufSize, params);
9661 break;
9662 default:
9663 return gl::error(GL_INVALID_ENUM);
9664 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009665 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009666 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009667 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009668 {
9669 return gl::error(GL_OUT_OF_MEMORY);
9670 }
9671}
9672
9673// Extension functions
9674
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009675void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9676 GLbitfield mask, GLenum filter)
9677{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009678 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009679 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9680 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9681 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9682
9683 try
9684 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009685 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009686
9687 if (context)
9688 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009689 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04009690 dstX0, dstY0, dstX1, dstY1, mask, filter,
9691 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009692 {
Geoff Lang758d5b22013-06-11 11:42:50 -04009693 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009694 }
9695
Geoff Lang758d5b22013-06-11 11:42:50 -04009696 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
9697 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009698 }
9699 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009700 catch (...)
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009702 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009703 }
9704}
9705
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009706void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9707 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009708{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009709 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009710 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009711 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009712 target, level, internalformat, width, height, depth, border, format, type, pixels);
9713
9714 try
9715 {
9716 UNIMPLEMENTED(); // FIXME
9717 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009718 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009720 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009721 }
9722}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009723
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009724void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9725 GLenum *binaryFormat, void *binary)
9726{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009727 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 +00009728 program, bufSize, length, binaryFormat, binary);
9729
9730 try
9731 {
9732 gl::Context *context = gl::getNonLostContext();
9733
9734 if (context)
9735 {
9736 gl::Program *programObject = context->getProgram(program);
9737
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009738 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009740 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009741 }
9742
9743 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9744
9745 if (!programBinary)
9746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009747 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009748 }
9749
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009750 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009752 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009753 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009754
9755 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009756 }
9757 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009758 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009760 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009761 }
9762}
9763
9764void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9765 const void *binary, GLint length)
9766{
9767 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9768 program, binaryFormat, binary, length);
9769
9770 try
9771 {
9772 gl::Context *context = gl::getNonLostContext();
9773
9774 if (context)
9775 {
9776 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009778 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009779 }
9780
9781 gl::Program *programObject = context->getProgram(program);
9782
9783 if (!programObject)
9784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009785 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009786 }
9787
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009788 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009789 }
9790 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009791 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009793 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009794 }
9795}
9796
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009797void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9798{
9799 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9800
9801 try
9802 {
9803 gl::Context *context = gl::getNonLostContext();
9804
9805 if (context)
9806 {
9807 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9808 {
9809 return gl::error(GL_INVALID_VALUE);
9810 }
9811
9812 if (context->getDrawFramebufferHandle() == 0)
9813 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009814 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009815 {
9816 return gl::error(GL_INVALID_OPERATION);
9817 }
9818
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009819 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009820 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009821 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009822 }
9823 }
9824 else
9825 {
9826 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9827 {
9828 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9829 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9830 {
9831 return gl::error(GL_INVALID_OPERATION);
9832 }
9833 }
9834 }
9835
9836 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9837
9838 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9839 {
9840 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9841 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009842
9843 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9844 {
9845 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9846 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009847 }
9848 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009849 catch (...)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009850 {
9851 return gl::error(GL_OUT_OF_MEMORY);
9852 }
9853}
9854
Shannon Woodsb3801742014-03-27 14:59:19 -04009855void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
9856{
9857 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
9858
9859 try
9860 {
9861 gl::Context *context = gl::getNonLostContext();
9862
9863 if (context)
9864 {
Shannon Woodsb3801742014-03-27 14:59:19 -04009865 if (!gl::ValidBufferTarget(context, target))
9866 {
9867 return gl::error(GL_INVALID_ENUM);
9868 }
9869
9870 if (pname != GL_BUFFER_MAP_POINTER)
9871 {
9872 return gl::error(GL_INVALID_ENUM);
9873 }
9874
9875 gl::Buffer *buffer = context->getTargetBuffer(target);
9876
9877 if (!buffer || !buffer->mapped())
9878 {
9879 *params = NULL;
9880 }
9881
9882 *params = buffer->mapPointer();
9883 }
9884 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009885 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009886 {
9887 return gl::error(GL_OUT_OF_MEMORY);
9888 }
9889}
9890
9891void * __stdcall glMapBufferOES(GLenum target, GLenum access)
9892{
9893 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
9894
9895 try
9896 {
9897 gl::Context *context = gl::getNonLostContext();
9898
9899 if (context)
9900 {
9901 if (!gl::ValidBufferTarget(context, target))
9902 {
9903 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9904 }
9905
9906 gl::Buffer *buffer = context->getTargetBuffer(target);
9907
9908 if (buffer == NULL)
9909 {
9910 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9911 }
9912
9913 if (access != GL_WRITE_ONLY_OES)
9914 {
9915 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9916 }
9917
9918 if (buffer->mapped())
9919 {
9920 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9921 }
9922
9923 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
9924 }
9925 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009926 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009927 {
9928 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
9929 }
9930
9931 return NULL;
9932}
9933
9934GLboolean __stdcall glUnmapBufferOES(GLenum target)
9935{
9936 EVENT("(GLenum target = 0x%X)", target);
9937
9938 try
9939 {
9940 gl::Context *context = gl::getNonLostContext();
9941
9942 if (context)
9943 {
9944 if (!gl::ValidBufferTarget(context, target))
9945 {
9946 return gl::error(GL_INVALID_ENUM, GL_FALSE);
9947 }
9948
9949 gl::Buffer *buffer = context->getTargetBuffer(target);
9950
9951 if (buffer == NULL || !buffer->mapped())
9952 {
9953 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9954 }
9955
9956 // TODO: detect if we had corruption. if so, throw an error and return false.
9957
9958 buffer->unmap();
9959
9960 return GL_TRUE;
9961 }
9962 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009963 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009964 {
9965 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9966 }
9967
9968 return GL_FALSE;
9969}
9970
Shannon Woods916e7692014-03-27 16:58:22 -04009971void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
9972{
9973 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
9974 target, offset, length, access);
9975
9976 try
9977 {
9978 gl::Context *context = gl::getNonLostContext();
9979
9980 if (context)
9981 {
9982 if (!gl::ValidBufferTarget(context, target))
9983 {
9984 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9985 }
9986
9987 if (offset < 0 || length < 0)
9988 {
9989 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
9990 }
9991
9992 gl::Buffer *buffer = context->getTargetBuffer(target);
9993
9994 if (buffer == NULL)
9995 {
9996 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9997 }
9998
9999 // Check for buffer overflow
10000 size_t offsetSize = static_cast<size_t>(offset);
10001 size_t lengthSize = static_cast<size_t>(length);
10002
10003 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10004 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
10005 {
10006 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10007 }
10008
10009 // Check for invalid bits in the mask
10010 GLbitfield allAccessBits = GL_MAP_READ_BIT |
10011 GL_MAP_WRITE_BIT |
10012 GL_MAP_INVALIDATE_RANGE_BIT |
10013 GL_MAP_INVALIDATE_BUFFER_BIT |
10014 GL_MAP_FLUSH_EXPLICIT_BIT |
10015 GL_MAP_UNSYNCHRONIZED_BIT;
10016
10017 if (access & ~(allAccessBits))
10018 {
10019 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10020 }
10021
10022 if (length == 0 || buffer->mapped())
10023 {
10024 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10025 }
10026
10027 // Check for invalid bit combinations
10028 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10029 {
10030 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10031 }
10032
10033 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10034 GL_MAP_INVALIDATE_BUFFER_BIT |
10035 GL_MAP_UNSYNCHRONIZED_BIT;
10036
10037 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10038 {
10039 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10040 }
10041
10042 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10043 {
10044 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10045 }
10046
10047 return buffer->mapRange(offset, length, access);
10048 }
10049 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010050 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010051 {
10052 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10053 }
10054
10055 return NULL;
10056}
10057
10058void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10059{
10060 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10061
10062 try
10063 {
10064 gl::Context *context = gl::getNonLostContext();
10065
10066 if (context)
10067 {
10068 if (offset < 0 || length < 0)
10069 {
10070 return gl::error(GL_INVALID_VALUE);
10071 }
10072
10073 if (!gl::ValidBufferTarget(context, target))
10074 {
10075 return gl::error(GL_INVALID_ENUM);
10076 }
10077
10078 gl::Buffer *buffer = context->getTargetBuffer(target);
10079
10080 if (buffer == NULL)
10081 {
10082 return gl::error(GL_INVALID_OPERATION);
10083 }
10084
10085 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
10086 {
10087 return gl::error(GL_INVALID_OPERATION);
10088 }
10089
10090 // Check for buffer overflow
10091 size_t offsetSize = static_cast<size_t>(offset);
10092 size_t lengthSize = static_cast<size_t>(length);
10093
10094 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10095 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
10096 {
10097 return gl::error(GL_INVALID_VALUE);
10098 }
10099
10100 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10101 }
10102 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010103 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010104 {
10105 return gl::error(GL_OUT_OF_MEMORY);
10106 }
10107}
10108
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010109__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10110{
10111 struct Extension
10112 {
10113 const char *name;
10114 __eglMustCastToProperFunctionPointerType address;
10115 };
10116
10117 static const Extension glExtensions[] =
10118 {
10119 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010120 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010121 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010122 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10123 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10124 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10125 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10126 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10127 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10128 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010129 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010130 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010131 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10132 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10133 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10134 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010135 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10136 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10137 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10138 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10139 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10140 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10141 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010142 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010143 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10144 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10145 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010146 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010147 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10148 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10149 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -040010150 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10151 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10152 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010153
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010154 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010155 {
10156 if (strcmp(procname, glExtensions[ext].name) == 0)
10157 {
10158 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10159 }
10160 }
10161
10162 return NULL;
10163}
10164
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010165// Non-public functions used by EGL
10166
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010167bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010168{
10169 EVENT("(egl::Surface* surface = 0x%0.8p)",
10170 surface);
10171
10172 try
10173 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010174 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010175
10176 if (context)
10177 {
10178 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010179 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010180
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010181 if (textureObject->isImmutable())
10182 {
10183 return false;
10184 }
10185
Geoff Lang32d508e2014-02-11 09:39:48 -050010186 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010187 }
10188 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010189 catch (...)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010191 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010192 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010193
10194 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010195}
10196
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010197}