blob: d8f8de8d3a015cc70959d75d0c4610c70942f8f8 [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();
Geoff Langcec35902014-04-16 10:52:36 -04001999 const gl::TextureCaps &formatCaps = context->getCaps().textureCaps.get(internalFormat);
2000
Geoff Langcbb84122014-06-11 15:30:32 -04002001 // GenerateMipmap should not generate an INVALID_OPERATION for textures created with
2002 // unsized formats or that are color renderable and filterable. Since we do not track if
2003 // the texture was created with sized or unsized format (only sized formats are stored),
2004 // it is not possible to make sure the the LUMA formats can generate mipmaps (they should
2005 // be able to) because they aren't color renderable. Simply do a special case for LUMA
2006 // textures since they're the only texture format that can be created with unsized formats
2007 // that is not color renderable. New unsized formats are unlikely to be added, since ES2
2008 // was the last version to use add them.
2009 bool isLUMA = internalFormat == GL_LUMINANCE8_EXT ||
2010 internalFormat == GL_LUMINANCE8_ALPHA8_EXT ||
2011 internalFormat == GL_ALPHA8_EXT;
Jamie Madill61b54432014-02-18 15:27:19 -05002012
Geoff Langcbb84122014-06-11 15:30:32 -04002013 if (formatCaps.depthRendering || !formatCaps.filtering || (!formatCaps.colorRendering && !isLUMA) ||
2014 gl::IsFormatCompressed(internalFormat, context->getClientVersion()))
Geoff Langae4852a2013-06-05 15:00:34 -04002015 {
2016 return gl::error(GL_INVALID_OPERATION);
2017 }
2018
Geoff Lang05b05022014-06-11 15:31:45 -04002019 // GL_EXT_sRGB does not support mipmap generation on sRGB textures
2020 if (context->getClientVersion() == 2 &&
2021 gl::GetColorEncoding(internalFormat, context->getClientVersion()) == GL_SRGB)
2022 {
2023 return gl::error(GL_INVALID_OPERATION);
2024 }
2025
Jamie Madillc1f8b162013-10-07 10:46:38 -04002026 // Non-power of 2 ES2 check
Geoff Langcec35902014-04-16 10:52:36 -04002027 if (!context->getCaps().extensions.textureNPOT && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
Jamie Madillc1f8b162013-10-07 10:46:38 -04002028 {
2029 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2030 return gl::error(GL_INVALID_OPERATION);
2031 }
2032
2033 // Cube completeness check
2034 if (target == GL_TEXTURE_CUBE_MAP)
2035 {
2036 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2037 if (!textureCube->isCubeComplete())
2038 {
2039 return gl::error(GL_INVALID_OPERATION);
2040 }
2041 }
2042
Geoff Langae4852a2013-06-05 15:00:34 -04002043 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002044 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002045 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002046 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002048 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002049 }
2050}
2051
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002052void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2053{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002054 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002055
2056 try
2057 {
2058 if (n < 0)
2059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002060 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002061 }
2062
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002063 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002064
2065 if (context)
2066 {
2067 for (int i = 0; i < n; i++)
2068 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002069 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002070 }
2071 }
2072 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002073 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002075 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002076 }
2077}
2078
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002079void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2080{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002081 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002082
2083 try
2084 {
2085 if (n < 0)
2086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002087 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002088 }
2089
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002090 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002091
2092 if (context)
2093 {
2094 for (int i = 0; i < n; i++)
2095 {
2096 framebuffers[i] = context->createFramebuffer();
2097 }
2098 }
2099 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002100 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002102 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002103 }
2104}
2105
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002106void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2107{
2108 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2109
2110 try
2111 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002112 gl::Context *context = gl::getNonLostContext();
2113
2114 if (context)
2115 {
Geoff Lang37dde692014-01-31 16:34:54 -05002116 if (n < 0)
2117 {
2118 return gl::error(GL_INVALID_VALUE);
2119 }
2120
2121 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002122 {
2123 ids[i] = context->createQuery();
2124 }
2125 }
2126 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002127 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002128 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002129 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002130 }
2131}
2132
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002133void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2134{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002135 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002136
2137 try
2138 {
2139 if (n < 0)
2140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002141 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002142 }
2143
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002144 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002145
2146 if (context)
2147 {
2148 for (int i = 0; i < n; i++)
2149 {
2150 renderbuffers[i] = context->createRenderbuffer();
2151 }
2152 }
2153 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002154 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002156 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002157 }
2158}
2159
2160void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2161{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002162 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002163
2164 try
2165 {
2166 if (n < 0)
2167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002168 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002169 }
2170
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002171 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002172
2173 if (context)
2174 {
2175 for (int i = 0; i < n; i++)
2176 {
2177 textures[i] = context->createTexture();
2178 }
2179 }
2180 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002181 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002183 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002184 }
2185}
2186
daniel@transgaming.com85423182010-04-22 13:35:27 +00002187void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002188{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002189 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002190 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002191 program, index, bufsize, length, size, type, name);
2192
2193 try
2194 {
2195 if (bufsize < 0)
2196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002197 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002198 }
2199
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002200 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002201
2202 if (context)
2203 {
2204 gl::Program *programObject = context->getProgram(program);
2205
2206 if (!programObject)
2207 {
2208 if (context->getShader(program))
2209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002210 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002211 }
2212 else
2213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002214 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002215 }
2216 }
2217
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002218 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002220 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002221 }
2222
2223 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2224 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002225 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002226 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002228 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002229 }
2230}
2231
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002232void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002233{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002234 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002235 "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 +00002236 program, index, bufsize, length, size, type, name);
2237
2238 try
2239 {
2240 if (bufsize < 0)
2241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002242 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002243 }
2244
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002245 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002246
2247 if (context)
2248 {
2249 gl::Program *programObject = context->getProgram(program);
2250
2251 if (!programObject)
2252 {
2253 if (context->getShader(program))
2254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002255 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002256 }
2257 else
2258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002259 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002260 }
2261 }
2262
2263 if (index >= (GLuint)programObject->getActiveUniformCount())
2264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002265 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002266 }
2267
2268 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2269 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002270 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002271 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002273 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274 }
2275}
2276
2277void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2278{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002279 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 +00002280 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002281
2282 try
2283 {
2284 if (maxcount < 0)
2285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002286 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002287 }
2288
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002290
2291 if (context)
2292 {
2293 gl::Program *programObject = context->getProgram(program);
2294
2295 if (!programObject)
2296 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002297 if (context->getShader(program))
2298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002299 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002300 }
2301 else
2302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002304 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002305 }
2306
2307 return programObject->getAttachedShaders(maxcount, count, shaders);
2308 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002309 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002310 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002312 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002313 }
2314}
2315
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002316int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002317{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002318 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002319
2320 try
2321 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002322 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002323
2324 if (context)
2325 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002326
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002327 gl::Program *programObject = context->getProgram(program);
2328
2329 if (!programObject)
2330 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002331 if (context->getShader(program))
2332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002333 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002334 }
2335 else
2336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002337 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002338 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002339 }
2340
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002341 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002342 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002344 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002345 }
2346
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002347 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002348 }
2349 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002350 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002352 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002353 }
2354
2355 return -1;
2356}
2357
2358void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2359{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002360 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002361
2362 try
2363 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002364 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002365
2366 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002367 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002368 GLenum nativeType;
2369 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002370 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2371 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002372 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002373 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002374
2375 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002376 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002377 context->getBooleanv(pname, params);
2378 }
Jamie Madill55856b12014-01-02 13:59:50 -05002379 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002380 {
Jamie Madill55856b12014-01-02 13:59:50 -05002381 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002382 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002383 }
2384 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002385 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002387 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002388 }
2389}
2390
2391void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2392{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002393 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 +00002394
2395 try
2396 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002397 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002398
2399 if (context)
2400 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002401 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002402 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002403 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002404 }
2405
Jamie Madill70656a62014-03-05 15:01:26 -05002406 if (!gl::ValidBufferParameter(context, pname))
2407 {
2408 return gl::error(GL_INVALID_ENUM);
2409 }
2410
Jamie Madill8c96d582014-03-05 15:01:23 -05002411 gl::Buffer *buffer = context->getTargetBuffer(target);
2412
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002413 if (!buffer)
2414 {
2415 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002416 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002417 }
2418
2419 switch (pname)
2420 {
2421 case GL_BUFFER_USAGE:
Jamie Madill70656a62014-03-05 15:01:26 -05002422 *params = static_cast<GLint>(buffer->usage());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002423 break;
2424 case GL_BUFFER_SIZE:
Jamie Madill70656a62014-03-05 15:01:26 -05002425 *params = gl::clampCast<GLint>(buffer->size());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002426 break;
Jamie Madill70656a62014-03-05 15:01:26 -05002427 case GL_BUFFER_ACCESS_FLAGS:
2428 *params = buffer->accessFlags();
2429 break;
2430 case GL_BUFFER_MAPPED:
2431 *params = static_cast<GLint>(buffer->mapped());
2432 break;
2433 case GL_BUFFER_MAP_OFFSET:
2434 *params = gl::clampCast<GLint>(buffer->mapOffset());
2435 break;
2436 case GL_BUFFER_MAP_LENGTH:
2437 *params = gl::clampCast<GLint>(buffer->mapLength());
2438 break;
2439 default: UNREACHABLE(); break;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002440 }
2441 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002442 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002443 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002444 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002445 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002446 }
2447}
2448
2449GLenum __stdcall glGetError(void)
2450{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002451 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002452
2453 gl::Context *context = gl::getContext();
2454
2455 if (context)
2456 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002457 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002458 }
2459
2460 return GL_NO_ERROR;
2461}
2462
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002463void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2464{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002465 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002466
2467 try
2468 {
2469
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002470 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002471
2472 if (context)
2473 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002474 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002475
2476 if (fenceObject == NULL)
2477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002478 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002479 }
2480
Jamie Madillfb9a7402013-07-26 11:55:01 -04002481 if (fenceObject->isFence() != GL_TRUE)
2482 {
2483 return gl::error(GL_INVALID_OPERATION);
2484 }
2485
2486 switch (pname)
2487 {
2488 case GL_FENCE_STATUS_NV:
2489 case GL_FENCE_CONDITION_NV:
2490 break;
2491
2492 default: return gl::error(GL_INVALID_ENUM);
2493 }
2494
2495 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002496 }
2497 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002498 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002499 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002500 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002501 }
2502}
2503
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002504void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2505{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002506 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002507
2508 try
2509 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002510 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002511
2512 if (context)
2513 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002514 GLenum nativeType;
2515 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002516 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2517 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002518 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002519 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002520
2521 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002522 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002523 context->getFloatv(pname, params);
2524 }
Jamie Madill55856b12014-01-02 13:59:50 -05002525 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002526 {
Jamie Madill55856b12014-01-02 13:59:50 -05002527 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002528 }
2529 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002530 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002531 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002533 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002534 }
2535}
2536
2537void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2538{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002539 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 +00002540 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002541
2542 try
2543 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002544 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002545
2546 if (context)
2547 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002548 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002550 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002551 }
2552
Jamie Madill1e3fa742014-06-16 10:34:00 -04002553 int clientVersion = context->getClientVersion();
2554
Geoff Lang646559f2013-08-15 11:08:15 -04002555 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002556 {
Geoff Lang646559f2013-08-15 11:08:15 -04002557 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2558 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2559 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2560 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2561 break;
Geoff Lang05b05022014-06-11 15:31:45 -04002562 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2563 if (clientVersion < 3 && !context->getCaps().extensions.sRGB)
2564 {
2565 return gl::error(GL_INVALID_ENUM);
2566 }
2567 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002568 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2569 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2570 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2571 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2572 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2573 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2574 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
Geoff Lang646559f2013-08-15 11:08:15 -04002575 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
Geoff Lang05b05022014-06-11 15:31:45 -04002576 if (clientVersion < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002577 {
Geoff Lang05b05022014-06-11 15:31:45 -04002578 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002579 }
Geoff Lang05b05022014-06-11 15:31:45 -04002580 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002581 default:
2582 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002583 }
Geoff Lang646559f2013-08-15 11:08:15 -04002584
2585 // Determine if the attachment is a valid enum
2586 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002587 {
Geoff Lang646559f2013-08-15 11:08:15 -04002588 case GL_BACK:
2589 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002590 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002591 case GL_STENCIL:
2592 case GL_DEPTH_STENCIL_ATTACHMENT:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002593 if (clientVersion < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002594 {
Geoff Lang646559f2013-08-15 11:08:15 -04002595 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002596 }
Geoff Lang646559f2013-08-15 11:08:15 -04002597 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002598
Geoff Lang646559f2013-08-15 11:08:15 -04002599 case GL_DEPTH_ATTACHMENT:
2600 case GL_STENCIL_ATTACHMENT:
2601 break;
2602
2603 default:
2604 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2605 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2606 {
2607 return gl::error(GL_INVALID_ENUM);
2608 }
2609 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002610 }
2611
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002612 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2613 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002614 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2615
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002616 GLenum attachmentType;
2617 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002618 GLuint attachmentLevel;
2619 GLuint attachmentLayer;
Jamie Madill3c7fa222014-06-05 13:08:51 -04002620 gl::FramebufferAttachment *attachmentObject;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002621
Jamie Madill3c7fa222014-06-05 13:08:51 -04002622 if (framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002623 {
Jamie Madill1e3fa742014-06-16 10:34:00 -04002624 if (clientVersion < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002625 {
Geoff Lang646559f2013-08-15 11:08:15 -04002626 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002627 }
2628
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002629 switch (attachment)
2630 {
Geoff Lang646559f2013-08-15 11:08:15 -04002631 case GL_BACK:
2632 attachmentType = framebuffer->getColorbufferType(0);
2633 attachmentHandle = framebuffer->getColorbufferHandle(0);
2634 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2635 attachmentLayer = framebuffer->getColorbufferLayer(0);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002636 attachmentObject = framebuffer->getColorbuffer(0);
Geoff Lang646559f2013-08-15 11:08:15 -04002637 break;
2638 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002639 attachmentType = framebuffer->getDepthbufferType();
2640 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002641 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2642 attachmentLayer = framebuffer->getDepthbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002643 attachmentObject = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002644 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002645 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002646 attachmentType = framebuffer->getStencilbufferType();
2647 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002648 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2649 attachmentLayer = framebuffer->getStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002650 attachmentObject = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002651 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002652 default:
2653 return gl::error(GL_INVALID_OPERATION);
2654 }
2655 }
2656 else
2657 {
2658 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2659 {
2660 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2661 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2662 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2663 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2664 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002665 attachmentObject = framebuffer->getColorbuffer(colorAttachment);
Geoff Lang646559f2013-08-15 11:08:15 -04002666 }
2667 else
2668 {
2669 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002670 {
Geoff Lang646559f2013-08-15 11:08:15 -04002671 case GL_DEPTH_ATTACHMENT:
2672 attachmentType = framebuffer->getDepthbufferType();
2673 attachmentHandle = framebuffer->getDepthbufferHandle();
2674 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2675 attachmentLayer = framebuffer->getDepthbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002676 attachmentObject = framebuffer->getDepthbuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002677 break;
2678 case GL_STENCIL_ATTACHMENT:
2679 attachmentType = framebuffer->getStencilbufferType();
2680 attachmentHandle = framebuffer->getStencilbufferHandle();
2681 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2682 attachmentLayer = framebuffer->getStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002683 attachmentObject = framebuffer->getStencilbuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002684 break;
2685 case GL_DEPTH_STENCIL_ATTACHMENT:
2686 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2687 {
2688 return gl::error(GL_INVALID_OPERATION);
2689 }
2690 attachmentType = framebuffer->getDepthStencilbufferType();
2691 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2692 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2693 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002694 attachmentObject = framebuffer->getDepthStencilBuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002695 break;
2696 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002697 return gl::error(GL_INVALID_OPERATION);
2698 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002699 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002700 }
2701
2702 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002703 if (framebufferHandle == 0)
2704 {
2705 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2706 }
2707 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002708 {
2709 attachmentObjectType = attachmentType;
2710 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002711 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002712 {
2713 attachmentObjectType = GL_TEXTURE;
2714 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002715 else
2716 {
2717 UNREACHABLE();
2718 return;
2719 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002720
Geoff Lang646559f2013-08-15 11:08:15 -04002721 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002722 {
Geoff Lang646559f2013-08-15 11:08:15 -04002723 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2724 // is NONE, then querying any other pname will generate INVALID_ENUM.
2725
2726 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2727 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2728 // INVALID_OPERATION for all other pnames
2729
2730 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002731 {
Geoff Lang646559f2013-08-15 11:08:15 -04002732 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2733 *params = attachmentObjectType;
2734 break;
2735
2736 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002737 if (clientVersion < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002738 {
Geoff Lang646559f2013-08-15 11:08:15 -04002739 return gl::error(GL_INVALID_ENUM);
2740 }
2741 *params = 0;
2742 break;
2743
2744 default:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002745 if (clientVersion < 3)
Geoff Lang646559f2013-08-15 11:08:15 -04002746 {
2747 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002748 }
2749 else
2750 {
Geoff Lang646559f2013-08-15 11:08:15 -04002751 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002752 }
2753 }
Geoff Lang646559f2013-08-15 11:08:15 -04002754 }
2755 else
2756 {
2757 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2758 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002759 ASSERT(attachmentObject != NULL);
Geoff Lang646559f2013-08-15 11:08:15 -04002760
2761 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002762 {
Geoff Lang646559f2013-08-15 11:08:15 -04002763 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2764 *params = attachmentObjectType;
2765 break;
2766
2767 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2768 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2769 {
2770 return gl::error(GL_INVALID_ENUM);
2771 }
2772 *params = attachmentHandle;
2773 break;
2774
2775 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2776 if (attachmentObjectType != GL_TEXTURE)
2777 {
2778 return gl::error(GL_INVALID_ENUM);
2779 }
2780 *params = attachmentLevel;
2781 break;
2782
2783 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2784 if (attachmentObjectType != GL_TEXTURE)
2785 {
2786 return gl::error(GL_INVALID_ENUM);
2787 }
2788 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2789 break;
2790
2791 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002792 *params = attachmentObject->getRedSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002793 break;
2794
2795 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002796 *params = attachmentObject->getGreenSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002797 break;
2798
2799 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002800 *params = attachmentObject->getBlueSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002801 break;
2802
2803 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002804 *params = attachmentObject->getAlphaSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002805 break;
2806
2807 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002808 *params = attachmentObject->getDepthSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002809 break;
2810
2811 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002812 *params = attachmentObject->getStencilSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002813 break;
2814
2815 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2816 if (attachment == GL_DEPTH_STENCIL)
2817 {
2818 gl::error(GL_INVALID_OPERATION);
2819 }
Jamie Madill1e3fa742014-06-16 10:34:00 -04002820 *params = attachmentObject->getComponentType(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002821 break;
2822
2823 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002824 *params = attachmentObject->getColorEncoding(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002825 break;
2826
2827 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2828 if (attachmentObjectType != GL_TEXTURE)
2829 {
2830 return gl::error(GL_INVALID_ENUM);
2831 }
2832 *params = attachmentLayer;
2833 break;
2834
2835 default:
2836 UNREACHABLE();
2837 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002838 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002839 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002840 }
2841 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002842 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002844 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002845 }
2846}
2847
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002848GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2849{
2850 EVENT("()");
2851
2852 try
2853 {
2854 gl::Context *context = gl::getContext();
2855
2856 if (context)
2857 {
2858 return context->getResetStatus();
2859 }
2860
2861 return GL_NO_ERROR;
2862 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002863 catch (...)
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002864 {
2865 return GL_OUT_OF_MEMORY;
2866 }
2867}
2868
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002869void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002871 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002872
2873 try
2874 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002875 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002876
2877 if (context)
2878 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002879 GLenum nativeType;
2880 unsigned int numParams = 0;
Jamie Madill79f2f452013-12-19 11:13:02 -05002881
Jamie Madill893ab082014-05-16 16:56:10 -04002882 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2883 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002884 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002885 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002886
2887 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002888 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002889 context->getIntegerv(pname, params);
2890 }
Jamie Madill55856b12014-01-02 13:59:50 -05002891 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002892 {
Jamie Madill55856b12014-01-02 13:59:50 -05002893 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002894 }
2895 }
2896 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002897 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002899 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002900 }
2901}
2902
2903void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2904{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002905 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002906
2907 try
2908 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002909 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002910
2911 if (context)
2912 {
2913 gl::Program *programObject = context->getProgram(program);
2914
2915 if (!programObject)
2916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002917 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002918 }
2919
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002920 if (context->getClientVersion() < 3)
2921 {
2922 switch (pname)
2923 {
2924 case GL_ACTIVE_UNIFORM_BLOCKS:
2925 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002926 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2927 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2928 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002929 return gl::error(GL_INVALID_ENUM);
2930 }
2931 }
2932
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002933 switch (pname)
2934 {
2935 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002936 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002937 return;
2938 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002939 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002940 return;
2941 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00002942 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002943 return;
2944 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002945 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002946 return;
2947 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002948 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002949 return;
2950 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002951 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002952 return;
2953 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002954 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002955 return;
2956 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002957 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002958 return;
2959 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002960 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002961 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00002962 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00002963 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00002964 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002965 case GL_ACTIVE_UNIFORM_BLOCKS:
2966 *params = programObject->getActiveUniformBlockCount();
2967 return;
2968 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
2969 *params = programObject->getActiveUniformBlockMaxLength();
2970 break;
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002971 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2972 *params = programObject->getTransformFeedbackBufferMode();
2973 break;
2974 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2975 *params = programObject->getTransformFeedbackVaryingCount();
2976 break;
2977 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
2978 *params = programObject->getTransformFeedbackVaryingMaxLength();
2979 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002980 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002981 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002982 }
2983 }
2984 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002985 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002987 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002988 }
2989}
2990
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002991void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002992{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002993 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 +00002994 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002995
2996 try
2997 {
2998 if (bufsize < 0)
2999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003000 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003001 }
3002
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003003 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003004
3005 if (context)
3006 {
3007 gl::Program *programObject = context->getProgram(program);
3008
3009 if (!programObject)
3010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003011 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003012 }
3013
3014 programObject->getInfoLog(bufsize, length, infolog);
3015 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003016 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003017 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003019 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003020 }
3021}
3022
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003023void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3024{
3025 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3026
3027 try
3028 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003029 gl::Context *context = gl::getNonLostContext();
3030
3031 if (context)
3032 {
Geoff Lang37dde692014-01-31 16:34:54 -05003033 if (!ValidQueryType(context, target))
3034 {
3035 return gl::error(GL_INVALID_ENUM);
3036 }
3037
3038 switch (pname)
3039 {
3040 case GL_CURRENT_QUERY_EXT:
Jamie Madill45c785d2014-05-13 14:09:34 -04003041 params[0] = context->getActiveQueryId(target);
Geoff Lang37dde692014-01-31 16:34:54 -05003042 break;
3043
3044 default:
3045 return gl::error(GL_INVALID_ENUM);
3046 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003047 }
3048 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003049 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003051 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003052 }
3053}
3054
3055void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3056{
3057 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3058
3059 try
3060 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003061 gl::Context *context = gl::getNonLostContext();
3062
3063 if (context)
3064 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003065 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3066
3067 if (!queryObject)
3068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003069 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003070 }
3071
Jamie Madill45c785d2014-05-13 14:09:34 -04003072 if (context->getActiveQueryId(queryObject->getType()) == id)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003074 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003075 }
3076
3077 switch(pname)
3078 {
3079 case GL_QUERY_RESULT_EXT:
3080 params[0] = queryObject->getResult();
3081 break;
3082 case GL_QUERY_RESULT_AVAILABLE_EXT:
3083 params[0] = queryObject->isResultAvailable();
3084 break;
3085 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003086 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003087 }
3088 }
3089 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003090 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003092 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003093 }
3094}
3095
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003096void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3097{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003098 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 +00003099
3100 try
3101 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003102 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003103
3104 if (context)
3105 {
3106 if (target != GL_RENDERBUFFER)
3107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003108 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003109 }
3110
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003111 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003113 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003114 }
3115
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003116 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003117
3118 switch (pname)
3119 {
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003120 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3121 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3122 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3123 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3124 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3125 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3126 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3127 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3128 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003129 case GL_RENDERBUFFER_SAMPLES_ANGLE:
Geoff Langcec35902014-04-16 10:52:36 -04003130 if (!context->getCaps().extensions.framebufferMultisample)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003132 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003133 }
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003134 *params = renderbuffer->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003135 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003136 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003137 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003138 }
3139 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003140 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003141 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003143 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003144 }
3145}
3146
3147void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3148{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003149 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003150
3151 try
3152 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003153 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003154
3155 if (context)
3156 {
3157 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003158
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003159 if (!shaderObject)
3160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003161 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003162 }
3163
3164 switch (pname)
3165 {
3166 case GL_SHADER_TYPE:
3167 *params = shaderObject->getType();
3168 return;
3169 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003170 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003171 return;
3172 case GL_COMPILE_STATUS:
3173 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3174 return;
3175 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003176 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003177 return;
3178 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003179 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003180 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003181 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3182 *params = shaderObject->getTranslatedSourceLength();
3183 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003184 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003185 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003186 }
3187 }
3188 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003189 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003191 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003192 }
3193}
3194
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003195void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003196{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003197 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 +00003198 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003199
3200 try
3201 {
3202 if (bufsize < 0)
3203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003204 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003205 }
3206
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003207 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003208
3209 if (context)
3210 {
3211 gl::Shader *shaderObject = context->getShader(shader);
3212
3213 if (!shaderObject)
3214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003215 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003216 }
3217
3218 shaderObject->getInfoLog(bufsize, length, infolog);
3219 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003220 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003221 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003223 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003224 }
3225}
3226
3227void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3228{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003229 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 +00003230 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003231
3232 try
3233 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003234 switch (shadertype)
3235 {
3236 case GL_VERTEX_SHADER:
3237 case GL_FRAGMENT_SHADER:
3238 break;
3239 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003240 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003241 }
3242
3243 switch (precisiontype)
3244 {
3245 case GL_LOW_FLOAT:
3246 case GL_MEDIUM_FLOAT:
3247 case GL_HIGH_FLOAT:
3248 // Assume IEEE 754 precision
3249 range[0] = 127;
3250 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003251 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003252 break;
3253 case GL_LOW_INT:
3254 case GL_MEDIUM_INT:
3255 case GL_HIGH_INT:
3256 // Some (most) hardware only supports single-precision floating-point numbers,
3257 // which can accurately represent integers up to +/-16777216
3258 range[0] = 24;
3259 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003260 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003261 break;
3262 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003263 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003264 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003265 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003266 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003268 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003269 }
3270}
3271
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003272void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003273{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003274 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 +00003275 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003276
3277 try
3278 {
3279 if (bufsize < 0)
3280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003281 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003282 }
3283
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003284 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003285
3286 if (context)
3287 {
3288 gl::Shader *shaderObject = context->getShader(shader);
3289
3290 if (!shaderObject)
3291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003292 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003293 }
3294
3295 shaderObject->getSource(bufsize, length, source);
3296 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003297 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003298 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003300 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003301 }
3302}
3303
zmo@google.coma574f782011-10-03 21:45:23 +00003304void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3305{
3306 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3307 shader, bufsize, length, source);
3308
3309 try
3310 {
3311 if (bufsize < 0)
3312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003313 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003314 }
3315
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003316 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003317
3318 if (context)
3319 {
3320 gl::Shader *shaderObject = context->getShader(shader);
3321
3322 if (!shaderObject)
3323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003324 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003325 }
3326
3327 shaderObject->getTranslatedSource(bufsize, length, source);
3328 }
3329 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003330 catch (...)
zmo@google.coma574f782011-10-03 21:45:23 +00003331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003332 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003333 }
3334}
3335
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003336const GLubyte* __stdcall glGetString(GLenum name)
3337{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003338 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003339
3340 try
3341 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003342 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003343
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003344 switch (name)
3345 {
3346 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003347 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003348 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003349 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003350 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003351 if (context->getClientVersion() == 2)
3352 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003353 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003354 }
3355 else
3356 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003357 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003358 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003359 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003360 if (context->getClientVersion() == 2)
3361 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003362 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003363 }
3364 else
3365 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003366 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003367 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003368 case GL_EXTENSIONS:
Geoff Langcec35902014-04-16 10:52:36 -04003369 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003370 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003371 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003372 }
3373 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003374 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003376 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003377 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003378}
3379
3380void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3381{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003382 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 +00003383
3384 try
3385 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003386 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003387
3388 if (context)
3389 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003390 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003391
Jamie Madillfb8a8302013-07-03 14:24:12 -04003392 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003394 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003395 }
3396
3397 switch (pname)
3398 {
3399 case GL_TEXTURE_MAG_FILTER:
3400 *params = (GLfloat)texture->getMagFilter();
3401 break;
3402 case GL_TEXTURE_MIN_FILTER:
3403 *params = (GLfloat)texture->getMinFilter();
3404 break;
3405 case GL_TEXTURE_WRAP_S:
3406 *params = (GLfloat)texture->getWrapS();
3407 break;
3408 case GL_TEXTURE_WRAP_T:
3409 *params = (GLfloat)texture->getWrapT();
3410 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003411 case GL_TEXTURE_WRAP_R:
3412 if (context->getClientVersion() < 3)
3413 {
3414 return gl::error(GL_INVALID_ENUM);
3415 }
3416 *params = (GLfloat)texture->getWrapR();
3417 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003418 case GL_TEXTURE_IMMUTABLE_FORMAT:
3419 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003420 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3421 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003422 case GL_TEXTURE_IMMUTABLE_LEVELS:
3423 if (context->getClientVersion() < 3)
3424 {
3425 return gl::error(GL_INVALID_ENUM);
3426 }
Jamie Madill51a94372013-10-24 17:49:43 -04003427 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003428 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003429 case GL_TEXTURE_USAGE_ANGLE:
3430 *params = (GLfloat)texture->getUsage();
3431 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003432 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langcec35902014-04-16 10:52:36 -04003433 if (!context->getCaps().extensions.textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003435 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003436 }
3437 *params = (GLfloat)texture->getMaxAnisotropy();
3438 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003439 case GL_TEXTURE_SWIZZLE_R:
3440 if (context->getClientVersion() < 3)
3441 {
3442 return gl::error(GL_INVALID_ENUM);
3443 }
3444 *params = (GLfloat)texture->getSwizzleRed();
3445 break;
3446 case GL_TEXTURE_SWIZZLE_G:
3447 if (context->getClientVersion() < 3)
3448 {
3449 return gl::error(GL_INVALID_ENUM);
3450 }
3451 *params = (GLfloat)texture->getSwizzleGreen();
3452 break;
3453 case GL_TEXTURE_SWIZZLE_B:
3454 if (context->getClientVersion() < 3)
3455 {
3456 return gl::error(GL_INVALID_ENUM);
3457 }
3458 *params = (GLfloat)texture->getSwizzleBlue();
3459 break;
3460 case GL_TEXTURE_SWIZZLE_A:
3461 if (context->getClientVersion() < 3)
3462 {
3463 return gl::error(GL_INVALID_ENUM);
3464 }
3465 *params = (GLfloat)texture->getSwizzleAlpha();
3466 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003467 case GL_TEXTURE_BASE_LEVEL:
3468 if (context->getClientVersion() < 3)
3469 {
3470 return gl::error(GL_INVALID_ENUM);
3471 }
3472 *params = (GLfloat)texture->getBaseLevel();
3473 break;
3474 case GL_TEXTURE_MAX_LEVEL:
3475 if (context->getClientVersion() < 3)
3476 {
3477 return gl::error(GL_INVALID_ENUM);
3478 }
3479 *params = (GLfloat)texture->getMaxLevel();
3480 break;
3481 case GL_TEXTURE_MIN_LOD:
3482 if (context->getClientVersion() < 3)
3483 {
3484 return gl::error(GL_INVALID_ENUM);
3485 }
3486 *params = texture->getMinLod();
3487 break;
3488 case GL_TEXTURE_MAX_LOD:
3489 if (context->getClientVersion() < 3)
3490 {
3491 return gl::error(GL_INVALID_ENUM);
3492 }
3493 *params = texture->getMaxLod();
3494 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003495 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003496 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003497 }
3498 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003499 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003500 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003502 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003503 }
3504}
3505
3506void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3507{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003508 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 +00003509
3510 try
3511 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003512 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003513
3514 if (context)
3515 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003516 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003517
Jamie Madillfb8a8302013-07-03 14:24:12 -04003518 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003520 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003521 }
3522
3523 switch (pname)
3524 {
3525 case GL_TEXTURE_MAG_FILTER:
3526 *params = texture->getMagFilter();
3527 break;
3528 case GL_TEXTURE_MIN_FILTER:
3529 *params = texture->getMinFilter();
3530 break;
3531 case GL_TEXTURE_WRAP_S:
3532 *params = texture->getWrapS();
3533 break;
3534 case GL_TEXTURE_WRAP_T:
3535 *params = texture->getWrapT();
3536 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003537 case GL_TEXTURE_WRAP_R:
3538 if (context->getClientVersion() < 3)
3539 {
3540 return gl::error(GL_INVALID_ENUM);
3541 }
3542 *params = texture->getWrapR();
3543 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003544 case GL_TEXTURE_IMMUTABLE_FORMAT:
3545 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003546 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3547 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003548 case GL_TEXTURE_IMMUTABLE_LEVELS:
3549 if (context->getClientVersion() < 3)
3550 {
3551 return gl::error(GL_INVALID_ENUM);
3552 }
Jamie Madill51a94372013-10-24 17:49:43 -04003553 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003554 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003555 case GL_TEXTURE_USAGE_ANGLE:
3556 *params = texture->getUsage();
3557 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003558 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langcec35902014-04-16 10:52:36 -04003559 if (!context->getCaps().extensions.textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003561 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003562 }
3563 *params = (GLint)texture->getMaxAnisotropy();
3564 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003565 case GL_TEXTURE_SWIZZLE_R:
3566 if (context->getClientVersion() < 3)
3567 {
3568 return gl::error(GL_INVALID_ENUM);
3569 }
3570 *params = texture->getSwizzleRed();
3571 break;
3572 case GL_TEXTURE_SWIZZLE_G:
3573 if (context->getClientVersion() < 3)
3574 {
3575 return gl::error(GL_INVALID_ENUM);
3576 }
3577 *params = texture->getSwizzleGreen();
3578 break;
3579 case GL_TEXTURE_SWIZZLE_B:
3580 if (context->getClientVersion() < 3)
3581 {
3582 return gl::error(GL_INVALID_ENUM);
3583 }
3584 *params = texture->getSwizzleBlue();
3585 break;
3586 case GL_TEXTURE_SWIZZLE_A:
3587 if (context->getClientVersion() < 3)
3588 {
3589 return gl::error(GL_INVALID_ENUM);
3590 }
3591 *params = texture->getSwizzleAlpha();
3592 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003593 case GL_TEXTURE_BASE_LEVEL:
3594 if (context->getClientVersion() < 3)
3595 {
3596 return gl::error(GL_INVALID_ENUM);
3597 }
3598 *params = texture->getBaseLevel();
3599 break;
3600 case GL_TEXTURE_MAX_LEVEL:
3601 if (context->getClientVersion() < 3)
3602 {
3603 return gl::error(GL_INVALID_ENUM);
3604 }
3605 *params = texture->getMaxLevel();
3606 break;
3607 case GL_TEXTURE_MIN_LOD:
3608 if (context->getClientVersion() < 3)
3609 {
3610 return gl::error(GL_INVALID_ENUM);
3611 }
3612 *params = (GLint)texture->getMinLod();
3613 break;
3614 case GL_TEXTURE_MAX_LOD:
3615 if (context->getClientVersion() < 3)
3616 {
3617 return gl::error(GL_INVALID_ENUM);
3618 }
3619 *params = (GLint)texture->getMaxLod();
3620 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003621 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003622 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003623 }
3624 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003625 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003626 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003628 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003629 }
3630}
3631
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003632void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3633{
3634 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3635 program, location, bufSize, params);
3636
3637 try
3638 {
3639 if (bufSize < 0)
3640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003641 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003642 }
3643
3644 gl::Context *context = gl::getNonLostContext();
3645
3646 if (context)
3647 {
3648 if (program == 0)
3649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003650 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003651 }
3652
3653 gl::Program *programObject = context->getProgram(program);
3654
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003655 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003657 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003658 }
3659
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003660 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3661 if (!programBinary)
3662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003663 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003664 }
3665
3666 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003668 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003669 }
3670 }
3671 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003672 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003674 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003675 }
3676}
3677
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003678void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3679{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003680 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003681
3682 try
3683 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003684 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003685
3686 if (context)
3687 {
3688 if (program == 0)
3689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003690 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003691 }
3692
3693 gl::Program *programObject = context->getProgram(program);
3694
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003695 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003697 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003698 }
3699
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003700 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3701 if (!programBinary)
3702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003703 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003704 }
3705
3706 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003708 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003709 }
3710 }
3711 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003712 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003713 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003714 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003715 }
3716}
3717
3718void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3719{
3720 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3721 program, location, bufSize, params);
3722
3723 try
3724 {
3725 if (bufSize < 0)
3726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003727 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003728 }
3729
3730 gl::Context *context = gl::getNonLostContext();
3731
3732 if (context)
3733 {
3734 if (program == 0)
3735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003736 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003737 }
3738
3739 gl::Program *programObject = context->getProgram(program);
3740
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003741 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003743 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003744 }
3745
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003746 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3747 if (!programBinary)
3748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003749 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003750 }
3751
3752 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003753 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003754 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003755 }
3756 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003757 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003758 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003760 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003761 }
3762}
3763
3764void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3765{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003766 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003767
3768 try
3769 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003770 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003771
3772 if (context)
3773 {
3774 if (program == 0)
3775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003776 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003777 }
3778
3779 gl::Program *programObject = context->getProgram(program);
3780
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003781 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003783 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003784 }
3785
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003786 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3787 if (!programBinary)
3788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003789 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003790 }
3791
3792 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003794 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003795 }
3796 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003797 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003798 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003800 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003801 }
3802}
3803
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003804int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003805{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003806 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003807
3808 try
3809 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003810 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003811
3812 if (strstr(name, "gl_") == name)
3813 {
3814 return -1;
3815 }
3816
3817 if (context)
3818 {
3819 gl::Program *programObject = context->getProgram(program);
3820
3821 if (!programObject)
3822 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003823 if (context->getShader(program))
3824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003825 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003826 }
3827 else
3828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003829 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003830 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003831 }
3832
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003833 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003834 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003836 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003837 }
3838
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003839 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003840 }
3841 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003842 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003844 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003845 }
3846
3847 return -1;
3848}
3849
3850void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3851{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003852 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003853
3854 try
3855 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003856 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003857
daniel@transgaming.come0078962010-04-15 20:45:08 +00003858 if (context)
3859 {
3860 if (index >= gl::MAX_VERTEX_ATTRIBS)
3861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003862 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003863 }
3864
daniel@transgaming.com83921382011-01-08 05:46:00 +00003865 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003866
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003867 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003868 {
Jamie Madillaff71502013-07-02 11:57:05 -04003869 return;
3870 }
3871
3872 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3873 {
3874 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3875 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003876 {
Jamie Madillaff71502013-07-02 11:57:05 -04003877 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003878 }
Jamie Madillaff71502013-07-02 11:57:05 -04003879 }
3880 else
3881 {
Brandon Jones5bf98292014-06-06 17:19:38 -07003882 *params = gl::QuerySingleVertexAttributeParameter<GLfloat>(attribState, pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003883 }
3884 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003885 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003886 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003888 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003889 }
3890}
3891
3892void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3893{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003894 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003895
3896 try
3897 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003898 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003899
daniel@transgaming.come0078962010-04-15 20:45:08 +00003900 if (context)
3901 {
3902 if (index >= gl::MAX_VERTEX_ATTRIBS)
3903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003904 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003905 }
3906
daniel@transgaming.com83921382011-01-08 05:46:00 +00003907 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003908
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003909 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003910 {
Jamie Madillaff71502013-07-02 11:57:05 -04003911 return;
3912 }
3913
3914 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3915 {
3916 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3917 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003918 {
Jamie Madillaff71502013-07-02 11:57:05 -04003919 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003920 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003921 }
Jamie Madillaff71502013-07-02 11:57:05 -04003922 }
3923 else
3924 {
Brandon Jones5bf98292014-06-06 17:19:38 -07003925 *params = gl::QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003926 }
3927 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003928 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003929 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003931 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003932 }
3933}
3934
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003935void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003936{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003937 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003938
3939 try
3940 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003941 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003942
daniel@transgaming.come0078962010-04-15 20:45:08 +00003943 if (context)
3944 {
3945 if (index >= gl::MAX_VERTEX_ATTRIBS)
3946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003947 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003948 }
3949
3950 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003952 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003953 }
3954
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003955 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003956 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003957 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003958 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003960 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003961 }
3962}
3963
3964void __stdcall glHint(GLenum target, GLenum mode)
3965{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003966 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003967
3968 try
3969 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003970 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003971 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003972 case GL_FASTEST:
3973 case GL_NICEST:
3974 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003975 break;
3976 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003977 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003978 }
3979
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003980 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003981 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003982 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003983 case GL_GENERATE_MIPMAP_HINT:
3984 if (context) context->setGenerateMipmapHint(mode);
3985 break;
3986 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
3987 if (context) context->setFragmentShaderDerivativeHint(mode);
3988 break;
3989 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003990 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003991 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003992 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003993 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003995 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003996 }
3997}
3998
3999GLboolean __stdcall glIsBuffer(GLuint buffer)
4000{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004001 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004002
4003 try
4004 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004005 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004006
4007 if (context && buffer)
4008 {
4009 gl::Buffer *bufferObject = context->getBuffer(buffer);
4010
4011 if (bufferObject)
4012 {
4013 return GL_TRUE;
4014 }
4015 }
4016 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004017 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004019 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004020 }
4021
4022 return GL_FALSE;
4023}
4024
4025GLboolean __stdcall glIsEnabled(GLenum cap)
4026{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004027 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004028
4029 try
4030 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004031 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004032
4033 if (context)
4034 {
Geoff Lang0550d032014-01-30 11:29:07 -05004035 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004037 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004038 }
Geoff Lang0550d032014-01-30 11:29:07 -05004039
4040 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004041 }
4042 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004043 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004045 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004046 }
4047
4048 return false;
4049}
4050
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004051GLboolean __stdcall glIsFenceNV(GLuint fence)
4052{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004053 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004054
4055 try
4056 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004057 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004058
4059 if (context)
4060 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004061 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004062
4063 if (fenceObject == NULL)
4064 {
4065 return GL_FALSE;
4066 }
4067
4068 return fenceObject->isFence();
4069 }
4070 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004071 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004073 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004074 }
4075
4076 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004077}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004078
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004079GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4080{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004081 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004082
4083 try
4084 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004085 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004086
4087 if (context && framebuffer)
4088 {
4089 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4090
4091 if (framebufferObject)
4092 {
4093 return GL_TRUE;
4094 }
4095 }
4096 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004097 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004098 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004099 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004100 }
4101
4102 return GL_FALSE;
4103}
4104
4105GLboolean __stdcall glIsProgram(GLuint program)
4106{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004107 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004108
4109 try
4110 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004111 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004112
4113 if (context && program)
4114 {
4115 gl::Program *programObject = context->getProgram(program);
4116
4117 if (programObject)
4118 {
4119 return GL_TRUE;
4120 }
4121 }
4122 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004123 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004125 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004126 }
4127
4128 return GL_FALSE;
4129}
4130
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004131GLboolean __stdcall glIsQueryEXT(GLuint id)
4132{
4133 EVENT("(GLuint id = %d)", id);
4134
4135 try
4136 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004137 gl::Context *context = gl::getNonLostContext();
4138
4139 if (context)
4140 {
Geoff Lang37dde692014-01-31 16:34:54 -05004141 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004142 }
4143 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004144 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004145 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004146 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004147 }
4148
4149 return GL_FALSE;
4150}
4151
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004152GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4153{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004154 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004155
4156 try
4157 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004158 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004159
4160 if (context && renderbuffer)
4161 {
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04004162 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004163
4164 if (renderbufferObject)
4165 {
4166 return GL_TRUE;
4167 }
4168 }
4169 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004170 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004172 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004173 }
4174
4175 return GL_FALSE;
4176}
4177
4178GLboolean __stdcall glIsShader(GLuint shader)
4179{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004180 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004181
4182 try
4183 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004184 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004185
4186 if (context && shader)
4187 {
4188 gl::Shader *shaderObject = context->getShader(shader);
4189
4190 if (shaderObject)
4191 {
4192 return GL_TRUE;
4193 }
4194 }
4195 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004196 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004198 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004199 }
4200
4201 return GL_FALSE;
4202}
4203
4204GLboolean __stdcall glIsTexture(GLuint texture)
4205{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004206 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004207
4208 try
4209 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004210 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004211
4212 if (context && texture)
4213 {
4214 gl::Texture *textureObject = context->getTexture(texture);
4215
4216 if (textureObject)
4217 {
4218 return GL_TRUE;
4219 }
4220 }
4221 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004222 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004224 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004225 }
4226
4227 return GL_FALSE;
4228}
4229
4230void __stdcall glLineWidth(GLfloat width)
4231{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004232 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004233
4234 try
4235 {
4236 if (width <= 0.0f)
4237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004238 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004239 }
4240
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004241 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004242
4243 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004244 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004245 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004246 }
4247 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004248 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004250 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004251 }
4252}
4253
4254void __stdcall glLinkProgram(GLuint program)
4255{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004256 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004257
4258 try
4259 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004260 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004261
4262 if (context)
4263 {
4264 gl::Program *programObject = context->getProgram(program);
4265
4266 if (!programObject)
4267 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004268 if (context->getShader(program))
4269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004270 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004271 }
4272 else
4273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004274 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004275 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004276 }
4277
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004278 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004279 }
4280 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004281 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004283 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004284 }
4285}
4286
4287void __stdcall glPixelStorei(GLenum pname, GLint param)
4288{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004289 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004290
4291 try
4292 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004293 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004294
4295 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004296 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004297 switch (pname)
4298 {
4299 case GL_UNPACK_ALIGNMENT:
4300 if (param != 1 && param != 2 && param != 4 && param != 8)
4301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004302 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004303 }
4304
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004305 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004306 break;
4307
4308 case GL_PACK_ALIGNMENT:
4309 if (param != 1 && param != 2 && param != 4 && param != 8)
4310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004311 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004312 }
4313
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004314 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004315 break;
4316
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004317 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4318 context->setPackReverseRowOrder(param != 0);
4319 break;
4320
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004321 case GL_UNPACK_IMAGE_HEIGHT:
4322 case GL_UNPACK_SKIP_IMAGES:
4323 case GL_UNPACK_ROW_LENGTH:
4324 case GL_UNPACK_SKIP_ROWS:
4325 case GL_UNPACK_SKIP_PIXELS:
4326 case GL_PACK_ROW_LENGTH:
4327 case GL_PACK_SKIP_ROWS:
4328 case GL_PACK_SKIP_PIXELS:
4329 if (context->getClientVersion() < 3)
4330 {
4331 return gl::error(GL_INVALID_ENUM);
4332 }
4333 UNIMPLEMENTED();
4334 break;
4335
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004336 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004337 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004338 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004339 }
4340 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004341 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004343 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004344 }
4345}
4346
4347void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4348{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004349 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004350
4351 try
4352 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004353 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004354
4355 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004356 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004357 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004358 }
4359 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004360 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004362 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004363 }
4364}
4365
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004366void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4367 GLenum format, GLenum type, GLsizei bufSize,
4368 GLvoid *data)
4369{
4370 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4371 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4372 x, y, width, height, format, type, bufSize, data);
4373
4374 try
4375 {
4376 if (width < 0 || height < 0 || bufSize < 0)
4377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004378 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004379 }
4380
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004381 gl::Context *context = gl::getNonLostContext();
4382
4383 if (context)
4384 {
Jamie Madill26e91952014-03-05 15:01:27 -05004385 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4386 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004387 {
Jamie Madill26e91952014-03-05 15:01:27 -05004388 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004389 }
4390
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004391 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4392 }
4393 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004394 catch (...)
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004396 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004397 }
4398}
4399
4400void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4401 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004402{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004403 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004404 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004405 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004406
4407 try
4408 {
4409 if (width < 0 || height < 0)
4410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004411 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004412 }
4413
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004414 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004415
4416 if (context)
4417 {
Jamie Madill26e91952014-03-05 15:01:27 -05004418 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4419 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004420 {
Jamie Madill26e91952014-03-05 15:01:27 -05004421 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004422 }
4423
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004424 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004425 }
4426 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004427 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004429 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004430 }
4431}
4432
4433void __stdcall glReleaseShaderCompiler(void)
4434{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004435 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004436
4437 try
4438 {
4439 gl::Shader::releaseCompiler();
4440 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004441 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004443 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004444 }
4445}
4446
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004447void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004448{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004449 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 +00004450 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004451
4452 try
4453 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004454 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004455
4456 if (context)
4457 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004458 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004459 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004460 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004461 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004462 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004463
4464 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004465 }
4466 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004467 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004469 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004470 }
4471}
4472
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004473void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4474{
4475 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4476}
4477
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004478void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4479{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004480 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004481
4482 try
4483 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004484 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004485
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004486 if (context)
4487 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004488 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489 }
4490 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004491 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004493 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004494 }
4495}
4496
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004497void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4498{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004499 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004500
4501 try
4502 {
4503 if (condition != GL_ALL_COMPLETED_NV)
4504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004505 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004506 }
4507
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004508 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004509
4510 if (context)
4511 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004512 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004513
4514 if (fenceObject == NULL)
4515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004516 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004517 }
4518
4519 fenceObject->setFence(condition);
4520 }
4521 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004522 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004524 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004525 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004526}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004527
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004528void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4529{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004530 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 +00004531
4532 try
4533 {
4534 if (width < 0 || height < 0)
4535 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004536 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004537 }
4538
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004539 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004540
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004541 if (context)
4542 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004543 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004544 }
4545 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004546 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004547 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004548 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004549 }
4550}
4551
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004552void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004553{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004554 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004555 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004556 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004557
4558 try
4559 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004560 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004561 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004562 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004563 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004565 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004566 }
4567}
4568
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004569void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004570{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004571 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 +00004572 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004573
4574 try
4575 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004576 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004578 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004579 }
4580
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004581 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004582
4583 if (context)
4584 {
4585 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004586
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004587 if (!shaderObject)
4588 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004589 if (context->getProgram(shader))
4590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004591 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004592 }
4593 else
4594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004595 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004596 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597 }
4598
4599 shaderObject->setSource(count, string, length);
4600 }
4601 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004602 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004604 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004605 }
4606}
4607
4608void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4609{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004610 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004611}
4612
4613void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4614{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004615 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 +00004616
4617 try
4618 {
4619 switch (face)
4620 {
4621 case GL_FRONT:
4622 case GL_BACK:
4623 case GL_FRONT_AND_BACK:
4624 break;
4625 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004626 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004627 }
4628
4629 switch (func)
4630 {
4631 case GL_NEVER:
4632 case GL_ALWAYS:
4633 case GL_LESS:
4634 case GL_LEQUAL:
4635 case GL_EQUAL:
4636 case GL_GEQUAL:
4637 case GL_GREATER:
4638 case GL_NOTEQUAL:
4639 break;
4640 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004641 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004642 }
4643
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004644 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004645
4646 if (context)
4647 {
4648 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4649 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004650 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004651 }
4652
4653 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4654 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004655 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004656 }
4657 }
4658 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004659 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004661 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004662 }
4663}
4664
4665void __stdcall glStencilMask(GLuint mask)
4666{
4667 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4668}
4669
4670void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4671{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004672 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004673
4674 try
4675 {
4676 switch (face)
4677 {
4678 case GL_FRONT:
4679 case GL_BACK:
4680 case GL_FRONT_AND_BACK:
4681 break;
4682 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004683 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004684 }
4685
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004686 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004687
4688 if (context)
4689 {
4690 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4691 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004692 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004693 }
4694
4695 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4696 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004697 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004698 }
4699 }
4700 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004701 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004703 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004704 }
4705}
4706
4707void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4708{
4709 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4710}
4711
4712void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4713{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004714 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 +00004715 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004716
4717 try
4718 {
4719 switch (face)
4720 {
4721 case GL_FRONT:
4722 case GL_BACK:
4723 case GL_FRONT_AND_BACK:
4724 break;
4725 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004726 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004727 }
4728
4729 switch (fail)
4730 {
4731 case GL_ZERO:
4732 case GL_KEEP:
4733 case GL_REPLACE:
4734 case GL_INCR:
4735 case GL_DECR:
4736 case GL_INVERT:
4737 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004738 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004739 break;
4740 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004741 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004742 }
4743
4744 switch (zfail)
4745 {
4746 case GL_ZERO:
4747 case GL_KEEP:
4748 case GL_REPLACE:
4749 case GL_INCR:
4750 case GL_DECR:
4751 case GL_INVERT:
4752 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004753 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004754 break;
4755 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004756 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004757 }
4758
4759 switch (zpass)
4760 {
4761 case GL_ZERO:
4762 case GL_KEEP:
4763 case GL_REPLACE:
4764 case GL_INCR:
4765 case GL_DECR:
4766 case GL_INVERT:
4767 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004768 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769 break;
4770 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004771 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004772 }
4773
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004774 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004775
4776 if (context)
4777 {
4778 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4779 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004780 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004781 }
4782
4783 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4784 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004785 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004786 }
4787 }
4788 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004789 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004791 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004792 }
4793}
4794
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004795GLboolean __stdcall glTestFenceNV(GLuint fence)
4796{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004797 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004798
4799 try
4800 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004801 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004802
4803 if (context)
4804 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004805 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004806
4807 if (fenceObject == NULL)
4808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004809 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004810 }
4811
Jamie Madillfb9a7402013-07-26 11:55:01 -04004812 if (fenceObject->isFence() != GL_TRUE)
4813 {
4814 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4815 }
4816
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004817 return fenceObject->testFence();
4818 }
4819 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004820 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004822 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004823 }
4824
4825 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004826}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004827
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004828void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4829 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004830{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004831 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004832 "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 +00004833 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004834
4835 try
4836 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004837 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004838
4839 if (context)
4840 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004841 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004842 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004843 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004844 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004845 return;
4846 }
4847
4848 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004849 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004850 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004851 {
4852 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004853 }
4854
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004855 switch (target)
4856 {
4857 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004858 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004859 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004860 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004861 }
4862 break;
4863 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004864 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004865 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004866 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004867 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004868 break;
4869 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4870 {
4871 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004872 texture->setImageNegX(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_POSITIVE_Y:
4876 {
4877 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004878 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004879 }
4880 break;
4881 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4882 {
4883 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004884 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004885 }
4886 break;
4887 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4888 {
4889 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004890 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004891 }
4892 break;
4893 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4894 {
4895 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004896 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004897 }
4898 break;
4899 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004900 }
4901 }
4902 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004903 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004905 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004906 }
4907}
4908
4909void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4910{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004911 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4912
4913 try
4914 {
4915 gl::Context *context = gl::getNonLostContext();
4916
4917 if (context)
4918 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004919 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004920 {
4921 return;
4922 }
4923
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004924 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004925
Jamie Madillfb8a8302013-07-03 14:24:12 -04004926 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004928 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004929 }
4930
4931 switch (pname)
4932 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004933 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
4934 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
4935 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
4936 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
4937 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
4938 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
Geoff Langcec35902014-04-16 10:52:36 -04004939 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(param, context->getCaps().extensions.maxTextureAnisotropy); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004940 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
4941 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004942 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
4943 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
4944 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
4945 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04004946 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(gl::iround<GLint>(param)); break;
4947 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(gl::iround<GLint>(param)); break;
4948 case GL_TEXTURE_MIN_LOD: texture->setMinLod(param); break;
4949 case GL_TEXTURE_MAX_LOD: texture->setMaxLod(param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004950 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004951 }
4952 }
4953 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004954 catch (...)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004956 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004957 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004958}
4959
4960void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4961{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004962 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004963}
4964
4965void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4966{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004967 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004968
4969 try
4970 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004971 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004972
4973 if (context)
4974 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004975 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04004976 {
4977 return;
4978 }
4979
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004980 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004981
Jamie Madillfb8a8302013-07-03 14:24:12 -04004982 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004984 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004985 }
4986
4987 switch (pname)
4988 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004989 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
4990 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
4991 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
4992 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
4993 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
4994 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
Geoff Langcec35902014-04-16 10:52:36 -04004995 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getCaps().extensions.maxTextureAnisotropy); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004996 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
4997 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004998 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
4999 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5000 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5001 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005002 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(param); break;
5003 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(param); break;
5004 case GL_TEXTURE_MIN_LOD: texture->setMinLod((GLfloat)param); break;
5005 case GL_TEXTURE_MAX_LOD: texture->setMaxLod((GLfloat)param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005006 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005007 }
5008 }
5009 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005010 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005012 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005013 }
5014}
5015
5016void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5017{
5018 glTexParameteri(target, pname, *params);
5019}
5020
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005021void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5022{
5023 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5024 target, levels, internalformat, width, height);
5025
5026 try
5027 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005028 gl::Context *context = gl::getNonLostContext();
5029
5030 if (context)
5031 {
Geoff Langcec35902014-04-16 10:52:36 -04005032 if (!context->getCaps().extensions.textureStorage)
5033 {
5034 return gl::error(GL_INVALID_OPERATION);
5035 }
5036
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005037 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005038 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005039 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005040 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005041 }
5042
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005043 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005044 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005045 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005046 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005047 }
5048
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005049 switch (target)
5050 {
5051 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005052 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005053 gl::Texture2D *texture2d = context->getTexture2D();
5054 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005055 }
5056 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005057
Geoff Lang01c21d22013-09-24 11:52:16 -04005058 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005059 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005060 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5061 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005062 }
5063 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005064
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005065 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005066 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005067 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005068 }
5069 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005070 catch (...)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005072 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005073 }
5074}
5075
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005076void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5077 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005079 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005080 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005081 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005082 target, level, xoffset, yoffset, width, height, format, type, pixels);
5083
5084 try
5085 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005086 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005087
5088 if (context)
5089 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005090 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005091 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005092 xoffset, yoffset, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005093 {
5094 return;
5095 }
5096
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005097 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005098 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005099 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005100 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005101 return;
5102 }
5103
Geoff Langc41e42d2014-04-28 10:58:16 -04005104 // Zero sized uploads are valid but no-ops
5105 if (width == 0 || height == 0)
5106 {
5107 return;
5108 }
5109
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005110 switch (target)
5111 {
5112 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005113 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005114 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005115 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005116 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005117 break;
5118
5119 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5120 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5121 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5122 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5123 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5124 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005125 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005126 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005127 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005128 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005129 break;
5130
5131 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005132 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005133 }
5134 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005135 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005136 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005138 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005139 }
5140}
5141
5142void __stdcall glUniform1f(GLint location, GLfloat x)
5143{
5144 glUniform1fv(location, 1, &x);
5145}
5146
5147void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5148{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005149 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005150
5151 try
5152 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005153 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005154
5155 if (context)
5156 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005157 if (!ValidateUniform(context, GL_FLOAT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005158 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005159 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005160 }
5161
Jamie Madillaa981bd2014-05-20 10:55:55 -04005162 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005163 programBinary->setUniform1fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005164 }
5165 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005166 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005168 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005169 }
5170}
5171
5172void __stdcall glUniform1i(GLint location, GLint x)
5173{
5174 glUniform1iv(location, 1, &x);
5175}
5176
5177void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5178{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005179 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005180
5181 try
5182 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005183 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005184
5185 if (context)
5186 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005187 if (!ValidateUniform(context, GL_INT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005188 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005189 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005190 }
5191
Jamie Madillaa981bd2014-05-20 10:55:55 -04005192 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005193 programBinary->setUniform1iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005194 }
5195 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005196 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005198 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005199 }
5200}
5201
5202void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5203{
5204 GLfloat xy[2] = {x, y};
5205
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005206 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005207}
5208
5209void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5210{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005211 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005212
5213 try
5214 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005215 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005216
5217 if (context)
5218 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005219 if (!ValidateUniform(context, GL_FLOAT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005220 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005221 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005222 }
5223
Jamie Madillaa981bd2014-05-20 10:55:55 -04005224 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005225 programBinary->setUniform2fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005226 }
5227 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005228 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005230 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005231 }
5232}
5233
5234void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5235{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005236 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005237
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005238 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005239}
5240
5241void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5242{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005243 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005244
5245 try
5246 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005247 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005248
5249 if (context)
5250 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005251 if (!ValidateUniform(context, GL_INT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005252 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005253 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005254 }
5255
Jamie Madillaa981bd2014-05-20 10:55:55 -04005256 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005257 programBinary->setUniform2iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005258 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005259 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005260 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005262 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005263 }
5264}
5265
5266void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5267{
5268 GLfloat xyz[3] = {x, y, z};
5269
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005270 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005271}
5272
5273void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5274{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005275 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276
5277 try
5278 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005279 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005280
5281 if (context)
5282 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005283 if (!ValidateUniform(context, GL_FLOAT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005284 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005285 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005286 }
5287
Jamie Madillaa981bd2014-05-20 10:55:55 -04005288 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005289 programBinary->setUniform3fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005290 }
5291 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005292 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005294 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005295 }
5296}
5297
5298void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5299{
5300 GLint xyz[3] = {x, y, z};
5301
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005302 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005303}
5304
5305void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5306{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005307 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005308
5309 try
5310 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005311 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005312
5313 if (context)
5314 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005315 if (!ValidateUniform(context, GL_INT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005316 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005317 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005318 }
5319
Jamie Madillaa981bd2014-05-20 10:55:55 -04005320 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005321 programBinary->setUniform3iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005322 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005323 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005324 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005326 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005327 }
5328}
5329
5330void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5331{
5332 GLfloat xyzw[4] = {x, y, z, w};
5333
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005334 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005335}
5336
5337void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5338{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005339 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005340
5341 try
5342 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005343 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005344
5345 if (context)
5346 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005347 if (!ValidateUniform(context, GL_FLOAT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005348 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005349 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005350 }
5351
Jamie Madillaa981bd2014-05-20 10:55:55 -04005352 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005353 programBinary->setUniform4fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005354 }
5355 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005356 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005358 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005359 }
5360}
5361
5362void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5363{
5364 GLint xyzw[4] = {x, y, z, w};
5365
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005366 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005367}
5368
5369void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5370{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005371 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005372
5373 try
5374 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005375 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005376
5377 if (context)
5378 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005379 if (!ValidateUniform(context, GL_INT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005380 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005381 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005382 }
5383
Jamie Madillaa981bd2014-05-20 10:55:55 -04005384 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005385 programBinary->setUniform4iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005386 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005387 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005388 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005390 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005391 }
5392}
5393
5394void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5395{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005396 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005397 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005398
5399 try
5400 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005401 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005402
5403 if (context)
5404 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005405 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005406 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005407 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005408 }
5409
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005410 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005411 programBinary->setUniformMatrix2fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005412 }
5413 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005414 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005416 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005417 }
5418}
5419
5420void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5421{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005422 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005423 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005424
5425 try
5426 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005427 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005428
5429 if (context)
5430 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005431 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005432 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005433 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005434 }
5435
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005436 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005437 programBinary->setUniformMatrix3fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005438 }
5439 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005440 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005442 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005443 }
5444}
5445
5446void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5447{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005448 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005449 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005450
5451 try
5452 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005453 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005454
5455 if (context)
5456 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005457 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005458 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005459 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005460 }
5461
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005462 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005463 programBinary->setUniformMatrix4fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005464 }
5465 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005466 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005468 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005469 }
5470}
5471
5472void __stdcall glUseProgram(GLuint program)
5473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005474 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005475
5476 try
5477 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005478 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005479
5480 if (context)
5481 {
5482 gl::Program *programObject = context->getProgram(program);
5483
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005484 if (!programObject && program != 0)
5485 {
5486 if (context->getShader(program))
5487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005488 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005489 }
5490 else
5491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005492 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005493 }
5494 }
5495
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005496 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005498 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005499 }
5500
5501 context->useProgram(program);
5502 }
5503 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005504 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005506 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005507 }
5508}
5509
5510void __stdcall glValidateProgram(GLuint program)
5511{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005512 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005513
5514 try
5515 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005516 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005517
5518 if (context)
5519 {
5520 gl::Program *programObject = context->getProgram(program);
5521
5522 if (!programObject)
5523 {
5524 if (context->getShader(program))
5525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005526 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005527 }
5528 else
5529 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005530 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005531 }
5532 }
5533
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005534 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005535 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005536 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005537 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005539 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005540 }
5541}
5542
5543void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5544{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005545 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005546
5547 try
5548 {
5549 if (index >= gl::MAX_VERTEX_ATTRIBS)
5550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005551 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005552 }
5553
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005554 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005555
5556 if (context)
5557 {
5558 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005559 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005560 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005561 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005562 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005563 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005564 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005565 }
5566}
5567
5568void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5569{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005570 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005571
5572 try
5573 {
5574 if (index >= gl::MAX_VERTEX_ATTRIBS)
5575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005576 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005577 }
5578
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005579 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005580
5581 if (context)
5582 {
5583 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005584 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005585 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005586 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005587 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005589 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005590 }
5591}
5592
5593void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5594{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005595 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005596
5597 try
5598 {
5599 if (index >= gl::MAX_VERTEX_ATTRIBS)
5600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005601 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005602 }
5603
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005604 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005605
5606 if (context)
5607 {
5608 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005609 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005610 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005611 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005612 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005614 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005615 }
5616}
5617
5618void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5619{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005620 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005621
5622 try
5623 {
5624 if (index >= gl::MAX_VERTEX_ATTRIBS)
5625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005626 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005627 }
5628
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005629 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005630
5631 if (context)
5632 {
5633 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005634 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005635 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005636 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005637 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005639 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005640 }
5641}
5642
5643void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5644{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005645 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 +00005646
5647 try
5648 {
5649 if (index >= gl::MAX_VERTEX_ATTRIBS)
5650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005651 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005652 }
5653
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005654 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005655
5656 if (context)
5657 {
5658 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005659 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005660 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005662 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005664 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005665 }
5666}
5667
5668void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5669{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005670 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005671
5672 try
5673 {
5674 if (index >= gl::MAX_VERTEX_ATTRIBS)
5675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005676 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005677 }
5678
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005679 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005680
5681 if (context)
5682 {
5683 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005684 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005685 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005686 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005687 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005689 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005690 }
5691}
5692
5693void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5694{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005695 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 +00005696
5697 try
5698 {
5699 if (index >= gl::MAX_VERTEX_ATTRIBS)
5700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005701 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005702 }
5703
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005704 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005705
5706 if (context)
5707 {
5708 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005709 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005710 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005711 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005712 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005713 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005714 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005715 }
5716}
5717
5718void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5719{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005720 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005721
5722 try
5723 {
5724 if (index >= gl::MAX_VERTEX_ATTRIBS)
5725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005726 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005727 }
5728
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005729 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005730
5731 if (context)
5732 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005733 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005734 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005735 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005736 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005738 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005739 }
5740}
5741
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005742void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5743{
5744 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5745
5746 try
5747 {
5748 if (index >= gl::MAX_VERTEX_ATTRIBS)
5749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005750 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005751 }
5752
5753 gl::Context *context = gl::getNonLostContext();
5754
5755 if (context)
5756 {
5757 context->setVertexAttribDivisor(index, divisor);
5758 }
5759 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005760 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005762 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005763 }
5764}
5765
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005766void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005767{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005768 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005769 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005770 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005771
5772 try
5773 {
5774 if (index >= gl::MAX_VERTEX_ATTRIBS)
5775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005776 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005777 }
5778
5779 if (size < 1 || size > 4)
5780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005781 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005782 }
5783
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005784 gl::Context *context = gl::getNonLostContext();
5785
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005786 switch (type)
5787 {
5788 case GL_BYTE:
5789 case GL_UNSIGNED_BYTE:
5790 case GL_SHORT:
5791 case GL_UNSIGNED_SHORT:
5792 case GL_FIXED:
5793 case GL_FLOAT:
5794 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005795 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005796 case GL_INT:
5797 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005798 case GL_INT_2_10_10_10_REV:
5799 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005800 if (context && context->getClientVersion() < 3)
5801 {
5802 return gl::error(GL_INVALID_ENUM);
5803 }
5804 else
5805 {
5806 break;
5807 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005808 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005809 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005810 }
5811
5812 if (stride < 0)
5813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005814 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005815 }
5816
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005817 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
5818 {
5819 return gl::error(GL_INVALID_OPERATION);
5820 }
5821
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005822 if (context)
5823 {
Jamie Madilld8db8662013-07-02 11:57:04 -04005824 // [OpenGL ES 3.0.2] Section 2.8 page 24:
5825 // An INVALID_OPERATION error is generated when a non-zero vertex array object
5826 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
5827 // and the pointer argument is not NULL.
5828 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
5829 {
5830 return gl::error(GL_INVALID_OPERATION);
5831 }
5832
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00005833 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
5834 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005835 }
5836 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005837 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005839 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005840 }
5841}
5842
5843void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
5844{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005845 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 +00005846
5847 try
5848 {
5849 if (width < 0 || height < 0)
5850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005851 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005852 }
5853
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005854 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005855
5856 if (context)
5857 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005858 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005859 }
5860 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005861 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005863 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005864 }
5865}
5866
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005867// OpenGL ES 3.0 functions
5868
5869void __stdcall glReadBuffer(GLenum mode)
5870{
5871 EVENT("(GLenum mode = 0x%X)", mode);
5872
5873 try
5874 {
5875 gl::Context *context = gl::getNonLostContext();
5876
5877 if (context)
5878 {
5879 if (context->getClientVersion() < 3)
5880 {
5881 return gl::error(GL_INVALID_OPERATION);
5882 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005883
Jamie Madill54133512013-06-21 09:33:07 -04005884 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005885 UNIMPLEMENTED();
5886 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005887 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005888 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005889 {
5890 return gl::error(GL_OUT_OF_MEMORY);
5891 }
5892}
5893
5894void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
5895{
5896 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
5897 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
5898
5899 try
5900 {
5901 gl::Context *context = gl::getNonLostContext();
5902
5903 if (context)
5904 {
5905 if (context->getClientVersion() < 3)
5906 {
5907 return gl::error(GL_INVALID_OPERATION);
5908 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005909
Jamie Madill54133512013-06-21 09:33:07 -04005910 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005911 UNIMPLEMENTED();
5912 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005913 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005914 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005915 {
5916 return gl::error(GL_OUT_OF_MEMORY);
5917 }
5918}
5919
5920void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
5921{
5922 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
5923 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
5924 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5925 target, level, internalformat, width, height, depth, border, format, type, pixels);
5926
5927 try
5928 {
5929 gl::Context *context = gl::getNonLostContext();
5930
5931 if (context)
5932 {
5933 if (context->getClientVersion() < 3)
5934 {
5935 return gl::error(GL_INVALID_OPERATION);
5936 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005937
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005938 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005939 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005940 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005941 {
5942 return;
5943 }
5944
5945 switch(target)
5946 {
5947 case GL_TEXTURE_3D:
5948 {
5949 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005950 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005951 }
5952 break;
5953
5954 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005955 {
5956 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04005957 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005958 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005959 break;
5960
5961 default:
5962 return gl::error(GL_INVALID_ENUM);
5963 }
5964 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005965 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005966 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005967 {
5968 return gl::error(GL_OUT_OF_MEMORY);
5969 }
5970}
5971
5972void __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)
5973{
5974 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
5975 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
5976 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5977 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
5978
5979 try
5980 {
5981 gl::Context *context = gl::getNonLostContext();
5982
5983 if (context)
5984 {
5985 if (context->getClientVersion() < 3)
5986 {
5987 return gl::error(GL_INVALID_OPERATION);
5988 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005989
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005990 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005991 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005992 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005993 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005994 {
5995 return;
5996 }
5997
Geoff Langc41e42d2014-04-28 10:58:16 -04005998 // Zero sized uploads are valid but no-ops
5999 if (width == 0 || height == 0 || depth == 0)
6000 {
6001 return;
6002 }
6003
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006004 switch(target)
6005 {
6006 case GL_TEXTURE_3D:
6007 {
6008 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006009 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 +00006010 }
6011 break;
6012
6013 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006014 {
6015 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006016 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 +00006017 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006018 break;
6019
6020 default:
6021 return gl::error(GL_INVALID_ENUM);
6022 }
6023 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006024 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006025 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006026 {
6027 return gl::error(GL_OUT_OF_MEMORY);
6028 }
6029}
6030
6031void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6032{
6033 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6034 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6035 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6036
6037 try
6038 {
6039 gl::Context *context = gl::getNonLostContext();
6040
6041 if (context)
6042 {
6043 if (context->getClientVersion() < 3)
6044 {
6045 return gl::error(GL_INVALID_OPERATION);
6046 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006047
Jamie Madill6f38f822014-06-06 17:12:20 -04006048 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006049 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006050 {
6051 return;
6052 }
6053
6054 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6055 gl::Texture *texture = NULL;
6056 switch (target)
6057 {
6058 case GL_TEXTURE_3D:
6059 texture = context->getTexture3D();
6060 break;
6061
6062 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006063 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006064 break;
6065
6066 default:
6067 return gl::error(GL_INVALID_ENUM);
6068 }
6069
6070 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6071 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006072 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006073 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006074 {
6075 return gl::error(GL_OUT_OF_MEMORY);
6076 }
6077}
6078
6079void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6080{
Geoff Langeef52cc2013-10-16 15:07:39 -04006081 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 +00006082 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6083 "const GLvoid* data = 0x%0.8p)",
6084 target, level, internalformat, width, height, depth, border, imageSize, data);
6085
6086 try
6087 {
6088 gl::Context *context = gl::getNonLostContext();
6089
6090 if (context)
6091 {
6092 if (context->getClientVersion() < 3)
6093 {
6094 return gl::error(GL_INVALID_OPERATION);
6095 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006096
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006097 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 +00006098 {
6099 return gl::error(GL_INVALID_VALUE);
6100 }
6101
6102 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006103 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006104 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006105 {
6106 return;
6107 }
6108
6109 switch(target)
6110 {
6111 case GL_TEXTURE_3D:
6112 {
6113 gl::Texture3D *texture = context->getTexture3D();
6114 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6115 }
6116 break;
6117
6118 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006119 {
6120 gl::Texture2DArray *texture = context->getTexture2DArray();
6121 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6122 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006123 break;
6124
6125 default:
6126 return gl::error(GL_INVALID_ENUM);
6127 }
6128 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006129 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006130 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006131 {
6132 return gl::error(GL_OUT_OF_MEMORY);
6133 }
6134}
6135
6136void __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)
6137{
6138 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6139 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6140 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6141 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6142
6143 try
6144 {
6145 gl::Context *context = gl::getNonLostContext();
6146
6147 if (context)
6148 {
6149 if (context->getClientVersion() < 3)
6150 {
6151 return gl::error(GL_INVALID_OPERATION);
6152 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006153
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006154 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 +00006155 {
6156 return gl::error(GL_INVALID_VALUE);
6157 }
6158
6159 if (!data)
6160 {
6161 return gl::error(GL_INVALID_VALUE);
6162 }
6163
6164 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006165 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006166 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006167 {
6168 return;
6169 }
6170
Geoff Langc41e42d2014-04-28 10:58:16 -04006171 // Zero sized uploads are valid but no-ops
6172 if (width == 0 || height == 0)
6173 {
6174 return;
6175 }
6176
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006177 switch(target)
6178 {
6179 case GL_TEXTURE_3D:
6180 {
6181 gl::Texture3D *texture = context->getTexture3D();
6182 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6183 format, imageSize, data);
6184 }
6185 break;
6186
6187 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006188 {
6189 gl::Texture2DArray *texture = context->getTexture2DArray();
6190 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6191 format, imageSize, data);
6192 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006193 break;
6194
6195 default:
6196 return gl::error(GL_INVALID_ENUM);
6197 }
6198 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006199 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006200 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006201 {
6202 return gl::error(GL_OUT_OF_MEMORY);
6203 }
6204}
6205
6206void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6207{
6208 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6209
6210 try
6211 {
6212 gl::Context *context = gl::getNonLostContext();
6213
6214 if (context)
6215 {
6216 if (context->getClientVersion() < 3)
6217 {
6218 return gl::error(GL_INVALID_OPERATION);
6219 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006220
Geoff Lang37dde692014-01-31 16:34:54 -05006221 if (n < 0)
6222 {
6223 return gl::error(GL_INVALID_VALUE);
6224 }
6225
6226 for (GLsizei i = 0; i < n; i++)
6227 {
6228 ids[i] = context->createQuery();
6229 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006230 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006231 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006232 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006233 {
6234 return gl::error(GL_OUT_OF_MEMORY);
6235 }
6236}
6237
6238void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6239{
6240 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6241
6242 try
6243 {
6244 gl::Context *context = gl::getNonLostContext();
6245
6246 if (context)
6247 {
6248 if (context->getClientVersion() < 3)
6249 {
6250 return gl::error(GL_INVALID_OPERATION);
6251 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006252
Geoff Lang37dde692014-01-31 16:34:54 -05006253 if (n < 0)
6254 {
6255 return gl::error(GL_INVALID_VALUE);
6256 }
6257
6258 for (GLsizei i = 0; i < n; i++)
6259 {
6260 context->deleteQuery(ids[i]);
6261 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006262 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006263 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006264 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006265 {
6266 return gl::error(GL_OUT_OF_MEMORY);
6267 }
6268}
6269
6270GLboolean __stdcall glIsQuery(GLuint id)
6271{
6272 EVENT("(GLuint id = %u)", id);
6273
6274 try
6275 {
6276 gl::Context *context = gl::getNonLostContext();
6277
6278 if (context)
6279 {
6280 if (context->getClientVersion() < 3)
6281 {
6282 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6283 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006284
Geoff Lang37dde692014-01-31 16:34:54 -05006285 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006286 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006287 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006288 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006289 {
6290 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6291 }
6292
6293 return GL_FALSE;
6294}
6295
6296void __stdcall glBeginQuery(GLenum target, GLuint id)
6297{
6298 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6299
6300 try
6301 {
6302 gl::Context *context = gl::getNonLostContext();
6303
6304 if (context)
6305 {
6306 if (context->getClientVersion() < 3)
6307 {
6308 return gl::error(GL_INVALID_OPERATION);
6309 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006310
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006311 if (!ValidateBeginQuery(context, target, id))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006312 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006313 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006314 }
Geoff Lang37dde692014-01-31 16:34:54 -05006315 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006316 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006317 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006318 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006319 {
6320 return gl::error(GL_OUT_OF_MEMORY);
6321 }
6322}
6323
6324void __stdcall glEndQuery(GLenum target)
6325{
6326 EVENT("(GLenum target = 0x%X)", target);
6327
6328 try
6329 {
6330 gl::Context *context = gl::getNonLostContext();
6331
6332 if (context)
6333 {
6334 if (context->getClientVersion() < 3)
6335 {
6336 return gl::error(GL_INVALID_OPERATION);
6337 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006338
Jamie Madill45c785d2014-05-13 14:09:34 -04006339 if (!ValidateEndQuery(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006340 {
Jamie Madill45c785d2014-05-13 14:09:34 -04006341 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006342 }
Geoff Lang37dde692014-01-31 16:34:54 -05006343
6344 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006345 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006346 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006347 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006348 {
6349 return gl::error(GL_OUT_OF_MEMORY);
6350 }
6351}
6352
6353void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6354{
6355 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6356
6357 try
6358 {
6359 gl::Context *context = gl::getNonLostContext();
6360
6361 if (context)
6362 {
6363 if (context->getClientVersion() < 3)
6364 {
6365 return gl::error(GL_INVALID_OPERATION);
6366 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006367
Geoff Lang37dde692014-01-31 16:34:54 -05006368 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006369 {
Geoff Lang37dde692014-01-31 16:34:54 -05006370 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006371 }
Geoff Lang37dde692014-01-31 16:34:54 -05006372
6373 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006374 {
Geoff Lang37dde692014-01-31 16:34:54 -05006375 case GL_CURRENT_QUERY:
Jamie Madill45c785d2014-05-13 14:09:34 -04006376 params[0] = static_cast<GLint>(context->getActiveQueryId(target));
Geoff Lang37dde692014-01-31 16:34:54 -05006377 break;
6378
6379 default:
6380 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006381 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006382 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006383 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006384 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006385 {
6386 return gl::error(GL_OUT_OF_MEMORY);
6387 }
6388}
6389
6390void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6391{
6392 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6393
6394 try
6395 {
6396 gl::Context *context = gl::getNonLostContext();
6397
6398 if (context)
6399 {
6400 if (context->getClientVersion() < 3)
6401 {
6402 return gl::error(GL_INVALID_OPERATION);
6403 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006404
Geoff Lang37dde692014-01-31 16:34:54 -05006405 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6406
6407 if (!queryObject)
6408 {
6409 return gl::error(GL_INVALID_OPERATION);
6410 }
6411
Jamie Madill45c785d2014-05-13 14:09:34 -04006412 if (context->getActiveQueryId(queryObject->getType()) == id)
Geoff Lang37dde692014-01-31 16:34:54 -05006413 {
6414 return gl::error(GL_INVALID_OPERATION);
6415 }
6416
6417 switch(pname)
6418 {
6419 case GL_QUERY_RESULT:
6420 params[0] = queryObject->getResult();
6421 break;
6422 case GL_QUERY_RESULT_AVAILABLE:
6423 params[0] = queryObject->isResultAvailable();
6424 break;
6425 default:
6426 return gl::error(GL_INVALID_ENUM);
6427 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006428 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006429 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006430 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006431 {
6432 return gl::error(GL_OUT_OF_MEMORY);
6433 }
6434}
6435
6436GLboolean __stdcall glUnmapBuffer(GLenum target)
6437{
6438 EVENT("(GLenum target = 0x%X)", target);
6439
6440 try
6441 {
6442 gl::Context *context = gl::getNonLostContext();
6443
6444 if (context)
6445 {
6446 if (context->getClientVersion() < 3)
6447 {
6448 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6449 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006450
Shannon Woodsb3801742014-03-27 14:59:19 -04006451 return glUnmapBufferOES(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006452 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006453 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006454 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006455 {
6456 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6457 }
6458
6459 return GL_FALSE;
6460}
6461
6462void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6463{
6464 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6465
6466 try
6467 {
6468 gl::Context *context = gl::getNonLostContext();
6469
6470 if (context)
6471 {
6472 if (context->getClientVersion() < 3)
6473 {
6474 return gl::error(GL_INVALID_OPERATION);
6475 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006476
Shannon Woodsb3801742014-03-27 14:59:19 -04006477 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006478 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006479 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006480 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006481 {
6482 return gl::error(GL_OUT_OF_MEMORY);
6483 }
6484}
6485
6486void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6487{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006488 try
6489 {
6490 gl::Context *context = gl::getNonLostContext();
6491
6492 if (context)
6493 {
6494 if (context->getClientVersion() < 3)
6495 {
6496 return gl::error(GL_INVALID_OPERATION);
6497 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006498
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006499 glDrawBuffersEXT(n, bufs);
6500 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006501 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006502 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006503 {
6504 return gl::error(GL_OUT_OF_MEMORY);
6505 }
6506}
6507
6508void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6509{
6510 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6511 location, count, transpose, value);
6512
6513 try
6514 {
6515 gl::Context *context = gl::getNonLostContext();
6516
6517 if (context)
6518 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006519 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006520 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006521 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006522 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006523
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006524 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006525 programBinary->setUniformMatrix2x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006526 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006527 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006528 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006529 {
6530 return gl::error(GL_OUT_OF_MEMORY);
6531 }
6532}
6533
6534void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6535{
6536 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6537 location, count, transpose, value);
6538
6539 try
6540 {
6541 gl::Context *context = gl::getNonLostContext();
6542
6543 if (context)
6544 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006545 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006546 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006547 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006548 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006549
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006550 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006551 programBinary->setUniformMatrix3x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006552 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006553 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006554 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006555 {
6556 return gl::error(GL_OUT_OF_MEMORY);
6557 }
6558}
6559
6560void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6561{
6562 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6563 location, count, transpose, value);
6564
6565 try
6566 {
6567 gl::Context *context = gl::getNonLostContext();
6568
6569 if (context)
6570 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006571 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006572 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006573 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006574 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006575
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006576 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006577 programBinary->setUniformMatrix2x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006578 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006579 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006580 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006581 {
6582 return gl::error(GL_OUT_OF_MEMORY);
6583 }
6584}
6585
6586void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6587{
6588 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6589 location, count, transpose, value);
6590
6591 try
6592 {
6593 gl::Context *context = gl::getNonLostContext();
6594
6595 if (context)
6596 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006597 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006598 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006599 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006600 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006601
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006602 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006603 programBinary->setUniformMatrix4x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006604 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006605 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006606 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006607 {
6608 return gl::error(GL_OUT_OF_MEMORY);
6609 }
6610}
6611
6612void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6613{
6614 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6615 location, count, transpose, value);
6616
6617 try
6618 {
6619 gl::Context *context = gl::getNonLostContext();
6620
6621 if (context)
6622 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006623 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006624 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006625 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006626 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006627
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006628 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006629 programBinary->setUniformMatrix3x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006630 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006631 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006632 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006633 {
6634 return gl::error(GL_OUT_OF_MEMORY);
6635 }
6636}
6637
6638void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6639{
6640 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6641 location, count, transpose, value);
6642
6643 try
6644 {
6645 gl::Context *context = gl::getNonLostContext();
6646
6647 if (context)
6648 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006649 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006650 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006651 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006652 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006653
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006654 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006655 programBinary->setUniformMatrix4x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006657 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006658 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006659 {
6660 return gl::error(GL_OUT_OF_MEMORY);
6661 }
6662}
6663
6664void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6665{
6666 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6667 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6668 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6669
6670 try
6671 {
6672 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006673 if (context)
6674 {
6675 if (context->getClientVersion() < 3)
6676 {
6677 return gl::error(GL_INVALID_OPERATION);
6678 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006679
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006680 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006681 dstX0, dstY0, dstX1, dstY1, mask, filter,
6682 false))
6683 {
6684 return;
6685 }
6686
6687 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6688 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006689 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006690 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006691 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006692 {
6693 return gl::error(GL_OUT_OF_MEMORY);
6694 }
6695}
6696
6697void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
6698{
6699 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6700 target, samples, internalformat, width, height);
6701
6702 try
6703 {
6704 gl::Context *context = gl::getNonLostContext();
6705
6706 if (context)
6707 {
6708 if (context->getClientVersion() < 3)
6709 {
6710 return gl::error(GL_INVALID_OPERATION);
6711 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006712
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006713 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04006714 width, height, false))
6715 {
6716 return;
6717 }
6718
6719 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006720 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006721 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006722 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006723 {
6724 return gl::error(GL_OUT_OF_MEMORY);
6725 }
6726}
6727
6728void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
6729{
6730 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
6731 target, attachment, texture, level, layer);
6732
6733 try
6734 {
6735 gl::Context *context = gl::getNonLostContext();
6736
6737 if (context)
6738 {
6739 if (context->getClientVersion() < 3)
6740 {
6741 return gl::error(GL_INVALID_OPERATION);
6742 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006743
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006744 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04006745 {
6746 return;
6747 }
6748
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05006749 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
6750 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04006751
6752 gl::Texture *textureObject = context->getTexture(texture);
6753 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
6754
6755 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
6756 {
6757 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
6758 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
6759 }
6760 else
6761 {
6762 switch (attachment)
6763 {
6764 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
6765 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
6766 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
6767 }
6768 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006769 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006770 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006771 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006772 {
6773 return gl::error(GL_OUT_OF_MEMORY);
6774 }
6775}
6776
6777GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
6778{
6779 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
6780 target, offset, length, access);
6781
6782 try
6783 {
6784 gl::Context *context = gl::getNonLostContext();
6785
6786 if (context)
6787 {
6788 if (context->getClientVersion() < 3)
6789 {
6790 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
6791 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006792
Shannon Woods916e7692014-03-27 16:58:22 -04006793 return glMapBufferRangeEXT(target, offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006794 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006795 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006796 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006797 {
6798 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
6799 }
6800
6801 return NULL;
6802}
6803
6804void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
6805{
6806 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
6807
6808 try
6809 {
6810 gl::Context *context = gl::getNonLostContext();
6811
6812 if (context)
6813 {
6814 if (context->getClientVersion() < 3)
6815 {
6816 return gl::error(GL_INVALID_OPERATION);
6817 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006818
Shannon Woods916e7692014-03-27 16:58:22 -04006819 glFlushMappedBufferRangeEXT(target, offset, length);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006820 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006821 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006822 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006823 {
6824 return gl::error(GL_OUT_OF_MEMORY);
6825 }
6826}
6827
6828void __stdcall glBindVertexArray(GLuint array)
6829{
6830 EVENT("(GLuint array = %u)", array);
6831
6832 try
6833 {
6834 gl::Context *context = gl::getNonLostContext();
6835
6836 if (context)
6837 {
6838 if (context->getClientVersion() < 3)
6839 {
6840 return gl::error(GL_INVALID_OPERATION);
6841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006842
Jamie Madilld1028542013-07-02 11:57:04 -04006843 gl::VertexArray *vao = context->getVertexArray(array);
6844
6845 if (!vao)
6846 {
6847 // The default VAO should always exist
6848 ASSERT(array != 0);
6849 return gl::error(GL_INVALID_OPERATION);
6850 }
6851
6852 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006853 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006854 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006855 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006856 {
6857 return gl::error(GL_OUT_OF_MEMORY);
6858 }
6859}
6860
6861void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
6862{
6863 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
6864
6865 try
6866 {
6867 gl::Context *context = gl::getNonLostContext();
6868
6869 if (context)
6870 {
6871 if (context->getClientVersion() < 3)
6872 {
6873 return gl::error(GL_INVALID_OPERATION);
6874 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006875
Jamie Madilld1028542013-07-02 11:57:04 -04006876 if (n < 0)
6877 {
6878 return gl::error(GL_INVALID_VALUE);
6879 }
6880
6881 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6882 {
6883 if (arrays[arrayIndex] != 0)
6884 {
6885 context->deleteVertexArray(arrays[arrayIndex]);
6886 }
6887 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006888 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006889 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006890 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006891 {
6892 return gl::error(GL_OUT_OF_MEMORY);
6893 }
6894}
6895
6896void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
6897{
6898 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
6899
6900 try
6901 {
6902 gl::Context *context = gl::getNonLostContext();
6903
6904 if (context)
6905 {
6906 if (context->getClientVersion() < 3)
6907 {
6908 return gl::error(GL_INVALID_OPERATION);
6909 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006910
Jamie Madilld1028542013-07-02 11:57:04 -04006911 if (n < 0)
6912 {
6913 return gl::error(GL_INVALID_VALUE);
6914 }
6915
6916 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6917 {
6918 arrays[arrayIndex] = context->createVertexArray();
6919 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006920 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006921 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006922 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006923 {
6924 return gl::error(GL_OUT_OF_MEMORY);
6925 }
6926}
6927
6928GLboolean __stdcall glIsVertexArray(GLuint array)
6929{
6930 EVENT("(GLuint array = %u)", array);
6931
6932 try
6933 {
6934 gl::Context *context = gl::getNonLostContext();
6935
6936 if (context)
6937 {
6938 if (context->getClientVersion() < 3)
6939 {
6940 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6941 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006942
Jamie Madilld1028542013-07-02 11:57:04 -04006943 if (array == 0)
6944 {
6945 return GL_FALSE;
6946 }
6947
6948 gl::VertexArray *vao = context->getVertexArray(array);
6949
6950 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006951 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006952 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006953 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006954 {
6955 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6956 }
6957
6958 return GL_FALSE;
6959}
6960
6961void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
6962{
6963 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
6964 target, index, data);
6965
6966 try
6967 {
6968 gl::Context *context = gl::getNonLostContext();
6969
6970 if (context)
6971 {
6972 if (context->getClientVersion() < 3)
6973 {
6974 return gl::error(GL_INVALID_OPERATION);
6975 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006976
Shannon Woods15934d52013-08-19 14:28:49 -04006977 switch (target)
6978 {
6979 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
6980 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
6981 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
6982 if (index >= context->getMaxTransformFeedbackBufferBindings())
6983 return gl::error(GL_INVALID_VALUE);
6984 break;
6985 case GL_UNIFORM_BUFFER_START:
6986 case GL_UNIFORM_BUFFER_SIZE:
6987 case GL_UNIFORM_BUFFER_BINDING:
6988 if (index >= context->getMaximumCombinedUniformBufferBindings())
6989 return gl::error(GL_INVALID_VALUE);
6990 break;
6991 default:
6992 return gl::error(GL_INVALID_ENUM);
6993 }
6994
6995 if (!(context->getIndexedIntegerv(target, index, data)))
6996 {
6997 GLenum nativeType;
6998 unsigned int numParams = 0;
6999 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7000 return gl::error(GL_INVALID_ENUM);
7001
7002 if (numParams == 0)
7003 return; // it is known that pname is valid, but there are no parameters to return
7004
7005 if (nativeType == GL_INT_64_ANGLEX)
7006 {
7007 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7008 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7009 GLint64 *int64Params = new GLint64[numParams];
7010
7011 context->getIndexedInteger64v(target, index, int64Params);
7012
7013 for (unsigned int i = 0; i < numParams; ++i)
7014 {
7015 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7016 data[i] = static_cast<GLint>(clampedValue);
7017 }
7018
7019 delete [] int64Params;
7020 }
7021 else
7022 {
7023 UNREACHABLE();
7024 }
7025 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007026 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007027 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007028 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007029 {
7030 return gl::error(GL_OUT_OF_MEMORY);
7031 }
7032}
7033
7034void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7035{
7036 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7037
7038 try
7039 {
7040 gl::Context *context = gl::getNonLostContext();
7041
7042 if (context)
7043 {
7044 if (context->getClientVersion() < 3)
7045 {
7046 return gl::error(GL_INVALID_OPERATION);
7047 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007048
Geoff Langc8058452014-02-03 12:04:11 -05007049 switch (primitiveMode)
7050 {
7051 case GL_TRIANGLES:
7052 case GL_LINES:
7053 case GL_POINTS:
7054 break;
7055 default:
7056 return gl::error(GL_INVALID_ENUM);
7057 }
7058
7059 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7060 ASSERT(transformFeedback != NULL);
7061
7062 if (transformFeedback->isStarted())
7063 {
7064 return gl::error(GL_INVALID_OPERATION);
7065 }
7066
7067 if (transformFeedback->isPaused())
7068 {
7069 transformFeedback->resume();
7070 }
7071 else
7072 {
7073 transformFeedback->start(primitiveMode);
7074 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007075 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007076 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007077 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007078 {
7079 return gl::error(GL_OUT_OF_MEMORY);
7080 }
7081}
7082
7083void __stdcall glEndTransformFeedback(void)
7084{
7085 EVENT("(void)");
7086
7087 try
7088 {
7089 gl::Context *context = gl::getNonLostContext();
7090
7091 if (context)
7092 {
7093 if (context->getClientVersion() < 3)
7094 {
7095 return gl::error(GL_INVALID_OPERATION);
7096 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007097
Geoff Langc8058452014-02-03 12:04:11 -05007098 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7099 ASSERT(transformFeedback != NULL);
7100
7101 if (!transformFeedback->isStarted())
7102 {
7103 return gl::error(GL_INVALID_OPERATION);
7104 }
7105
7106 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007107 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007108 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007109 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007110 {
7111 return gl::error(GL_OUT_OF_MEMORY);
7112 }
7113}
7114
7115void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7116{
7117 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7118 target, index, buffer, offset, size);
7119
7120 try
7121 {
7122 gl::Context *context = gl::getNonLostContext();
7123
7124 if (context)
7125 {
7126 if (context->getClientVersion() < 3)
7127 {
7128 return gl::error(GL_INVALID_OPERATION);
7129 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007130
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007131 switch (target)
7132 {
7133 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007134 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007135 {
7136 return gl::error(GL_INVALID_VALUE);
7137 }
7138 break;
7139
7140 case GL_UNIFORM_BUFFER:
7141 if (index >= context->getMaximumCombinedUniformBufferBindings())
7142 {
7143 return gl::error(GL_INVALID_VALUE);
7144 }
7145 break;
7146
7147 default:
7148 return gl::error(GL_INVALID_ENUM);
7149 }
7150
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007151 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007152 {
7153 return gl::error(GL_INVALID_VALUE);
7154 }
7155
7156 switch (target)
7157 {
7158 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007159
7160 // size and offset must be a multiple of 4
7161 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7162 {
7163 return gl::error(GL_INVALID_VALUE);
7164 }
7165
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007166 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7167 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007168 break;
7169
7170 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007171
7172 // it is an error to bind an offset not a multiple of the alignment
7173 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7174 {
7175 return gl::error(GL_INVALID_VALUE);
7176 }
7177
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007178 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7179 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007180 break;
7181
7182 default:
7183 UNREACHABLE();
7184 }
7185 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007186 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007187 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007188 {
7189 return gl::error(GL_OUT_OF_MEMORY);
7190 }
7191}
7192
7193void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7194{
7195 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7196 target, index, buffer);
7197
7198 try
7199 {
7200 gl::Context *context = gl::getNonLostContext();
7201
7202 if (context)
7203 {
7204 if (context->getClientVersion() < 3)
7205 {
7206 return gl::error(GL_INVALID_OPERATION);
7207 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007208
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007209 switch (target)
7210 {
7211 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007212 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007213 {
7214 return gl::error(GL_INVALID_VALUE);
7215 }
7216 break;
7217
7218 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007219 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007220 {
7221 return gl::error(GL_INVALID_VALUE);
7222 }
7223 break;
7224
7225 default:
7226 return gl::error(GL_INVALID_ENUM);
7227 }
7228
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007229 switch (target)
7230 {
7231 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007232 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007233 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007234 break;
7235
7236 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007237 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007238 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007239 break;
7240
7241 default:
7242 UNREACHABLE();
7243 }
7244 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007245 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007246 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007247 {
7248 return gl::error(GL_OUT_OF_MEMORY);
7249 }
7250}
7251
7252void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7253{
7254 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7255 program, count, varyings, bufferMode);
7256
7257 try
7258 {
7259 gl::Context *context = gl::getNonLostContext();
7260
7261 if (context)
7262 {
7263 if (context->getClientVersion() < 3)
7264 {
7265 return gl::error(GL_INVALID_OPERATION);
7266 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007267
Geoff Lang48dcae72014-02-05 16:28:24 -05007268 if (count < 0)
7269 {
7270 return gl::error(GL_INVALID_VALUE);
7271 }
7272
7273 switch (bufferMode)
7274 {
7275 case GL_INTERLEAVED_ATTRIBS:
7276 break;
7277 case GL_SEPARATE_ATTRIBS:
7278 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7279 {
7280 return gl::error(GL_INVALID_VALUE);
7281 }
7282 break;
7283 default:
7284 return gl::error(GL_INVALID_ENUM);
7285 }
7286
7287 if (!gl::ValidProgram(context, program))
7288 {
7289 return;
7290 }
7291
7292 gl::Program *programObject = context->getProgram(program);
7293 ASSERT(programObject);
7294
7295 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007296 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007297 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007298 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007299 {
7300 return gl::error(GL_OUT_OF_MEMORY);
7301 }
7302}
7303
7304void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7305{
7306 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7307 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7308 program, index, bufSize, length, size, type, name);
7309
7310 try
7311 {
7312 gl::Context *context = gl::getNonLostContext();
7313
7314 if (context)
7315 {
7316 if (context->getClientVersion() < 3)
7317 {
7318 return gl::error(GL_INVALID_OPERATION);
7319 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007320
Geoff Lang48dcae72014-02-05 16:28:24 -05007321 if (bufSize < 0)
7322 {
7323 return gl::error(GL_INVALID_VALUE);
7324 }
7325
7326 if (!gl::ValidProgram(context, program))
7327 {
7328 return;
7329 }
7330
7331 gl::Program *programObject = context->getProgram(program);
7332 ASSERT(programObject);
7333
7334 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7335 {
7336 return gl::error(GL_INVALID_VALUE);
7337 }
7338
7339 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007340 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007341 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007342 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007343 {
7344 return gl::error(GL_OUT_OF_MEMORY);
7345 }
7346}
7347
7348void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7349{
7350 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7351 index, size, type, stride, pointer);
7352
7353 try
7354 {
7355 gl::Context *context = gl::getNonLostContext();
7356
7357 if (context)
7358 {
7359 if (context->getClientVersion() < 3)
7360 {
7361 return gl::error(GL_INVALID_OPERATION);
7362 }
7363 }
7364
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007365 if (index >= gl::MAX_VERTEX_ATTRIBS)
7366 {
7367 return gl::error(GL_INVALID_VALUE);
7368 }
7369
7370 if (size < 1 || size > 4)
7371 {
7372 return gl::error(GL_INVALID_VALUE);
7373 }
7374
7375 switch (type)
7376 {
7377 case GL_BYTE:
7378 case GL_UNSIGNED_BYTE:
7379 case GL_SHORT:
7380 case GL_UNSIGNED_SHORT:
7381 case GL_INT:
7382 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007383 case GL_INT_2_10_10_10_REV:
7384 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007385 break;
7386 default:
7387 return gl::error(GL_INVALID_ENUM);
7388 }
7389
7390 if (stride < 0)
7391 {
7392 return gl::error(GL_INVALID_VALUE);
7393 }
7394
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007395 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7396 {
7397 return gl::error(GL_INVALID_OPERATION);
7398 }
7399
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007400 if (context)
7401 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007402 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7403 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7404 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7405 // and the pointer argument is not NULL.
7406 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7407 {
7408 return gl::error(GL_INVALID_OPERATION);
7409 }
7410
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007411 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7412 stride, pointer);
7413 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007414 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007415 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007416 {
7417 return gl::error(GL_OUT_OF_MEMORY);
7418 }
7419}
7420
7421void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7422{
7423 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7424 index, pname, params);
7425
7426 try
7427 {
7428 gl::Context *context = gl::getNonLostContext();
7429
7430 if (context)
7431 {
7432 if (context->getClientVersion() < 3)
7433 {
7434 return gl::error(GL_INVALID_OPERATION);
7435 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007436
Jamie Madilla7d05862013-07-02 11:57:06 -04007437 if (index >= gl::MAX_VERTEX_ATTRIBS)
7438 {
7439 return gl::error(GL_INVALID_VALUE);
7440 }
7441
7442 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7443
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007444 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007445 {
7446 return;
7447 }
7448
7449 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7450 {
7451 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7452 for (int i = 0; i < 4; ++i)
7453 {
7454 params[i] = currentValueData.IntValues[i];
7455 }
7456 }
7457 else
7458 {
Brandon Jones5bf98292014-06-06 17:19:38 -07007459 *params = gl::QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
Jamie Madilla7d05862013-07-02 11:57:06 -04007460 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007461 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007462 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007463 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007464 {
7465 return gl::error(GL_OUT_OF_MEMORY);
7466 }
7467}
7468
7469void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7470{
7471 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7472 index, pname, params);
7473
7474 try
7475 {
7476 gl::Context *context = gl::getNonLostContext();
7477
7478 if (context)
7479 {
7480 if (context->getClientVersion() < 3)
7481 {
7482 return gl::error(GL_INVALID_OPERATION);
7483 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007484
Jamie Madilla7d05862013-07-02 11:57:06 -04007485 if (index >= gl::MAX_VERTEX_ATTRIBS)
7486 {
7487 return gl::error(GL_INVALID_VALUE);
7488 }
7489
7490 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7491
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007492 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007493 {
7494 return;
7495 }
7496
7497 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7498 {
7499 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7500 for (int i = 0; i < 4; ++i)
7501 {
7502 params[i] = currentValueData.UnsignedIntValues[i];
7503 }
7504 }
7505 else
7506 {
Brandon Jones5bf98292014-06-06 17:19:38 -07007507 *params = gl::QuerySingleVertexAttributeParameter<GLuint>(attribState, pname);
Jamie Madilla7d05862013-07-02 11:57:06 -04007508 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007509 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007510 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007511 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007512 {
7513 return gl::error(GL_OUT_OF_MEMORY);
7514 }
7515}
7516
7517void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7518{
7519 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7520 index, x, y, z, w);
7521
7522 try
7523 {
7524 gl::Context *context = gl::getNonLostContext();
7525
7526 if (context)
7527 {
7528 if (context->getClientVersion() < 3)
7529 {
7530 return gl::error(GL_INVALID_OPERATION);
7531 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007532
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007533 if (index >= gl::MAX_VERTEX_ATTRIBS)
7534 {
7535 return gl::error(GL_INVALID_VALUE);
7536 }
7537
7538 GLint vals[4] = { x, y, z, w };
7539 context->setVertexAttribi(index, vals);
7540 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007541 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007542 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007543 {
7544 return gl::error(GL_OUT_OF_MEMORY);
7545 }
7546}
7547
7548void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7549{
7550 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7551 index, x, y, z, w);
7552
7553 try
7554 {
7555 gl::Context *context = gl::getNonLostContext();
7556
7557 if (context)
7558 {
7559 if (context->getClientVersion() < 3)
7560 {
7561 return gl::error(GL_INVALID_OPERATION);
7562 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007563
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007564 if (index >= gl::MAX_VERTEX_ATTRIBS)
7565 {
7566 return gl::error(GL_INVALID_VALUE);
7567 }
7568
7569 GLuint vals[4] = { x, y, z, w };
7570 context->setVertexAttribu(index, vals);
7571 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007572 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007573 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007574 {
7575 return gl::error(GL_OUT_OF_MEMORY);
7576 }
7577}
7578
7579void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7580{
7581 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7582
7583 try
7584 {
7585 gl::Context *context = gl::getNonLostContext();
7586
7587 if (context)
7588 {
7589 if (context->getClientVersion() < 3)
7590 {
7591 return gl::error(GL_INVALID_OPERATION);
7592 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007593
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007594 if (index >= gl::MAX_VERTEX_ATTRIBS)
7595 {
7596 return gl::error(GL_INVALID_VALUE);
7597 }
7598
7599 context->setVertexAttribi(index, v);
7600 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007601 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007602 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007603 {
7604 return gl::error(GL_OUT_OF_MEMORY);
7605 }
7606}
7607
7608void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7609{
7610 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7611
7612 try
7613 {
7614 gl::Context *context = gl::getNonLostContext();
7615
7616 if (context)
7617 {
7618 if (context->getClientVersion() < 3)
7619 {
7620 return gl::error(GL_INVALID_OPERATION);
7621 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007622
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007623 if (index >= gl::MAX_VERTEX_ATTRIBS)
7624 {
7625 return gl::error(GL_INVALID_VALUE);
7626 }
7627
7628 context->setVertexAttribu(index, v);
7629 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007630 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007631 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007632 {
7633 return gl::error(GL_OUT_OF_MEMORY);
7634 }
7635}
7636
7637void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7638{
7639 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7640 program, location, params);
7641
7642 try
7643 {
7644 gl::Context *context = gl::getNonLostContext();
7645
7646 if (context)
7647 {
7648 if (context->getClientVersion() < 3)
7649 {
7650 return gl::error(GL_INVALID_OPERATION);
7651 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007652
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007653 if (program == 0)
7654 {
7655 return gl::error(GL_INVALID_VALUE);
7656 }
7657
7658 gl::Program *programObject = context->getProgram(program);
7659
7660 if (!programObject || !programObject->isLinked())
7661 {
7662 return gl::error(GL_INVALID_OPERATION);
7663 }
7664
7665 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7666 if (!programBinary)
7667 {
7668 return gl::error(GL_INVALID_OPERATION);
7669 }
7670
7671 if (!programBinary->getUniformuiv(location, NULL, params))
7672 {
7673 return gl::error(GL_INVALID_OPERATION);
7674 }
7675 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007676 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007677 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007678 {
7679 return gl::error(GL_OUT_OF_MEMORY);
7680 }
7681}
7682
7683GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7684{
7685 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7686 program, name);
7687
7688 try
7689 {
7690 gl::Context *context = gl::getNonLostContext();
7691
7692 if (context)
7693 {
7694 if (context->getClientVersion() < 3)
7695 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007696 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007697 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007698
Jamie Madilld1e78c92013-06-20 11:55:50 -04007699 if (program == 0)
7700 {
7701 return gl::error(GL_INVALID_VALUE, -1);
7702 }
7703
7704 gl::Program *programObject = context->getProgram(program);
7705
7706 if (!programObject || !programObject->isLinked())
7707 {
7708 return gl::error(GL_INVALID_OPERATION, -1);
7709 }
7710
7711 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7712 if (!programBinary)
7713 {
7714 return gl::error(GL_INVALID_OPERATION, -1);
7715 }
7716
7717 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007718 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007719 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007720 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007721 {
7722 return gl::error(GL_OUT_OF_MEMORY, 0);
7723 }
7724
7725 return 0;
7726}
7727
7728void __stdcall glUniform1ui(GLint location, GLuint v0)
7729{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007730 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007731}
7732
7733void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
7734{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007735 const GLuint xy[] = { v0, v1 };
7736 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007737}
7738
7739void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
7740{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007741 const GLuint xyz[] = { v0, v1, v2 };
7742 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007743}
7744
7745void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
7746{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007747 const GLuint xyzw[] = { v0, v1, v2, v3 };
7748 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007749}
7750
7751void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
7752{
7753 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7754 location, count, value);
7755
7756 try
7757 {
7758 gl::Context *context = gl::getNonLostContext();
7759
7760 if (context)
7761 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007762 if (!ValidateUniform(context, GL_UNSIGNED_INT, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007763 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007764 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007765 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007766
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007767 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007768 programBinary->setUniform1uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007769 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007770 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007771 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007772 {
7773 return gl::error(GL_OUT_OF_MEMORY);
7774 }
7775}
7776
7777void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
7778{
7779 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7780 location, count, value);
7781
7782 try
7783 {
7784 gl::Context *context = gl::getNonLostContext();
7785
7786 if (context)
7787 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007788 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC2, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007789 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007790 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007791 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007792
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007793 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007794 programBinary->setUniform2uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007795 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007796 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007797 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007798 {
7799 return gl::error(GL_OUT_OF_MEMORY);
7800 }
7801}
7802
7803void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
7804{
7805 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
7806 location, count, value);
7807
7808 try
7809 {
7810 gl::Context *context = gl::getNonLostContext();
7811
7812 if (context)
7813 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007814 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC3, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007815 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007816 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007817 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007818
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007819 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007820 programBinary->setUniform3uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007821 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007822 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007823 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007824 {
7825 return gl::error(GL_OUT_OF_MEMORY);
7826 }
7827}
7828
7829void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
7830{
7831 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7832 location, count, value);
7833
7834 try
7835 {
7836 gl::Context *context = gl::getNonLostContext();
7837
7838 if (context)
7839 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007840 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC4, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007841 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007842 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007843 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007844
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007845 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007846 programBinary->setUniform4uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007847 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007848 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007849 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007850 {
7851 return gl::error(GL_OUT_OF_MEMORY);
7852 }
7853}
7854
7855void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
7856{
7857 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
7858 buffer, drawbuffer, value);
7859
7860 try
7861 {
7862 gl::Context *context = gl::getNonLostContext();
7863
7864 if (context)
7865 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007866 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007867 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007868 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007869 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007870
Geoff Lang42359ca2013-08-21 13:25:17 -04007871 switch (buffer)
7872 {
7873 case GL_COLOR:
7874 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7875 {
7876 return gl::error(GL_INVALID_VALUE);
7877 }
7878 break;
7879 case GL_STENCIL:
7880 if (drawbuffer != 0)
7881 {
7882 return gl::error(GL_INVALID_VALUE);
7883 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05007884 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04007885 default:
7886 return gl::error(GL_INVALID_ENUM);
7887 }
7888
7889 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007890 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007891 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007892 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007893 {
7894 return gl::error(GL_OUT_OF_MEMORY);
7895 }
7896}
7897
7898void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
7899{
7900 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
7901 buffer, drawbuffer, value);
7902
7903 try
7904 {
7905 gl::Context *context = gl::getNonLostContext();
7906
7907 if (context)
7908 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007909 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007910 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007911 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007912 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007913
Geoff Lang42359ca2013-08-21 13:25:17 -04007914 switch (buffer)
7915 {
7916 case GL_COLOR:
7917 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7918 {
7919 return gl::error(GL_INVALID_VALUE);
7920 }
7921 break;
7922 default:
7923 return gl::error(GL_INVALID_ENUM);
7924 }
7925
7926 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007927 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007928 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007929 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007930 {
7931 return gl::error(GL_OUT_OF_MEMORY);
7932 }
7933}
7934
7935void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
7936{
7937 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
7938 buffer, drawbuffer, value);
7939
7940 try
7941 {
7942 gl::Context *context = gl::getNonLostContext();
7943
7944 if (context)
7945 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007946 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007947 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007948 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007949 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007950
Geoff Lang42359ca2013-08-21 13:25:17 -04007951 switch (buffer)
7952 {
7953 case GL_COLOR:
7954 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7955 {
7956 return gl::error(GL_INVALID_VALUE);
7957 }
7958 break;
7959 case GL_DEPTH:
7960 if (drawbuffer != 0)
7961 {
7962 return gl::error(GL_INVALID_VALUE);
7963 }
7964 break;
7965 default:
7966 return gl::error(GL_INVALID_ENUM);
7967 }
7968
7969 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007970 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007971 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007972 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007973 {
7974 return gl::error(GL_OUT_OF_MEMORY);
7975 }
7976}
7977
7978void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
7979{
7980 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
7981 buffer, drawbuffer, depth, stencil);
7982
7983 try
7984 {
7985 gl::Context *context = gl::getNonLostContext();
7986
7987 if (context)
7988 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007989 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007990 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007991 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007992 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007993
Geoff Lang42359ca2013-08-21 13:25:17 -04007994 switch (buffer)
7995 {
7996 case GL_DEPTH_STENCIL:
7997 if (drawbuffer != 0)
7998 {
7999 return gl::error(GL_INVALID_VALUE);
8000 }
8001 break;
8002 default:
8003 return gl::error(GL_INVALID_ENUM);
8004 }
8005
8006 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008007 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008008 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008009 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008010 {
8011 return gl::error(GL_OUT_OF_MEMORY);
8012 }
8013}
8014
8015const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8016{
8017 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8018
8019 try
8020 {
8021 gl::Context *context = gl::getNonLostContext();
8022
8023 if (context)
8024 {
8025 if (context->getClientVersion() < 3)
8026 {
8027 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8028 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008029
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008030 if (name != GL_EXTENSIONS)
8031 {
8032 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8033 }
8034
Geoff Langcec35902014-04-16 10:52:36 -04008035 if (index >= context->getExtensionStringCount())
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008036 {
8037 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8038 }
Geoff Langcec35902014-04-16 10:52:36 -04008039
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008040 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8041 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008042 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008043 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008044 {
8045 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8046 }
8047
8048 return NULL;
8049}
8050
8051void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8052{
8053 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8054 readTarget, writeTarget, readOffset, writeOffset, size);
8055
8056 try
8057 {
8058 gl::Context *context = gl::getNonLostContext();
8059
8060 if (context)
8061 {
8062 if (context->getClientVersion() < 3)
8063 {
8064 return gl::error(GL_INVALID_OPERATION);
8065 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008066
Jamie Madill8c96d582014-03-05 15:01:23 -05008067 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008068 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008069 return gl::error(GL_INVALID_ENUM);
8070 }
8071
Jamie Madill8c96d582014-03-05 15:01:23 -05008072 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8073 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008074
8075 if (!readBuffer || !writeBuffer)
8076 {
8077 return gl::error(GL_INVALID_OPERATION);
8078 }
8079
Jamie Madill7a5f7382014-03-05 15:01:24 -05008080 if (readBuffer->mapped() || writeBuffer->mapped())
8081 {
8082 return gl::error(GL_INVALID_OPERATION);
8083 }
8084
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008085 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8086 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8087 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8088 {
8089 return gl::error(GL_INVALID_VALUE);
8090 }
8091
8092 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8093 {
8094 return gl::error(GL_INVALID_VALUE);
8095 }
8096
8097 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8098
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008099 // if size is zero, the copy is a successful no-op
8100 if (size > 0)
8101 {
8102 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8103 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008104 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008105 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008106 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008107 {
8108 return gl::error(GL_OUT_OF_MEMORY);
8109 }
8110}
8111
8112void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8113{
8114 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8115 program, uniformCount, uniformNames, uniformIndices);
8116
8117 try
8118 {
8119 gl::Context *context = gl::getNonLostContext();
8120
8121 if (context)
8122 {
8123 if (context->getClientVersion() < 3)
8124 {
8125 return gl::error(GL_INVALID_OPERATION);
8126 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008127
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008128 if (uniformCount < 0)
8129 {
8130 return gl::error(GL_INVALID_VALUE);
8131 }
8132
8133 gl::Program *programObject = context->getProgram(program);
8134
8135 if (!programObject)
8136 {
8137 if (context->getShader(program))
8138 {
8139 return gl::error(GL_INVALID_OPERATION);
8140 }
8141 else
8142 {
8143 return gl::error(GL_INVALID_VALUE);
8144 }
8145 }
8146
8147 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8148 if (!programObject->isLinked() || !programBinary)
8149 {
8150 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8151 {
8152 uniformIndices[uniformId] = GL_INVALID_INDEX;
8153 }
8154 }
8155 else
8156 {
8157 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8158 {
8159 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8160 }
8161 }
8162 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008163 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008164 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008165 {
8166 return gl::error(GL_OUT_OF_MEMORY);
8167 }
8168}
8169
8170void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8171{
8172 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8173 program, uniformCount, uniformIndices, pname, params);
8174
8175 try
8176 {
8177 gl::Context *context = gl::getNonLostContext();
8178
8179 if (context)
8180 {
8181 if (context->getClientVersion() < 3)
8182 {
8183 return gl::error(GL_INVALID_OPERATION);
8184 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008185
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008186 if (uniformCount < 0)
8187 {
8188 return gl::error(GL_INVALID_VALUE);
8189 }
8190
8191 gl::Program *programObject = context->getProgram(program);
8192
8193 if (!programObject)
8194 {
8195 if (context->getShader(program))
8196 {
8197 return gl::error(GL_INVALID_OPERATION);
8198 }
8199 else
8200 {
8201 return gl::error(GL_INVALID_VALUE);
8202 }
8203 }
8204
8205 switch (pname)
8206 {
8207 case GL_UNIFORM_TYPE:
8208 case GL_UNIFORM_SIZE:
8209 case GL_UNIFORM_NAME_LENGTH:
8210 case GL_UNIFORM_BLOCK_INDEX:
8211 case GL_UNIFORM_OFFSET:
8212 case GL_UNIFORM_ARRAY_STRIDE:
8213 case GL_UNIFORM_MATRIX_STRIDE:
8214 case GL_UNIFORM_IS_ROW_MAJOR:
8215 break;
8216 default:
8217 return gl::error(GL_INVALID_ENUM);
8218 }
8219
8220 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8221
8222 if (!programBinary && uniformCount > 0)
8223 {
8224 return gl::error(GL_INVALID_VALUE);
8225 }
8226
8227 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8228 {
8229 const GLuint index = uniformIndices[uniformId];
8230
8231 if (index >= (GLuint)programBinary->getActiveUniformCount())
8232 {
8233 return gl::error(GL_INVALID_VALUE);
8234 }
8235 }
8236
8237 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8238 {
8239 const GLuint index = uniformIndices[uniformId];
8240 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8241 }
8242 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008243 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008244 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008245 {
8246 return gl::error(GL_OUT_OF_MEMORY);
8247 }
8248}
8249
8250GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8251{
8252 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8253
8254 try
8255 {
8256 gl::Context *context = gl::getNonLostContext();
8257
8258 if (context)
8259 {
8260 if (context->getClientVersion() < 3)
8261 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008262 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008263 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008264
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008265 gl::Program *programObject = context->getProgram(program);
8266
8267 if (!programObject)
8268 {
8269 if (context->getShader(program))
8270 {
8271 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8272 }
8273 else
8274 {
8275 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8276 }
8277 }
8278
8279 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8280 if (!programBinary)
8281 {
8282 return GL_INVALID_INDEX;
8283 }
8284
8285 return programBinary->getUniformBlockIndex(uniformBlockName);
8286 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008287 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008288 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008289 {
8290 return gl::error(GL_OUT_OF_MEMORY, 0);
8291 }
8292
8293 return 0;
8294}
8295
8296void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8297{
8298 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8299 program, uniformBlockIndex, pname, params);
8300
8301 try
8302 {
8303 gl::Context *context = gl::getNonLostContext();
8304
8305 if (context)
8306 {
8307 if (context->getClientVersion() < 3)
8308 {
8309 return gl::error(GL_INVALID_OPERATION);
8310 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008311 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008312
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008313 if (!programObject)
8314 {
8315 if (context->getShader(program))
8316 {
8317 return gl::error(GL_INVALID_OPERATION);
8318 }
8319 else
8320 {
8321 return gl::error(GL_INVALID_VALUE);
8322 }
8323 }
8324
8325 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8326
8327 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8328 {
8329 return gl::error(GL_INVALID_VALUE);
8330 }
8331
8332 switch (pname)
8333 {
8334 case GL_UNIFORM_BLOCK_BINDING:
8335 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8336 break;
8337
8338 case GL_UNIFORM_BLOCK_DATA_SIZE:
8339 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8340 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8341 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8342 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8343 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8344 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8345 break;
8346
8347 default:
8348 return gl::error(GL_INVALID_ENUM);
8349 }
8350 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008351 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008352 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008353 {
8354 return gl::error(GL_OUT_OF_MEMORY);
8355 }
8356}
8357
8358void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8359{
8360 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8361 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8362
8363 try
8364 {
8365 gl::Context *context = gl::getNonLostContext();
8366
8367 if (context)
8368 {
8369 if (context->getClientVersion() < 3)
8370 {
8371 return gl::error(GL_INVALID_OPERATION);
8372 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008373
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008374 gl::Program *programObject = context->getProgram(program);
8375
8376 if (!programObject)
8377 {
8378 if (context->getShader(program))
8379 {
8380 return gl::error(GL_INVALID_OPERATION);
8381 }
8382 else
8383 {
8384 return gl::error(GL_INVALID_VALUE);
8385 }
8386 }
8387
8388 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8389
8390 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8391 {
8392 return gl::error(GL_INVALID_VALUE);
8393 }
8394
8395 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8396 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008397 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008398 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008399 {
8400 return gl::error(GL_OUT_OF_MEMORY);
8401 }
8402}
8403
8404void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8405{
8406 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8407 program, uniformBlockIndex, uniformBlockBinding);
8408
8409 try
8410 {
8411 gl::Context *context = gl::getNonLostContext();
8412
8413 if (context)
8414 {
8415 if (context->getClientVersion() < 3)
8416 {
8417 return gl::error(GL_INVALID_OPERATION);
8418 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008419
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008420 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8421 {
8422 return gl::error(GL_INVALID_VALUE);
8423 }
8424
8425 gl::Program *programObject = context->getProgram(program);
8426
8427 if (!programObject)
8428 {
8429 if (context->getShader(program))
8430 {
8431 return gl::error(GL_INVALID_OPERATION);
8432 }
8433 else
8434 {
8435 return gl::error(GL_INVALID_VALUE);
8436 }
8437 }
8438
8439 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8440
8441 // if never linked, there won't be any uniform blocks
8442 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8443 {
8444 return gl::error(GL_INVALID_VALUE);
8445 }
8446
8447 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8448 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008449 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008450 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008451 {
8452 return gl::error(GL_OUT_OF_MEMORY);
8453 }
8454}
8455
8456void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8457{
8458 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8459 mode, first, count, instanceCount);
8460
8461 try
8462 {
8463 gl::Context *context = gl::getNonLostContext();
8464
8465 if (context)
8466 {
8467 if (context->getClientVersion() < 3)
8468 {
8469 return gl::error(GL_INVALID_OPERATION);
8470 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008471
Jamie Madill54133512013-06-21 09:33:07 -04008472 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008473 UNIMPLEMENTED();
8474 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008475 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008476 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008477 {
8478 return gl::error(GL_OUT_OF_MEMORY);
8479 }
8480}
8481
8482void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8483{
8484 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8485 mode, count, type, indices, instanceCount);
8486
8487 try
8488 {
8489 gl::Context *context = gl::getNonLostContext();
8490
8491 if (context)
8492 {
8493 if (context->getClientVersion() < 3)
8494 {
8495 return gl::error(GL_INVALID_OPERATION);
8496 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008497
Jamie Madill54133512013-06-21 09:33:07 -04008498 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008499 UNIMPLEMENTED();
8500 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008501 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008502 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008503 {
8504 return gl::error(GL_OUT_OF_MEMORY);
8505 }
8506}
8507
8508GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8509{
8510 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8511
8512 try
8513 {
8514 gl::Context *context = gl::getNonLostContext();
8515
8516 if (context)
8517 {
8518 if (context->getClientVersion() < 3)
8519 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008520 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008521 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008522
Jamie Madill5215e1a2013-07-26 11:55:19 -04008523 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8524 {
8525 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8526 }
8527
8528 if (flags != 0)
8529 {
8530 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8531 }
8532
8533 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008534 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008535 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008536 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008537 {
8538 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8539 }
8540
8541 return NULL;
8542}
8543
8544GLboolean __stdcall glIsSync(GLsync sync)
8545{
8546 EVENT("(GLsync sync = 0x%0.8p)", sync);
8547
8548 try
8549 {
8550 gl::Context *context = gl::getNonLostContext();
8551
8552 if (context)
8553 {
8554 if (context->getClientVersion() < 3)
8555 {
8556 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8557 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008558
Jamie Madill5215e1a2013-07-26 11:55:19 -04008559 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008560 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008561 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008562 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008563 {
8564 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8565 }
8566
8567 return GL_FALSE;
8568}
8569
8570void __stdcall glDeleteSync(GLsync sync)
8571{
8572 EVENT("(GLsync sync = 0x%0.8p)", sync);
8573
8574 try
8575 {
8576 gl::Context *context = gl::getNonLostContext();
8577
8578 if (context)
8579 {
8580 if (context->getClientVersion() < 3)
8581 {
8582 return gl::error(GL_INVALID_OPERATION);
8583 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008584
Jamie Madill5215e1a2013-07-26 11:55:19 -04008585 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8586 {
8587 return gl::error(GL_INVALID_VALUE);
8588 }
8589
8590 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008591 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008592 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008593 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008594 {
8595 return gl::error(GL_OUT_OF_MEMORY);
8596 }
8597}
8598
8599GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8600{
8601 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8602 sync, flags, timeout);
8603
8604 try
8605 {
8606 gl::Context *context = gl::getNonLostContext();
8607
8608 if (context)
8609 {
8610 if (context->getClientVersion() < 3)
8611 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008612 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008613 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008614
Jamie Madill5215e1a2013-07-26 11:55:19 -04008615 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8616 {
8617 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8618 }
8619
8620 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8621
8622 if (!fenceSync)
8623 {
8624 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8625 }
8626
8627 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008628 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008629 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008630 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008631 {
8632 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8633 }
8634
8635 return GL_FALSE;
8636}
8637
8638void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8639{
8640 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8641 sync, flags, timeout);
8642
8643 try
8644 {
8645 gl::Context *context = gl::getNonLostContext();
8646
8647 if (context)
8648 {
8649 if (context->getClientVersion() < 3)
8650 {
8651 return gl::error(GL_INVALID_OPERATION);
8652 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008653
Jamie Madill5215e1a2013-07-26 11:55:19 -04008654 if (flags != 0)
8655 {
8656 return gl::error(GL_INVALID_VALUE);
8657 }
8658
8659 if (timeout != GL_TIMEOUT_IGNORED)
8660 {
8661 return gl::error(GL_INVALID_VALUE);
8662 }
8663
8664 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8665
8666 if (!fenceSync)
8667 {
8668 return gl::error(GL_INVALID_VALUE);
8669 }
8670
8671 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008672 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008673 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008674 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008675 {
8676 return gl::error(GL_OUT_OF_MEMORY);
8677 }
8678}
8679
8680void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8681{
8682 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8683 pname, params);
8684
8685 try
8686 {
8687 gl::Context *context = gl::getNonLostContext();
8688
8689 if (context)
8690 {
8691 if (context->getClientVersion() < 3)
8692 {
8693 return gl::error(GL_INVALID_OPERATION);
8694 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008695
Jamie Madill79f2f452013-12-19 11:13:02 -05008696 GLenum nativeType;
8697 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04008698 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
8699 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008700 return;
Jamie Madill893ab082014-05-16 16:56:10 -04008701 }
Jamie Madill79f2f452013-12-19 11:13:02 -05008702
8703 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04008704 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008705 context->getInteger64v(pname, params);
8706 }
Jamie Madill55856b12014-01-02 13:59:50 -05008707 else
Jamie Madill79f2f452013-12-19 11:13:02 -05008708 {
Jamie Madill55856b12014-01-02 13:59:50 -05008709 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04008710 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008711 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008712 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008713 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008714 {
8715 return gl::error(GL_OUT_OF_MEMORY);
8716 }
8717}
8718
8719void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8720{
8721 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8722 sync, pname, bufSize, length, values);
8723
8724 try
8725 {
8726 gl::Context *context = gl::getNonLostContext();
8727
8728 if (context)
8729 {
8730 if (context->getClientVersion() < 3)
8731 {
8732 return gl::error(GL_INVALID_OPERATION);
8733 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008734
Jamie Madill5215e1a2013-07-26 11:55:19 -04008735 if (bufSize < 0)
8736 {
8737 return gl::error(GL_INVALID_VALUE);
8738 }
8739
8740 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8741
8742 if (!fenceSync)
8743 {
8744 return gl::error(GL_INVALID_VALUE);
8745 }
8746
8747 switch (pname)
8748 {
8749 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
8750 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
8751 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
8752 case GL_SYNC_FLAGS: values[0] = 0; break;
8753
8754 default:
8755 return gl::error(GL_INVALID_ENUM);
8756 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008757 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008758 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008759 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008760 {
8761 return gl::error(GL_OUT_OF_MEMORY);
8762 }
8763}
8764
8765void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8766{
8767 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8768 target, index, data);
8769
8770 try
8771 {
8772 gl::Context *context = gl::getNonLostContext();
8773
8774 if (context)
8775 {
8776 if (context->getClientVersion() < 3)
8777 {
8778 return gl::error(GL_INVALID_OPERATION);
8779 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008780
Shannon Woods15934d52013-08-19 14:28:49 -04008781 switch (target)
8782 {
8783 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
8784 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
8785 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
8786 if (index >= context->getMaxTransformFeedbackBufferBindings())
8787 return gl::error(GL_INVALID_VALUE);
8788 break;
8789 case GL_UNIFORM_BUFFER_START:
8790 case GL_UNIFORM_BUFFER_SIZE:
8791 case GL_UNIFORM_BUFFER_BINDING:
8792 if (index >= context->getMaximumCombinedUniformBufferBindings())
8793 return gl::error(GL_INVALID_VALUE);
8794 break;
8795 default:
8796 return gl::error(GL_INVALID_ENUM);
8797 }
8798
8799 if (!(context->getIndexedInteger64v(target, index, data)))
8800 {
8801 GLenum nativeType;
8802 unsigned int numParams = 0;
8803 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
8804 return gl::error(GL_INVALID_ENUM);
8805
8806 if (numParams == 0)
8807 return; // it is known that pname is valid, but there are no parameters to return
8808
8809 if (nativeType == GL_INT)
8810 {
8811 GLint *intParams = new GLint[numParams];
8812
8813 context->getIndexedIntegerv(target, index, intParams);
8814
8815 for (unsigned int i = 0; i < numParams; ++i)
8816 {
8817 data[i] = static_cast<GLint64>(intParams[i]);
8818 }
8819
8820 delete [] intParams;
8821 }
8822 else
8823 {
8824 UNREACHABLE();
8825 }
8826 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008827 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008828 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008829 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008830 {
8831 return gl::error(GL_OUT_OF_MEMORY);
8832 }
8833}
8834
8835void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8836{
8837 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8838 target, pname, params);
8839
8840 try
8841 {
8842 gl::Context *context = gl::getNonLostContext();
8843
8844 if (context)
8845 {
8846 if (context->getClientVersion() < 3)
8847 {
8848 return gl::error(GL_INVALID_OPERATION);
8849 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008850
Jamie Madill70656a62014-03-05 15:01:26 -05008851 if (!gl::ValidBufferTarget(context, target))
8852 {
8853 return gl::error(GL_INVALID_ENUM);
8854 }
8855
8856 if (!gl::ValidBufferParameter(context, pname))
8857 {
8858 return gl::error(GL_INVALID_ENUM);
8859 }
8860
8861 gl::Buffer *buffer = context->getTargetBuffer(target);
8862
8863 if (!buffer)
8864 {
8865 // A null buffer means that "0" is bound to the requested buffer target
8866 return gl::error(GL_INVALID_OPERATION);
8867 }
8868
8869 switch (pname)
8870 {
8871 case GL_BUFFER_USAGE:
8872 *params = static_cast<GLint64>(buffer->usage());
8873 break;
8874 case GL_BUFFER_SIZE:
8875 *params = buffer->size();
8876 break;
8877 case GL_BUFFER_ACCESS_FLAGS:
8878 *params = static_cast<GLint64>(buffer->accessFlags());
8879 break;
8880 case GL_BUFFER_MAPPED:
8881 *params = static_cast<GLint64>(buffer->mapped());
8882 break;
8883 case GL_BUFFER_MAP_OFFSET:
8884 *params = buffer->mapOffset();
8885 break;
8886 case GL_BUFFER_MAP_LENGTH:
8887 *params = buffer->mapLength();
8888 break;
8889 default: UNREACHABLE(); break;
8890 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008891 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008892 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008893 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008894 {
8895 return gl::error(GL_OUT_OF_MEMORY);
8896 }
8897}
8898
8899void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
8900{
8901 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
8902
8903 try
8904 {
8905 gl::Context *context = gl::getNonLostContext();
8906
8907 if (context)
8908 {
8909 if (context->getClientVersion() < 3)
8910 {
8911 return gl::error(GL_INVALID_OPERATION);
8912 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008913
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008914 if (count < 0)
8915 {
8916 return gl::error(GL_INVALID_VALUE);
8917 }
8918
8919 for (int i = 0; i < count; i++)
8920 {
8921 samplers[i] = context->createSampler();
8922 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008924 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008925 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008926 {
8927 return gl::error(GL_OUT_OF_MEMORY);
8928 }
8929}
8930
8931void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
8932{
8933 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
8934
8935 try
8936 {
8937 gl::Context *context = gl::getNonLostContext();
8938
8939 if (context)
8940 {
8941 if (context->getClientVersion() < 3)
8942 {
8943 return gl::error(GL_INVALID_OPERATION);
8944 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008945
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008946 if (count < 0)
8947 {
8948 return gl::error(GL_INVALID_VALUE);
8949 }
8950
8951 for (int i = 0; i < count; i++)
8952 {
8953 context->deleteSampler(samplers[i]);
8954 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008955 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008956 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008957 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008958 {
8959 return gl::error(GL_OUT_OF_MEMORY);
8960 }
8961}
8962
8963GLboolean __stdcall glIsSampler(GLuint sampler)
8964{
8965 EVENT("(GLuint sampler = %u)", sampler);
8966
8967 try
8968 {
8969 gl::Context *context = gl::getNonLostContext();
8970
8971 if (context)
8972 {
8973 if (context->getClientVersion() < 3)
8974 {
8975 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8976 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008977
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008978 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008979 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008980 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008981 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008982 {
8983 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8984 }
8985
8986 return GL_FALSE;
8987}
8988
8989void __stdcall glBindSampler(GLuint unit, GLuint sampler)
8990{
8991 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
8992
8993 try
8994 {
8995 gl::Context *context = gl::getNonLostContext();
8996
8997 if (context)
8998 {
8999 if (context->getClientVersion() < 3)
9000 {
9001 return gl::error(GL_INVALID_OPERATION);
9002 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009003
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009004 if (sampler != 0 && !context->isSampler(sampler))
9005 {
9006 return gl::error(GL_INVALID_OPERATION);
9007 }
9008
9009 if (unit >= context->getMaximumCombinedTextureImageUnits())
9010 {
9011 return gl::error(GL_INVALID_VALUE);
9012 }
9013
9014 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009015 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009016 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009017 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009018 {
9019 return gl::error(GL_OUT_OF_MEMORY);
9020 }
9021}
9022
9023void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9024{
9025 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9026
9027 try
9028 {
9029 gl::Context *context = gl::getNonLostContext();
9030
9031 if (context)
9032 {
9033 if (context->getClientVersion() < 3)
9034 {
9035 return gl::error(GL_INVALID_OPERATION);
9036 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009037
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009038 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009039 {
9040 return;
9041 }
9042
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009043 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009044 {
9045 return;
9046 }
9047
9048 if (!context->isSampler(sampler))
9049 {
9050 return gl::error(GL_INVALID_OPERATION);
9051 }
9052
9053 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009054 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009055 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009056 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009057 {
9058 return gl::error(GL_OUT_OF_MEMORY);
9059 }
9060}
9061
9062void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9063{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009064 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009065}
9066
9067void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9068{
9069 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9070
9071 try
9072 {
9073 gl::Context *context = gl::getNonLostContext();
9074
9075 if (context)
9076 {
9077 if (context->getClientVersion() < 3)
9078 {
9079 return gl::error(GL_INVALID_OPERATION);
9080 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009081
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009082 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009083 {
9084 return;
9085 }
9086
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009087 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009088 {
9089 return;
9090 }
9091
9092 if (!context->isSampler(sampler))
9093 {
9094 return gl::error(GL_INVALID_OPERATION);
9095 }
9096
9097 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009098 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009099 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009100 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009101 {
9102 return gl::error(GL_OUT_OF_MEMORY);
9103 }
9104}
9105
9106void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9107{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009108 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009109}
9110
9111void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9112{
9113 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9114
9115 try
9116 {
9117 gl::Context *context = gl::getNonLostContext();
9118
9119 if (context)
9120 {
9121 if (context->getClientVersion() < 3)
9122 {
9123 return gl::error(GL_INVALID_OPERATION);
9124 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009125
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009126 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009127 {
9128 return;
9129 }
9130
9131 if (!context->isSampler(sampler))
9132 {
9133 return gl::error(GL_INVALID_OPERATION);
9134 }
9135
9136 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009137 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009138 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009139 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009140 {
9141 return gl::error(GL_OUT_OF_MEMORY);
9142 }
9143}
9144
9145void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9146{
9147 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9148
9149 try
9150 {
9151 gl::Context *context = gl::getNonLostContext();
9152
9153 if (context)
9154 {
9155 if (context->getClientVersion() < 3)
9156 {
9157 return gl::error(GL_INVALID_OPERATION);
9158 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009159
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009160 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009161 {
9162 return;
9163 }
9164
9165 if (!context->isSampler(sampler))
9166 {
9167 return gl::error(GL_INVALID_OPERATION);
9168 }
9169
9170 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009171 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009172 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009173 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009174 {
9175 return gl::error(GL_OUT_OF_MEMORY);
9176 }
9177}
9178
9179void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9180{
9181 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9182
9183 try
9184 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009185 if (index >= gl::MAX_VERTEX_ATTRIBS)
9186 {
9187 return gl::error(GL_INVALID_VALUE);
9188 }
9189
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009190 gl::Context *context = gl::getNonLostContext();
9191
9192 if (context)
9193 {
9194 if (context->getClientVersion() < 3)
9195 {
9196 return gl::error(GL_INVALID_OPERATION);
9197 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009198
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009199 context->setVertexAttribDivisor(index, divisor);
9200 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009201 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009202 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009203 {
9204 return gl::error(GL_OUT_OF_MEMORY);
9205 }
9206}
9207
9208void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9209{
9210 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9211
9212 try
9213 {
9214 gl::Context *context = gl::getNonLostContext();
9215
9216 if (context)
9217 {
9218 if (context->getClientVersion() < 3)
9219 {
9220 return gl::error(GL_INVALID_OPERATION);
9221 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009222
Geoff Langc8058452014-02-03 12:04:11 -05009223 switch (target)
9224 {
9225 case GL_TRANSFORM_FEEDBACK:
9226 {
9227 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9228 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9229 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9230 {
9231 return gl::error(GL_INVALID_OPERATION);
9232 }
9233
9234 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9235 if (context->getTransformFeedback(id) == NULL)
9236 {
9237 return gl::error(GL_INVALID_OPERATION);
9238 }
9239
9240 context->bindTransformFeedback(id);
9241 }
9242 break;
9243
9244 default:
9245 return gl::error(GL_INVALID_ENUM);
9246 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009248 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009249 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009250 {
9251 return gl::error(GL_OUT_OF_MEMORY);
9252 }
9253}
9254
9255void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9256{
9257 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9258
9259 try
9260 {
9261 gl::Context *context = gl::getNonLostContext();
9262
9263 if (context)
9264 {
9265 if (context->getClientVersion() < 3)
9266 {
9267 return gl::error(GL_INVALID_OPERATION);
9268 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009269
Geoff Langc8058452014-02-03 12:04:11 -05009270 for (int i = 0; i < n; i++)
9271 {
9272 context->deleteTransformFeedback(ids[i]);
9273 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009274 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009275 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009276 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009277 {
9278 return gl::error(GL_OUT_OF_MEMORY);
9279 }
9280}
9281
9282void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9283{
9284 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9285
9286 try
9287 {
9288 gl::Context *context = gl::getNonLostContext();
9289
9290 if (context)
9291 {
9292 if (context->getClientVersion() < 3)
9293 {
9294 return gl::error(GL_INVALID_OPERATION);
9295 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009296
Geoff Langc8058452014-02-03 12:04:11 -05009297 for (int i = 0; i < n; i++)
9298 {
9299 ids[i] = context->createTransformFeedback();
9300 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009301 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009302 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009303 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009304 {
9305 return gl::error(GL_OUT_OF_MEMORY);
9306 }
9307}
9308
9309GLboolean __stdcall glIsTransformFeedback(GLuint id)
9310{
9311 EVENT("(GLuint id = %u)", id);
9312
9313 try
9314 {
9315 gl::Context *context = gl::getNonLostContext();
9316
9317 if (context)
9318 {
9319 if (context->getClientVersion() < 3)
9320 {
9321 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9322 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009323
Geoff Langc8058452014-02-03 12:04:11 -05009324 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009325 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009326 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009327 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009328 {
9329 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9330 }
9331
9332 return GL_FALSE;
9333}
9334
9335void __stdcall glPauseTransformFeedback(void)
9336{
9337 EVENT("(void)");
9338
9339 try
9340 {
9341 gl::Context *context = gl::getNonLostContext();
9342
9343 if (context)
9344 {
9345 if (context->getClientVersion() < 3)
9346 {
9347 return gl::error(GL_INVALID_OPERATION);
9348 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009349
Geoff Langc8058452014-02-03 12:04:11 -05009350 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9351 ASSERT(transformFeedback != NULL);
9352
9353 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9354 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9355 {
9356 return gl::error(GL_INVALID_OPERATION);
9357 }
9358
9359 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009360 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009361 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009362 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009363 {
9364 return gl::error(GL_OUT_OF_MEMORY);
9365 }
9366}
9367
9368void __stdcall glResumeTransformFeedback(void)
9369{
9370 EVENT("(void)");
9371
9372 try
9373 {
9374 gl::Context *context = gl::getNonLostContext();
9375
9376 if (context)
9377 {
9378 if (context->getClientVersion() < 3)
9379 {
9380 return gl::error(GL_INVALID_OPERATION);
9381 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009382
Geoff Langc8058452014-02-03 12:04:11 -05009383 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9384 ASSERT(transformFeedback != NULL);
9385
9386 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9387 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9388 {
9389 return gl::error(GL_INVALID_OPERATION);
9390 }
9391
9392 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009393 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009394 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009395 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009396 {
9397 return gl::error(GL_OUT_OF_MEMORY);
9398 }
9399}
9400
9401void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9402{
9403 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9404 program, bufSize, length, binaryFormat, binary);
9405
9406 try
9407 {
9408 gl::Context *context = gl::getNonLostContext();
9409
9410 if (context)
9411 {
9412 if (context->getClientVersion() < 3)
9413 {
9414 return gl::error(GL_INVALID_OPERATION);
9415 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009416
Jamie Madill54133512013-06-21 09:33:07 -04009417 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009418 UNIMPLEMENTED();
9419 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009420 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009421 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009422 {
9423 return gl::error(GL_OUT_OF_MEMORY);
9424 }
9425}
9426
9427void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9428{
9429 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9430 program, binaryFormat, binary, length);
9431
9432 try
9433 {
9434 gl::Context *context = gl::getNonLostContext();
9435
9436 if (context)
9437 {
9438 if (context->getClientVersion() < 3)
9439 {
9440 return gl::error(GL_INVALID_OPERATION);
9441 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009442
Jamie Madill54133512013-06-21 09:33:07 -04009443 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009444 UNIMPLEMENTED();
9445 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009446 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009447 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009448 {
9449 return gl::error(GL_OUT_OF_MEMORY);
9450 }
9451}
9452
9453void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9454{
9455 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9456 program, pname, value);
9457
9458 try
9459 {
9460 gl::Context *context = gl::getNonLostContext();
9461
9462 if (context)
9463 {
9464 if (context->getClientVersion() < 3)
9465 {
9466 return gl::error(GL_INVALID_OPERATION);
9467 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009468
Jamie Madill54133512013-06-21 09:33:07 -04009469 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009470 UNIMPLEMENTED();
9471 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009472 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009473 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009474 {
9475 return gl::error(GL_OUT_OF_MEMORY);
9476 }
9477}
9478
9479void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9480{
9481 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9482 target, numAttachments, attachments);
9483
9484 try
9485 {
9486 gl::Context *context = gl::getNonLostContext();
9487
9488 if (context)
9489 {
9490 if (context->getClientVersion() < 3)
9491 {
9492 return gl::error(GL_INVALID_OPERATION);
9493 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009494
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009495 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009496 {
9497 return;
9498 }
9499
9500 int maxDimension = context->getMaximumRenderbufferDimension();
9501 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9502 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009503 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009504 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009505 {
9506 return gl::error(GL_OUT_OF_MEMORY);
9507 }
9508}
9509
9510void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9511{
9512 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9513 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9514 target, numAttachments, attachments, x, y, width, height);
9515
9516 try
9517 {
9518 gl::Context *context = gl::getNonLostContext();
9519
9520 if (context)
9521 {
9522 if (context->getClientVersion() < 3)
9523 {
9524 return gl::error(GL_INVALID_OPERATION);
9525 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009526
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009527 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009528 {
9529 return;
9530 }
9531
9532 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9533 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009534 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009535 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009536 {
9537 return gl::error(GL_OUT_OF_MEMORY);
9538 }
9539}
9540
9541void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9542{
9543 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9544 target, levels, internalformat, width, height);
9545
9546 try
9547 {
9548 gl::Context *context = gl::getNonLostContext();
9549
9550 if (context)
9551 {
9552 if (context->getClientVersion() < 3)
9553 {
9554 return gl::error(GL_INVALID_OPERATION);
9555 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009556
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009557 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009558 {
9559 return;
9560 }
9561
9562 switch (target)
9563 {
9564 case GL_TEXTURE_2D:
9565 {
9566 gl::Texture2D *texture2d = context->getTexture2D();
9567 texture2d->storage(levels, internalformat, width, height);
9568 }
9569 break;
9570
Geoff Lang01c21d22013-09-24 11:52:16 -04009571 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009572 {
9573 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9574 textureCube->storage(levels, internalformat, width);
9575 }
9576 break;
9577
9578 default:
9579 return gl::error(GL_INVALID_ENUM);
9580 }
9581 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009582 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009583 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009584 {
9585 return gl::error(GL_OUT_OF_MEMORY);
9586 }
9587}
9588
9589void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9590{
9591 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9592 "GLsizei height = %d, GLsizei depth = %d)",
9593 target, levels, internalformat, width, height, depth);
9594
9595 try
9596 {
9597 gl::Context *context = gl::getNonLostContext();
9598
9599 if (context)
9600 {
9601 if (context->getClientVersion() < 3)
9602 {
9603 return gl::error(GL_INVALID_OPERATION);
9604 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009605
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009606 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009607 {
9608 return;
9609 }
9610
9611 switch (target)
9612 {
9613 case GL_TEXTURE_3D:
9614 {
9615 gl::Texture3D *texture3d = context->getTexture3D();
9616 texture3d->storage(levels, internalformat, width, height, depth);
9617 }
9618 break;
9619
9620 case GL_TEXTURE_2D_ARRAY:
9621 {
9622 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9623 texture2darray->storage(levels, internalformat, width, height, depth);
9624 }
9625 break;
9626
9627 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009628 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009629 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009630 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009631 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009632 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009633 {
9634 return gl::error(GL_OUT_OF_MEMORY);
9635 }
9636}
9637
9638void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9639{
9640 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9641 "GLint* params = 0x%0.8p)",
9642 target, internalformat, pname, bufSize, params);
9643
9644 try
9645 {
9646 gl::Context *context = gl::getNonLostContext();
9647
9648 if (context)
9649 {
9650 if (context->getClientVersion() < 3)
9651 {
9652 return gl::error(GL_INVALID_OPERATION);
9653 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009654
Geoff Langcec35902014-04-16 10:52:36 -04009655 const gl::TextureCaps &formatCaps = context->getCaps().textureCaps.get(internalformat);
9656 if (!formatCaps.colorRendering && !formatCaps.depthRendering && !formatCaps.stencilRendering)
Shannon Woods809d2502013-07-08 10:32:18 -04009657 {
9658 return gl::error(GL_INVALID_ENUM);
9659 }
9660
9661 if (target != GL_RENDERBUFFER)
9662 {
9663 return gl::error(GL_INVALID_ENUM);
9664 }
9665
9666 if (bufSize < 0)
9667 {
9668 return gl::error(GL_INVALID_VALUE);
9669 }
9670
9671 switch (pname)
9672 {
9673 case GL_NUM_SAMPLE_COUNTS:
9674 if (bufSize != 0)
9675 *params = context->getNumSampleCounts(internalformat);
9676 break;
9677 case GL_SAMPLES:
9678 context->getSampleCounts(internalformat, bufSize, params);
9679 break;
9680 default:
9681 return gl::error(GL_INVALID_ENUM);
9682 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009683 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009684 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009685 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009686 {
9687 return gl::error(GL_OUT_OF_MEMORY);
9688 }
9689}
9690
9691// Extension functions
9692
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009693void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9694 GLbitfield mask, GLenum filter)
9695{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009696 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009697 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9698 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9699 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9700
9701 try
9702 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009703 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009704
9705 if (context)
9706 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009707 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04009708 dstX0, dstY0, dstX1, dstY1, mask, filter,
9709 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009710 {
Geoff Lang758d5b22013-06-11 11:42:50 -04009711 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009712 }
9713
Geoff Lang758d5b22013-06-11 11:42:50 -04009714 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
9715 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009716 }
9717 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009718 catch (...)
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009720 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009721 }
9722}
9723
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009724void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9725 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009727 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009728 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009729 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009730 target, level, internalformat, width, height, depth, border, format, type, pixels);
9731
9732 try
9733 {
9734 UNIMPLEMENTED(); // FIXME
9735 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009736 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009738 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009739 }
9740}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009741
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009742void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9743 GLenum *binaryFormat, void *binary)
9744{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009745 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 +00009746 program, bufSize, length, binaryFormat, binary);
9747
9748 try
9749 {
9750 gl::Context *context = gl::getNonLostContext();
9751
9752 if (context)
9753 {
9754 gl::Program *programObject = context->getProgram(program);
9755
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009756 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009758 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009759 }
9760
9761 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9762
9763 if (!programBinary)
9764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009765 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009766 }
9767
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009768 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009770 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009771 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009772
9773 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009774 }
9775 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009776 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009778 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009779 }
9780}
9781
9782void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9783 const void *binary, GLint length)
9784{
9785 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9786 program, binaryFormat, binary, length);
9787
9788 try
9789 {
9790 gl::Context *context = gl::getNonLostContext();
9791
9792 if (context)
9793 {
9794 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009796 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009797 }
9798
9799 gl::Program *programObject = context->getProgram(program);
9800
9801 if (!programObject)
9802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009803 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009804 }
9805
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009806 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009807 }
9808 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009809 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009811 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009812 }
9813}
9814
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009815void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9816{
9817 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9818
9819 try
9820 {
9821 gl::Context *context = gl::getNonLostContext();
9822
9823 if (context)
9824 {
9825 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9826 {
9827 return gl::error(GL_INVALID_VALUE);
9828 }
9829
9830 if (context->getDrawFramebufferHandle() == 0)
9831 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009832 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009833 {
9834 return gl::error(GL_INVALID_OPERATION);
9835 }
9836
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009837 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009838 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009839 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009840 }
9841 }
9842 else
9843 {
9844 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9845 {
9846 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9847 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9848 {
9849 return gl::error(GL_INVALID_OPERATION);
9850 }
9851 }
9852 }
9853
9854 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9855
9856 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9857 {
9858 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9859 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009860
9861 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9862 {
9863 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9864 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009865 }
9866 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009867 catch (...)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009868 {
9869 return gl::error(GL_OUT_OF_MEMORY);
9870 }
9871}
9872
Shannon Woodsb3801742014-03-27 14:59:19 -04009873void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
9874{
9875 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
9876
9877 try
9878 {
9879 gl::Context *context = gl::getNonLostContext();
9880
9881 if (context)
9882 {
Shannon Woodsb3801742014-03-27 14:59:19 -04009883 if (!gl::ValidBufferTarget(context, target))
9884 {
9885 return gl::error(GL_INVALID_ENUM);
9886 }
9887
9888 if (pname != GL_BUFFER_MAP_POINTER)
9889 {
9890 return gl::error(GL_INVALID_ENUM);
9891 }
9892
9893 gl::Buffer *buffer = context->getTargetBuffer(target);
9894
9895 if (!buffer || !buffer->mapped())
9896 {
9897 *params = NULL;
9898 }
9899
9900 *params = buffer->mapPointer();
9901 }
9902 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009903 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009904 {
9905 return gl::error(GL_OUT_OF_MEMORY);
9906 }
9907}
9908
9909void * __stdcall glMapBufferOES(GLenum target, GLenum access)
9910{
9911 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
9912
9913 try
9914 {
9915 gl::Context *context = gl::getNonLostContext();
9916
9917 if (context)
9918 {
9919 if (!gl::ValidBufferTarget(context, target))
9920 {
9921 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9922 }
9923
9924 gl::Buffer *buffer = context->getTargetBuffer(target);
9925
9926 if (buffer == NULL)
9927 {
9928 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9929 }
9930
9931 if (access != GL_WRITE_ONLY_OES)
9932 {
9933 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9934 }
9935
9936 if (buffer->mapped())
9937 {
9938 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9939 }
9940
9941 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
9942 }
9943 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009944 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009945 {
9946 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
9947 }
9948
9949 return NULL;
9950}
9951
9952GLboolean __stdcall glUnmapBufferOES(GLenum target)
9953{
9954 EVENT("(GLenum target = 0x%X)", target);
9955
9956 try
9957 {
9958 gl::Context *context = gl::getNonLostContext();
9959
9960 if (context)
9961 {
9962 if (!gl::ValidBufferTarget(context, target))
9963 {
9964 return gl::error(GL_INVALID_ENUM, GL_FALSE);
9965 }
9966
9967 gl::Buffer *buffer = context->getTargetBuffer(target);
9968
9969 if (buffer == NULL || !buffer->mapped())
9970 {
9971 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9972 }
9973
9974 // TODO: detect if we had corruption. if so, throw an error and return false.
9975
9976 buffer->unmap();
9977
9978 return GL_TRUE;
9979 }
9980 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009981 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009982 {
9983 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9984 }
9985
9986 return GL_FALSE;
9987}
9988
Shannon Woods916e7692014-03-27 16:58:22 -04009989void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
9990{
9991 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
9992 target, offset, length, access);
9993
9994 try
9995 {
9996 gl::Context *context = gl::getNonLostContext();
9997
9998 if (context)
9999 {
10000 if (!gl::ValidBufferTarget(context, target))
10001 {
10002 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10003 }
10004
10005 if (offset < 0 || length < 0)
10006 {
10007 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10008 }
10009
10010 gl::Buffer *buffer = context->getTargetBuffer(target);
10011
10012 if (buffer == NULL)
10013 {
10014 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10015 }
10016
10017 // Check for buffer overflow
10018 size_t offsetSize = static_cast<size_t>(offset);
10019 size_t lengthSize = static_cast<size_t>(length);
10020
10021 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10022 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
10023 {
10024 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10025 }
10026
10027 // Check for invalid bits in the mask
10028 GLbitfield allAccessBits = GL_MAP_READ_BIT |
10029 GL_MAP_WRITE_BIT |
10030 GL_MAP_INVALIDATE_RANGE_BIT |
10031 GL_MAP_INVALIDATE_BUFFER_BIT |
10032 GL_MAP_FLUSH_EXPLICIT_BIT |
10033 GL_MAP_UNSYNCHRONIZED_BIT;
10034
10035 if (access & ~(allAccessBits))
10036 {
10037 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10038 }
10039
10040 if (length == 0 || buffer->mapped())
10041 {
10042 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10043 }
10044
10045 // Check for invalid bit combinations
10046 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10047 {
10048 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10049 }
10050
10051 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10052 GL_MAP_INVALIDATE_BUFFER_BIT |
10053 GL_MAP_UNSYNCHRONIZED_BIT;
10054
10055 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10056 {
10057 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10058 }
10059
10060 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10061 {
10062 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10063 }
10064
10065 return buffer->mapRange(offset, length, access);
10066 }
10067 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010068 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010069 {
10070 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10071 }
10072
10073 return NULL;
10074}
10075
10076void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10077{
10078 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10079
10080 try
10081 {
10082 gl::Context *context = gl::getNonLostContext();
10083
10084 if (context)
10085 {
10086 if (offset < 0 || length < 0)
10087 {
10088 return gl::error(GL_INVALID_VALUE);
10089 }
10090
10091 if (!gl::ValidBufferTarget(context, target))
10092 {
10093 return gl::error(GL_INVALID_ENUM);
10094 }
10095
10096 gl::Buffer *buffer = context->getTargetBuffer(target);
10097
10098 if (buffer == NULL)
10099 {
10100 return gl::error(GL_INVALID_OPERATION);
10101 }
10102
10103 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
10104 {
10105 return gl::error(GL_INVALID_OPERATION);
10106 }
10107
10108 // Check for buffer overflow
10109 size_t offsetSize = static_cast<size_t>(offset);
10110 size_t lengthSize = static_cast<size_t>(length);
10111
10112 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10113 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
10114 {
10115 return gl::error(GL_INVALID_VALUE);
10116 }
10117
10118 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10119 }
10120 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010121 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010122 {
10123 return gl::error(GL_OUT_OF_MEMORY);
10124 }
10125}
10126
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010127__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10128{
10129 struct Extension
10130 {
10131 const char *name;
10132 __eglMustCastToProperFunctionPointerType address;
10133 };
10134
10135 static const Extension glExtensions[] =
10136 {
10137 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010138 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010139 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010140 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10141 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10142 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10143 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10144 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10145 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10146 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010147 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010148 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010149 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10150 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10151 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10152 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010153 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10154 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10155 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10156 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10157 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10158 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10159 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010160 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010161 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10162 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10163 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010164 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010165 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10166 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10167 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -040010168 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10169 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10170 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010171
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010172 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010173 {
10174 if (strcmp(procname, glExtensions[ext].name) == 0)
10175 {
10176 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10177 }
10178 }
10179
10180 return NULL;
10181}
10182
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010183// Non-public functions used by EGL
10184
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010185bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010186{
10187 EVENT("(egl::Surface* surface = 0x%0.8p)",
10188 surface);
10189
10190 try
10191 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010192 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010193
10194 if (context)
10195 {
10196 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010197 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010198
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010199 if (textureObject->isImmutable())
10200 {
10201 return false;
10202 }
10203
Geoff Lang32d508e2014-02-11 09:39:48 -050010204 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010205 }
10206 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010207 catch (...)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010209 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010210 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010211
10212 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010213}
10214
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010215}