blob: 08894b77f174e33c0607b1f26f307e83c4a3e911 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
Geoff Lang48dcae72014-02-05 16:28:24 -05003// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040024#include "libGLESv2/VertexArray.h"
Geoff Langc8058452014-02-03 12:04:11 -050025#include "libGLESv2/TransformFeedback.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026
Geoff Lange8ebe7f2013-08-05 15:03:13 -040027#include "libGLESv2/validationES.h"
28#include "libGLESv2/validationES2.h"
29#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050030#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040031
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032extern "C"
33{
34
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000035// OpenGL ES 2.0 functions
36
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000037void __stdcall glActiveTexture(GLenum texture)
38{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000039 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000040
41 try
42 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000044
45 if (context)
46 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000047 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
48 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000049 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000050 }
51
daniel@transgaming.com428d1582010-05-04 03:35:25 +000052 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053 }
54 }
Jamie Madillde0ec752014-05-05 15:10:38 -040055 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058 }
59}
60
61void __stdcall glAttachShader(GLuint program, GLuint shader)
62{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000063 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064
65 try
66 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068
69 if (context)
70 {
71 gl::Program *programObject = context->getProgram(program);
72 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000073
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000074 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000076 if (context->getShader(program))
77 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000078 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000079 }
80 else
81 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000083 }
84 }
85
86 if (!shaderObject)
87 {
88 if (context->getProgram(shader))
89 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000090 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000091 }
92 else
93 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000094 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000096 }
97
98 if (!programObject->attachShader(shaderObject))
99 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000100 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000101 }
102 }
103 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400104 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000106 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107 }
108}
109
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000110void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
111{
112 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
113
114 try
115 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000116 gl::Context *context = gl::getNonLostContext();
117
118 if (context)
119 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400120 if (!ValidateBeginQuery(context, target, id))
Geoff Lang37dde692014-01-31 16:34:54 -0500121 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400122 return;
Geoff Lang37dde692014-01-31 16:34:54 -0500123 }
124
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000125 context->beginQuery(target, id);
126 }
127 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400128 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000130 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000131 }
132}
133
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000134void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000136 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137
138 try
139 {
140 if (index >= gl::MAX_VERTEX_ATTRIBS)
141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000142 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000143 }
144
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000145 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000146
147 if (context)
148 {
149 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000150
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151 if (!programObject)
152 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000153 if (context->getShader(program))
154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000155 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000156 }
157 else
158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000159 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000160 }
161 }
162
163 if (strncmp(name, "gl_", 3) == 0)
164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000165 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000166 }
167
168 programObject->bindAttributeLocation(index, name);
169 }
170 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400171 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000173 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000174 }
175}
176
177void __stdcall glBindBuffer(GLenum target, GLuint buffer)
178{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000179 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000180
181 try
182 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000183 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000184
185 if (context)
186 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500187 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000188 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500189 return gl::error(GL_INVALID_ENUM);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000190 }
191
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000192 switch (target)
193 {
194 case GL_ARRAY_BUFFER:
195 context->bindArrayBuffer(buffer);
196 return;
197 case GL_ELEMENT_ARRAY_BUFFER:
198 context->bindElementArrayBuffer(buffer);
199 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000200 case GL_COPY_READ_BUFFER:
201 context->bindCopyReadBuffer(buffer);
202 return;
203 case GL_COPY_WRITE_BUFFER:
204 context->bindCopyWriteBuffer(buffer);
205 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000206 case GL_PIXEL_PACK_BUFFER:
207 context->bindPixelPackBuffer(buffer);
208 return;
209 case GL_PIXEL_UNPACK_BUFFER:
210 context->bindPixelUnpackBuffer(buffer);
211 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000212 case GL_UNIFORM_BUFFER:
213 context->bindGenericUniformBuffer(buffer);
214 return;
215 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000216 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000217 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000218 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000219 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000220 }
221 }
222 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400223 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000225 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000226 }
227}
228
229void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
230{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000231 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000232
233 try
234 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500235 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000237 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000238 }
239
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000240 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000241
242 if (context)
243 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000244 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
245 {
246 context->bindReadFramebuffer(framebuffer);
247 }
248
249 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
250 {
251 context->bindDrawFramebuffer(framebuffer);
252 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000253 }
254 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400255 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000257 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258 }
259}
260
261void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
262{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000263 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000264
265 try
266 {
267 if (target != GL_RENDERBUFFER)
268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000269 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000270 }
271
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000272 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000273
274 if (context)
275 {
276 context->bindRenderbuffer(renderbuffer);
277 }
278 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400279 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282 }
283}
284
285void __stdcall glBindTexture(GLenum target, GLuint texture)
286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000287 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000288
289 try
290 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292
293 if (context)
294 {
295 gl::Texture *textureObject = context->getTexture(texture);
296
297 if (textureObject && textureObject->getTarget() != target && texture != 0)
298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000299 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000300 }
301
302 switch (target)
303 {
304 case GL_TEXTURE_2D:
305 context->bindTexture2D(texture);
306 return;
307 case GL_TEXTURE_CUBE_MAP:
308 context->bindTextureCubeMap(texture);
309 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000310 case GL_TEXTURE_3D:
311 if (context->getClientVersion() < 3)
312 {
313 return gl::error(GL_INVALID_ENUM);
314 }
315 context->bindTexture3D(texture);
316 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000317 case GL_TEXTURE_2D_ARRAY:
318 if (context->getClientVersion() < 3)
319 {
320 return gl::error(GL_INVALID_ENUM);
321 }
322 context->bindTexture2DArray(texture);
323 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000324 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000325 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000326 }
327 }
328 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400329 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000331 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000332 }
333}
334
335void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
336{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000337 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000338 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000339
340 try
341 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000342 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000343
344 if (context)
345 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000346 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000347 }
348 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400349 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000351 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000352 }
353}
354
355void __stdcall glBlendEquation(GLenum mode)
356{
357 glBlendEquationSeparate(mode, mode);
358}
359
360void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
361{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000362 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000363
364 try
365 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000366 gl::Context *context = gl::getNonLostContext();
367
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368 switch (modeRGB)
369 {
370 case GL_FUNC_ADD:
371 case GL_FUNC_SUBTRACT:
372 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000373 case GL_MIN:
374 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000375 break;
376
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000377 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000378 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000379 }
380
381 switch (modeAlpha)
382 {
383 case GL_FUNC_ADD:
384 case GL_FUNC_SUBTRACT:
385 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000386 case GL_MIN:
387 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000388 break;
389
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000390 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000391 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000392 }
393
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000394 if (context)
395 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000396 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000397 }
398 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400399 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000401 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402 }
403}
404
405void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
406{
407 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
408}
409
410void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000412 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 +0000413 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000414
415 try
416 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000417 gl::Context *context = gl::getNonLostContext();
418
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000419 switch (srcRGB)
420 {
421 case GL_ZERO:
422 case GL_ONE:
423 case GL_SRC_COLOR:
424 case GL_ONE_MINUS_SRC_COLOR:
425 case GL_DST_COLOR:
426 case GL_ONE_MINUS_DST_COLOR:
427 case GL_SRC_ALPHA:
428 case GL_ONE_MINUS_SRC_ALPHA:
429 case GL_DST_ALPHA:
430 case GL_ONE_MINUS_DST_ALPHA:
431 case GL_CONSTANT_COLOR:
432 case GL_ONE_MINUS_CONSTANT_COLOR:
433 case GL_CONSTANT_ALPHA:
434 case GL_ONE_MINUS_CONSTANT_ALPHA:
435 case GL_SRC_ALPHA_SATURATE:
436 break;
437 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000438 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000439 }
440
441 switch (dstRGB)
442 {
443 case GL_ZERO:
444 case GL_ONE:
445 case GL_SRC_COLOR:
446 case GL_ONE_MINUS_SRC_COLOR:
447 case GL_DST_COLOR:
448 case GL_ONE_MINUS_DST_COLOR:
449 case GL_SRC_ALPHA:
450 case GL_ONE_MINUS_SRC_ALPHA:
451 case GL_DST_ALPHA:
452 case GL_ONE_MINUS_DST_ALPHA:
453 case GL_CONSTANT_COLOR:
454 case GL_ONE_MINUS_CONSTANT_COLOR:
455 case GL_CONSTANT_ALPHA:
456 case GL_ONE_MINUS_CONSTANT_ALPHA:
457 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000458
459 case GL_SRC_ALPHA_SATURATE:
460 if (!context || context->getClientVersion() < 3)
461 {
462 return gl::error(GL_INVALID_ENUM);
463 }
464 break;
465
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000466 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000467 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000468 }
469
470 switch (srcAlpha)
471 {
472 case GL_ZERO:
473 case GL_ONE:
474 case GL_SRC_COLOR:
475 case GL_ONE_MINUS_SRC_COLOR:
476 case GL_DST_COLOR:
477 case GL_ONE_MINUS_DST_COLOR:
478 case GL_SRC_ALPHA:
479 case GL_ONE_MINUS_SRC_ALPHA:
480 case GL_DST_ALPHA:
481 case GL_ONE_MINUS_DST_ALPHA:
482 case GL_CONSTANT_COLOR:
483 case GL_ONE_MINUS_CONSTANT_COLOR:
484 case GL_CONSTANT_ALPHA:
485 case GL_ONE_MINUS_CONSTANT_ALPHA:
486 case GL_SRC_ALPHA_SATURATE:
487 break;
488 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000489 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000490 }
491
492 switch (dstAlpha)
493 {
494 case GL_ZERO:
495 case GL_ONE:
496 case GL_SRC_COLOR:
497 case GL_ONE_MINUS_SRC_COLOR:
498 case GL_DST_COLOR:
499 case GL_ONE_MINUS_DST_COLOR:
500 case GL_SRC_ALPHA:
501 case GL_ONE_MINUS_SRC_ALPHA:
502 case GL_DST_ALPHA:
503 case GL_ONE_MINUS_DST_ALPHA:
504 case GL_CONSTANT_COLOR:
505 case GL_ONE_MINUS_CONSTANT_COLOR:
506 case GL_CONSTANT_ALPHA:
507 case GL_ONE_MINUS_CONSTANT_ALPHA:
508 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000509
510 case GL_SRC_ALPHA_SATURATE:
511 if (!context || context->getClientVersion() < 3)
512 {
513 return gl::error(GL_INVALID_ENUM);
514 }
515 break;
516
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000517 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000518 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000519 }
520
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000521 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
522 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
523
524 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
525 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
526
527 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000528 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000529 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 +0000530 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000531 }
532
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000533 if (context)
534 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000535 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000536 }
537 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400538 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000540 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000541 }
542}
543
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000544void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000545{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000546 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 +0000547 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000548
549 try
550 {
551 if (size < 0)
552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000553 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000554 }
555
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000556 gl::Context *context = gl::getNonLostContext();
557
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000558 switch (usage)
559 {
560 case GL_STREAM_DRAW:
561 case GL_STATIC_DRAW:
562 case GL_DYNAMIC_DRAW:
563 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000564
565 case GL_STREAM_READ:
566 case GL_STREAM_COPY:
567 case GL_STATIC_READ:
568 case GL_STATIC_COPY:
569 case GL_DYNAMIC_READ:
570 case GL_DYNAMIC_COPY:
571 if (context && context->getClientVersion() < 3)
572 {
573 return gl::error(GL_INVALID_ENUM);
574 }
575 break;
576
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000577 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000578 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579 }
580
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000581 if (context)
582 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500583 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000585 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000586 }
587
Jamie Madill8c96d582014-03-05 15:01:23 -0500588 gl::Buffer *buffer = context->getTargetBuffer(target);
589
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000590 if (!buffer)
591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000592 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000593 }
594
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000595 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000596 }
597 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400598 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000600 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000601 }
602}
603
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000604void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000605{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000606 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 +0000607 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000608
609 try
610 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000611 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000613 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000614 }
615
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000616 if (data == NULL)
617 {
618 return;
619 }
620
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000621 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000622
623 if (context)
624 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500625 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000627 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000628 }
629
Jamie Madill8c96d582014-03-05 15:01:23 -0500630 gl::Buffer *buffer = context->getTargetBuffer(target);
631
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000632 if (!buffer)
633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000634 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000635 }
636
Jamie Madill7a5f7382014-03-05 15:01:24 -0500637 if (buffer->mapped())
638 {
639 return gl::error(GL_INVALID_OPERATION);
640 }
641
Geoff Lang876dc722014-05-01 17:10:24 -0400642 // Check for possible overflow of size + offset
643 if (!rx::IsUnsignedAdditionSafe<size_t>(size, offset))
644 {
645 return gl::error(GL_OUT_OF_MEMORY);
646 }
647
648 if (size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000650 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000651 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000652
653 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000654 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000655 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400656 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000658 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000659 }
660}
661
662GLenum __stdcall glCheckFramebufferStatus(GLenum target)
663{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000664 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000665
666 try
667 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500668 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000670 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000671 }
672
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000673 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000674
675 if (context)
676 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500677 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
678 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000679 return framebuffer->completeness();
680 }
681 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400682 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000684 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000685 }
686
687 return 0;
688}
689
690void __stdcall glClear(GLbitfield mask)
691{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000692 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000693
694 try
695 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000696 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000697
698 if (context)
699 {
Geoff Lang0b833232013-08-21 10:13:29 -0400700 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
701
702 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
703 {
704 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
705 }
706
707 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
708 {
709 return gl::error(GL_INVALID_VALUE);
710 }
711
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000712 context->clear(mask);
713 }
714 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400715 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000717 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000718 }
719}
720
721void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
722{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000723 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000724 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000725
726 try
727 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000728 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000729
730 if (context)
731 {
732 context->setClearColor(red, green, blue, alpha);
733 }
734 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400735 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000737 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000738 }
739}
740
741void __stdcall glClearDepthf(GLclampf depth)
742{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000743 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000744
745 try
746 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000747 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000748
749 if (context)
750 {
751 context->setClearDepth(depth);
752 }
753 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400754 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000756 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000757 }
758}
759
760void __stdcall glClearStencil(GLint s)
761{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000762 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000763
764 try
765 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000766 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000767
768 if (context)
769 {
770 context->setClearStencil(s);
771 }
772 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400773 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000776 }
777}
778
779void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
780{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000781 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000782 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000783
784 try
785 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000786 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000787
788 if (context)
789 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000790 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000791 }
792 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400793 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000795 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000796 }
797}
798
799void __stdcall glCompileShader(GLuint shader)
800{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000801 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000802
803 try
804 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000805 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000806
807 if (context)
808 {
809 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000810
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000811 if (!shaderObject)
812 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000813 if (context->getProgram(shader))
814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000815 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000816 }
817 else
818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000819 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000820 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000821 }
822
823 shaderObject->compile();
824 }
825 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400826 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000828 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000829 }
830}
831
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000832void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
833 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000835 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000836 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000837 target, level, internalformat, width, height, border, imageSize, data);
838
839 try
840 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000841 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000842
843 if (context)
844 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000845 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400846 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madill6f38f822014-06-06 17:12:20 -0400847 0, 0, width, height, border, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000848 {
849 return;
850 }
851
852 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400853 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madill6f38f822014-06-06 17:12:20 -0400854 0, 0, 0, width, height, 1, border, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000855 {
856 return;
857 }
858
859 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000861 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000862 }
863
864 switch (target)
865 {
866 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000867 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000868 gl::Texture2D *texture = context->getTexture2D();
869 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000870 }
871 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000872
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000873 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
874 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
875 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
876 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
877 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
878 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000879 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000880 gl::TextureCubeMap *texture = context->getTextureCubeMap();
881 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000882 }
883 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000884
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000885 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000886 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000887 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000888 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000889 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400890 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000892 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000893 }
894}
895
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000896void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
897 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000898{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000899 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000900 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000901 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000902 target, level, xoffset, yoffset, width, height, format, imageSize, data);
903
904 try
905 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000906 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000907
908 if (context)
909 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000910 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400911 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000912 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
913 {
914 return;
915 }
916
917 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400918 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400919 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000920 {
921 return;
922 }
923
924 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000926 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000927 }
928
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000929 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000930 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000931 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000932 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000933 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000934 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000935 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000936 break;
937
938 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
939 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
940 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
941 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
942 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
943 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000944 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000945 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000946 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000947 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000948 break;
949
950 default:
951 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000952 }
953 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000954 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400955 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000957 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000958 }
959}
960
961void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
962{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000963 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000964 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000965 target, level, internalformat, x, y, width, height, border);
966
967 try
968 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000969 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000970
971 if (context)
972 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000973 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400974 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000975 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000976 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000977 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000978 }
979
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000980 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400981 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000982 0, 0, 0, x, y, width, height, border))
983 {
984 return;
985 }
986
987 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
988
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000989 switch (target)
990 {
991 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000992 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000993 gl::Texture2D *texture = context->getTexture2D();
994 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000995 }
996 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000997
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000998 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
999 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1000 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1001 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1002 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1003 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001004 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001005 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1006 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001007 }
1008 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001009
1010 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001011 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001012 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001013 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001014 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001015 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001017 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001018 }
1019}
1020
1021void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1022{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001023 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001024 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001025 target, level, xoffset, yoffset, x, y, width, height);
1026
1027 try
1028 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001029 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001030
1031 if (context)
1032 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001033 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001034 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001035 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001036 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001037 return;
1038 }
1039
1040 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001041 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001042 xoffset, yoffset, 0, x, y, width, height, 0))
1043 {
1044 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001045 }
1046
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001047 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001048
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001049 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001050 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001051 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001052 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001053 gl::Texture2D *texture = context->getTexture2D();
1054 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001055 }
1056 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001057
1058 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1059 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1060 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1061 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1062 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1063 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001064 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001065 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1066 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001067 }
1068 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001069
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001070 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001071 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001072 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001073 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001074 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001075
Jamie Madillde0ec752014-05-05 15:10:38 -04001076 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001078 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001079 }
1080}
1081
1082GLuint __stdcall glCreateProgram(void)
1083{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001084 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001085
1086 try
1087 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001088 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001089
1090 if (context)
1091 {
1092 return context->createProgram();
1093 }
1094 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001095 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001097 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001098 }
1099
1100 return 0;
1101}
1102
1103GLuint __stdcall glCreateShader(GLenum type)
1104{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001105 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001106
1107 try
1108 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001109 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001110
1111 if (context)
1112 {
1113 switch (type)
1114 {
1115 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001116 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001117 return context->createShader(type);
1118 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001119 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001120 }
1121 }
1122 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001123 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001125 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001126 }
1127
1128 return 0;
1129}
1130
1131void __stdcall glCullFace(GLenum mode)
1132{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001133 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001134
1135 try
1136 {
1137 switch (mode)
1138 {
1139 case GL_FRONT:
1140 case GL_BACK:
1141 case GL_FRONT_AND_BACK:
1142 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001143 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001144
1145 if (context)
1146 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001147 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001148 }
1149 }
1150 break;
1151 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001152 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001153 }
1154 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001155 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001157 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001158 }
1159}
1160
1161void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001163 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001164
1165 try
1166 {
1167 if (n < 0)
1168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001169 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001170 }
1171
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001172 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001173
1174 if (context)
1175 {
1176 for (int i = 0; i < n; i++)
1177 {
1178 context->deleteBuffer(buffers[i]);
1179 }
1180 }
1181 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001182 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001185 }
1186}
1187
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001188void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001190 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001191
1192 try
1193 {
1194 if (n < 0)
1195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001196 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001197 }
1198
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001199 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001200
1201 if (context)
1202 {
1203 for (int i = 0; i < n; i++)
1204 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001205 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001206 }
1207 }
1208 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001209 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001211 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001212 }
1213}
1214
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001215void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001217 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001218
1219 try
1220 {
1221 if (n < 0)
1222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001223 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001224 }
1225
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001226 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001227
1228 if (context)
1229 {
1230 for (int i = 0; i < n; i++)
1231 {
1232 if (framebuffers[i] != 0)
1233 {
1234 context->deleteFramebuffer(framebuffers[i]);
1235 }
1236 }
1237 }
1238 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001239 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001240 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001241 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001242 }
1243}
1244
1245void __stdcall glDeleteProgram(GLuint program)
1246{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001247 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001248
1249 try
1250 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001251 if (program == 0)
1252 {
1253 return;
1254 }
1255
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001256 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001257
1258 if (context)
1259 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001260 if (!context->getProgram(program))
1261 {
1262 if(context->getShader(program))
1263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001264 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001265 }
1266 else
1267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001268 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001269 }
1270 }
1271
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001272 context->deleteProgram(program);
1273 }
1274 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001275 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001277 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001278 }
1279}
1280
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001281void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1282{
1283 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1284
1285 try
1286 {
1287 if (n < 0)
1288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001289 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001290 }
1291
1292 gl::Context *context = gl::getNonLostContext();
1293
1294 if (context)
1295 {
1296 for (int i = 0; i < n; i++)
1297 {
1298 context->deleteQuery(ids[i]);
1299 }
1300 }
1301 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001302 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001304 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001305 }
1306}
1307
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001308void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1309{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001310 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001311
1312 try
1313 {
1314 if (n < 0)
1315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001316 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001317 }
1318
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001319 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001320
1321 if (context)
1322 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001323 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001324 {
1325 context->deleteRenderbuffer(renderbuffers[i]);
1326 }
1327 }
1328 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001329 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001331 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001332 }
1333}
1334
1335void __stdcall glDeleteShader(GLuint shader)
1336{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001337 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001338
1339 try
1340 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001341 if (shader == 0)
1342 {
1343 return;
1344 }
1345
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001346 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001347
1348 if (context)
1349 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001350 if (!context->getShader(shader))
1351 {
1352 if(context->getProgram(shader))
1353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001354 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001355 }
1356 else
1357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001358 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001359 }
1360 }
1361
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001362 context->deleteShader(shader);
1363 }
1364 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001365 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001367 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001368 }
1369}
1370
1371void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1372{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001373 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001374
1375 try
1376 {
1377 if (n < 0)
1378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001379 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001380 }
1381
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001382 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001383
1384 if (context)
1385 {
1386 for (int i = 0; i < n; i++)
1387 {
1388 if (textures[i] != 0)
1389 {
1390 context->deleteTexture(textures[i]);
1391 }
1392 }
1393 }
1394 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001395 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001397 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001398 }
1399}
1400
1401void __stdcall glDepthFunc(GLenum func)
1402{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001403 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001404
1405 try
1406 {
1407 switch (func)
1408 {
1409 case GL_NEVER:
1410 case GL_ALWAYS:
1411 case GL_LESS:
1412 case GL_LEQUAL:
1413 case GL_EQUAL:
1414 case GL_GREATER:
1415 case GL_GEQUAL:
1416 case GL_NOTEQUAL:
1417 break;
1418 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001419 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001420 }
1421
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001422 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001423
1424 if (context)
1425 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001426 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001427 }
1428 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001429 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001431 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001432 }
1433}
1434
1435void __stdcall glDepthMask(GLboolean flag)
1436{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001437 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001438
1439 try
1440 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001441 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001442
1443 if (context)
1444 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001445 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001446 }
1447 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001448 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001450 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001451 }
1452}
1453
1454void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1455{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001456 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001457
1458 try
1459 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001460 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001461
1462 if (context)
1463 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001464 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001465 }
1466 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001467 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001469 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001470 }
1471}
1472
1473void __stdcall glDetachShader(GLuint program, GLuint shader)
1474{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001475 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001476
1477 try
1478 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001479 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001480
1481 if (context)
1482 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001483
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001484 gl::Program *programObject = context->getProgram(program);
1485 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001486
1487 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001488 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001489 gl::Shader *shaderByProgramHandle;
1490 shaderByProgramHandle = context->getShader(program);
1491 if (!shaderByProgramHandle)
1492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001493 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001494 }
1495 else
1496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001497 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001498 }
1499 }
1500
1501 if (!shaderObject)
1502 {
1503 gl::Program *programByShaderHandle = context->getProgram(shader);
1504 if (!programByShaderHandle)
1505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001506 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001507 }
1508 else
1509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001510 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001511 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001512 }
1513
1514 if (!programObject->detachShader(shaderObject))
1515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001516 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001517 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001518 }
1519 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001520 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001521 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001522 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001523 }
1524}
1525
1526void __stdcall glDisable(GLenum cap)
1527{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001528 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001529
1530 try
1531 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001532 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001533
1534 if (context)
1535 {
Geoff Lang0550d032014-01-30 11:29:07 -05001536 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001538 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001539 }
Geoff Lang0550d032014-01-30 11:29:07 -05001540
1541 context->setCap(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001542 }
1543 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001544 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001546 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001547 }
1548}
1549
1550void __stdcall glDisableVertexAttribArray(GLuint index)
1551{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001552 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001553
1554 try
1555 {
1556 if (index >= gl::MAX_VERTEX_ATTRIBS)
1557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001559 }
1560
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001561 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001562
1563 if (context)
1564 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001565 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001566 }
1567 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001568 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001570 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001571 }
1572}
1573
1574void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1575{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001576 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001577
1578 try
1579 {
1580 if (count < 0 || first < 0)
1581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001582 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001583 }
1584
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001585 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001586
Jamie Madill7a5f7382014-03-05 15:01:24 -05001587 // Check for mapped buffers
1588 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1589 {
1590 return gl::error(GL_INVALID_OPERATION);
1591 }
1592
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001593 if (context)
1594 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001595 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1596 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1597 curTransformFeedback->getDrawMode() != mode)
1598 {
1599 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1600 // that does not match the current transform feedback object's draw mode (if transform feedback
1601 // is active), (3.0.2, section 2.14, pg 86)
1602 return gl::error(GL_INVALID_OPERATION);
1603 }
1604
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001605 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001606 }
1607 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001608 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001610 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001611 }
1612}
1613
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001614void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1615{
1616 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1617
1618 try
1619 {
1620 if (count < 0 || first < 0 || primcount < 0)
1621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001623 }
1624
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001625 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001626 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001627 gl::Context *context = gl::getNonLostContext();
1628
Jamie Madill7a5f7382014-03-05 15:01:24 -05001629 // Check for mapped buffers
1630 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1631 {
1632 return gl::error(GL_INVALID_OPERATION);
1633 }
1634
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001635 if (context)
1636 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001637 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1638 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1639 curTransformFeedback->getDrawMode() != mode)
1640 {
1641 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1642 // that does not match the current transform feedback object's draw mode (if transform feedback
1643 // is active), (3.0.2, section 2.14, pg 86)
1644 return gl::error(GL_INVALID_OPERATION);
1645 }
1646
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001647 context->drawArrays(mode, first, count, primcount);
1648 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001649 }
1650 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001651 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001653 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001654 }
1655}
1656
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001657void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001658{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001659 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 +00001660 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001661
1662 try
1663 {
1664 if (count < 0)
1665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001666 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001667 }
1668
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001669 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001670
1671 if (context)
1672 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001673 switch (type)
1674 {
1675 case GL_UNSIGNED_BYTE:
1676 case GL_UNSIGNED_SHORT:
1677 break;
1678 case GL_UNSIGNED_INT:
Geoff Langcec35902014-04-16 10:52:36 -04001679 if (!context->getCaps().extensions.elementIndexUint)
daniel@transgaming.com83921382011-01-08 05:46:00 +00001680 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001681 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001682 }
1683 break;
1684 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001685 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001686 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001687
1688 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1689 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1690 {
1691 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1692 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1693 return gl::error(GL_INVALID_OPERATION);
1694 }
1695
Jamie Madill7a5f7382014-03-05 15:01:24 -05001696 // Check for mapped buffers
1697 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1698 {
1699 return gl::error(GL_INVALID_OPERATION);
1700 }
1701
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001702 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001703 }
1704 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001705 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001706 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001707 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001708 }
1709}
1710
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001711void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1712{
1713 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1714 mode, count, type, indices, primcount);
1715
1716 try
1717 {
1718 if (count < 0 || primcount < 0)
1719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001720 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001721 }
1722
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001723 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001724 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001725 gl::Context *context = gl::getNonLostContext();
1726
1727 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001728 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001729 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001730 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001731 case GL_UNSIGNED_BYTE:
1732 case GL_UNSIGNED_SHORT:
1733 break;
1734 case GL_UNSIGNED_INT:
Geoff Langcec35902014-04-16 10:52:36 -04001735 if (!context->getCaps().extensions.elementIndexUint)
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001736 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001737 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001738 }
1739 break;
1740 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001741 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001742 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001743
1744 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1745 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1746 {
1747 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1748 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1749 return gl::error(GL_INVALID_OPERATION);
1750 }
1751
Jamie Madill7a5f7382014-03-05 15:01:24 -05001752 // Check for mapped buffers
1753 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1754 {
1755 return gl::error(GL_INVALID_OPERATION);
1756 }
1757
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001758 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001759 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001760 }
1761 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001762 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001763 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001764 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001765 }
1766}
1767
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001768void __stdcall glEnable(GLenum cap)
1769{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001770 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001771
1772 try
1773 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001774 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001775
1776 if (context)
1777 {
Geoff Lang0550d032014-01-30 11:29:07 -05001778 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001780 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001781 }
Geoff Lang0550d032014-01-30 11:29:07 -05001782
1783 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001784 }
1785 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001786 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001788 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001789 }
1790}
1791
1792void __stdcall glEnableVertexAttribArray(GLuint index)
1793{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001794 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001795
1796 try
1797 {
1798 if (index >= gl::MAX_VERTEX_ATTRIBS)
1799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001800 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001801 }
1802
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001803 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001804
1805 if (context)
1806 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001807 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001808 }
1809 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001810 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001812 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001813 }
1814}
1815
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001816void __stdcall glEndQueryEXT(GLenum target)
1817{
1818 EVENT("GLenum target = 0x%X)", target);
1819
1820 try
1821 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001822 gl::Context *context = gl::getNonLostContext();
1823
1824 if (context)
1825 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001826 if (!ValidateEndQuery(context, target))
Geoff Lang37dde692014-01-31 16:34:54 -05001827 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001828 return;
Geoff Lang37dde692014-01-31 16:34:54 -05001829 }
1830
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001831 context->endQuery(target);
1832 }
1833 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001834 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001836 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001837 }
1838}
1839
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001840void __stdcall glFinishFenceNV(GLuint fence)
1841{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001842 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001843
1844 try
1845 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001846 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001847
1848 if (context)
1849 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001850 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001851
1852 if (fenceObject == NULL)
1853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001854 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001855 }
1856
Jamie Madillfb9a7402013-07-26 11:55:01 -04001857 if (fenceObject->isFence() != GL_TRUE)
1858 {
1859 return gl::error(GL_INVALID_OPERATION);
1860 }
1861
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001862 fenceObject->finishFence();
1863 }
1864 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001865 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001867 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001868 }
1869}
1870
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001871void __stdcall glFinish(void)
1872{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001873 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001874
1875 try
1876 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001877 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001878
1879 if (context)
1880 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001881 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001882 }
1883 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001884 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001886 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001887 }
1888}
1889
1890void __stdcall glFlush(void)
1891{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001892 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001893
1894 try
1895 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001896 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001897
1898 if (context)
1899 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001900 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001901 }
1902 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001903 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001905 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001906 }
1907}
1908
1909void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1910{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001911 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001912 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001913
1914 try
1915 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001916 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001918 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001919 }
1920
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001921 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001922
1923 if (context)
1924 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001925 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001926 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001927 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001928 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001929
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001930 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1931 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001932
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001933 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001934 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001935 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001936 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001937 }
1938 else
1939 {
1940 switch (attachment)
1941 {
1942 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001943 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001944 break;
1945 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001946 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001947 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001948 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001949 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1950 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001951 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001952 UNREACHABLE();
1953 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001954 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001955 }
1956 }
1957 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001958 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001960 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001961 }
1962}
1963
1964void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1965{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001966 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001967 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001968
1969 try
1970 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001971 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001972 if (context)
1973 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001974 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001975 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001976 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001977 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001978 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04001979
1980 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001981 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001982 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001983 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001984 }
1985
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001986 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001987 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001988 textarget = GL_NONE;
1989 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001990
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001991 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001992
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001993 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001994 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001995 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001996 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001997 }
1998 else
1999 {
2000 switch (attachment)
2001 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002002 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2003 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2004 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002005 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002006 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002007 }
2008 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002009 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002011 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002012 }
2013}
2014
2015void __stdcall glFrontFace(GLenum mode)
2016{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002017 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002018
2019 try
2020 {
2021 switch (mode)
2022 {
2023 case GL_CW:
2024 case GL_CCW:
2025 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002026 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002027
2028 if (context)
2029 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002030 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002031 }
2032 }
2033 break;
2034 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002035 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002036 }
2037 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002038 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002040 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002041 }
2042}
2043
2044void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2045{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002046 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002047
2048 try
2049 {
2050 if (n < 0)
2051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002052 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002053 }
2054
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002055 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002056
2057 if (context)
2058 {
2059 for (int i = 0; i < n; i++)
2060 {
2061 buffers[i] = context->createBuffer();
2062 }
2063 }
2064 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002065 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002067 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068 }
2069}
2070
2071void __stdcall glGenerateMipmap(GLenum target)
2072{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002073 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002074
2075 try
2076 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002077 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002078
2079 if (context)
2080 {
Jamie Madill35d15012013-10-07 10:46:37 -04002081 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002083 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002084 }
Geoff Langae4852a2013-06-05 15:00:34 -04002085
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002086 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04002087
2088 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002089 {
2090 return gl::error(GL_INVALID_OPERATION);
2091 }
2092
Geoff Lang005df412013-10-16 14:12:50 -04002093 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002094
Geoff Langae4852a2013-06-05 15:00:34 -04002095 // Internally, all texture formats are sized so checking if the format
2096 // is color renderable and filterable will not fail.
Jamie Madill61b54432014-02-18 15:27:19 -05002097
Geoff Langcec35902014-04-16 10:52:36 -04002098 const gl::TextureCaps &formatCaps = context->getCaps().textureCaps.get(internalFormat);
2099
2100 bool validRenderable = (formatCaps.colorRendering ||
Jamie Madill61b54432014-02-18 15:27:19 -05002101 gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
2102
Geoff Langcec35902014-04-16 10:52:36 -04002103 if (formatCaps.depthRendering || gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
2104 !formatCaps.filtering || !validRenderable)
Geoff Langae4852a2013-06-05 15:00:34 -04002105 {
2106 return gl::error(GL_INVALID_OPERATION);
2107 }
2108
Jamie Madillc1f8b162013-10-07 10:46:38 -04002109 // Non-power of 2 ES2 check
Geoff Langcec35902014-04-16 10:52:36 -04002110 if (!context->getCaps().extensions.textureNPOT && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
Jamie Madillc1f8b162013-10-07 10:46:38 -04002111 {
2112 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2113 return gl::error(GL_INVALID_OPERATION);
2114 }
2115
2116 // Cube completeness check
2117 if (target == GL_TEXTURE_CUBE_MAP)
2118 {
2119 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2120 if (!textureCube->isCubeComplete())
2121 {
2122 return gl::error(GL_INVALID_OPERATION);
2123 }
2124 }
2125
Geoff Langae4852a2013-06-05 15:00:34 -04002126 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002127 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002128 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002129 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002132 }
2133}
2134
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002135void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2136{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002137 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002138
2139 try
2140 {
2141 if (n < 0)
2142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002143 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002144 }
2145
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002146 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002147
2148 if (context)
2149 {
2150 for (int i = 0; i < n; i++)
2151 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002152 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002153 }
2154 }
2155 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002156 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002158 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002159 }
2160}
2161
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002162void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2163{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002164 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002165
2166 try
2167 {
2168 if (n < 0)
2169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002170 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002171 }
2172
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002173 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002174
2175 if (context)
2176 {
2177 for (int i = 0; i < n; i++)
2178 {
2179 framebuffers[i] = context->createFramebuffer();
2180 }
2181 }
2182 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002183 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002185 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002186 }
2187}
2188
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002189void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2190{
2191 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2192
2193 try
2194 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002195 gl::Context *context = gl::getNonLostContext();
2196
2197 if (context)
2198 {
Geoff Lang37dde692014-01-31 16:34:54 -05002199 if (n < 0)
2200 {
2201 return gl::error(GL_INVALID_VALUE);
2202 }
2203
2204 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002205 {
2206 ids[i] = context->createQuery();
2207 }
2208 }
2209 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002210 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002212 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002213 }
2214}
2215
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002216void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2217{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002218 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002219
2220 try
2221 {
2222 if (n < 0)
2223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002224 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002225 }
2226
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002227 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002228
2229 if (context)
2230 {
2231 for (int i = 0; i < n; i++)
2232 {
2233 renderbuffers[i] = context->createRenderbuffer();
2234 }
2235 }
2236 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002237 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002239 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002240 }
2241}
2242
2243void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2244{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002245 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002246
2247 try
2248 {
2249 if (n < 0)
2250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002251 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002252 }
2253
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002254 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002255
2256 if (context)
2257 {
2258 for (int i = 0; i < n; i++)
2259 {
2260 textures[i] = context->createTexture();
2261 }
2262 }
2263 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002264 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002266 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002267 }
2268}
2269
daniel@transgaming.com85423182010-04-22 13:35:27 +00002270void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002271{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002272 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002273 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274 program, index, bufsize, length, size, type, name);
2275
2276 try
2277 {
2278 if (bufsize < 0)
2279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002280 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002281 }
2282
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002283 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002284
2285 if (context)
2286 {
2287 gl::Program *programObject = context->getProgram(program);
2288
2289 if (!programObject)
2290 {
2291 if (context->getShader(program))
2292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002293 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002294 }
2295 else
2296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002297 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002298 }
2299 }
2300
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002301 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002304 }
2305
2306 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2307 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002308 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002309 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002311 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002312 }
2313}
2314
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002315void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002316{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002317 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002318 "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 +00002319 program, index, bufsize, length, size, type, name);
2320
2321 try
2322 {
2323 if (bufsize < 0)
2324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002325 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002326 }
2327
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002328 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002329
2330 if (context)
2331 {
2332 gl::Program *programObject = context->getProgram(program);
2333
2334 if (!programObject)
2335 {
2336 if (context->getShader(program))
2337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002338 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002339 }
2340 else
2341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002342 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002343 }
2344 }
2345
2346 if (index >= (GLuint)programObject->getActiveUniformCount())
2347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002348 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002349 }
2350
2351 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2352 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002353 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002354 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002357 }
2358}
2359
2360void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2361{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002362 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 +00002363 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002364
2365 try
2366 {
2367 if (maxcount < 0)
2368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002369 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002370 }
2371
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002372 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002373
2374 if (context)
2375 {
2376 gl::Program *programObject = context->getProgram(program);
2377
2378 if (!programObject)
2379 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002380 if (context->getShader(program))
2381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002382 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002383 }
2384 else
2385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002386 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002387 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002388 }
2389
2390 return programObject->getAttachedShaders(maxcount, count, shaders);
2391 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002392 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002393 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002396 }
2397}
2398
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002399int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002401 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002402
2403 try
2404 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002405 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002406
2407 if (context)
2408 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002409
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002410 gl::Program *programObject = context->getProgram(program);
2411
2412 if (!programObject)
2413 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002414 if (context->getShader(program))
2415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002416 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002417 }
2418 else
2419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002420 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002421 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002422 }
2423
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002424 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002425 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002427 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002428 }
2429
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002430 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002431 }
2432 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002433 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002435 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002436 }
2437
2438 return -1;
2439}
2440
2441void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2442{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002443 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002444
2445 try
2446 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002447 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002448
2449 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002450 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002451 GLenum nativeType;
2452 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002453 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2454 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002455 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002456 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002457
2458 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002459 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002460 context->getBooleanv(pname, params);
2461 }
Jamie Madill55856b12014-01-02 13:59:50 -05002462 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002463 {
Jamie Madill55856b12014-01-02 13:59:50 -05002464 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002465 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002466 }
2467 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002468 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002470 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002471 }
2472}
2473
2474void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2475{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002476 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 +00002477
2478 try
2479 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002480 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002481
2482 if (context)
2483 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002484 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002485 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002486 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002487 }
2488
Jamie Madill70656a62014-03-05 15:01:26 -05002489 if (!gl::ValidBufferParameter(context, pname))
2490 {
2491 return gl::error(GL_INVALID_ENUM);
2492 }
2493
Jamie Madill8c96d582014-03-05 15:01:23 -05002494 gl::Buffer *buffer = context->getTargetBuffer(target);
2495
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002496 if (!buffer)
2497 {
2498 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002500 }
2501
2502 switch (pname)
2503 {
2504 case GL_BUFFER_USAGE:
Jamie Madill70656a62014-03-05 15:01:26 -05002505 *params = static_cast<GLint>(buffer->usage());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002506 break;
2507 case GL_BUFFER_SIZE:
Jamie Madill70656a62014-03-05 15:01:26 -05002508 *params = gl::clampCast<GLint>(buffer->size());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002509 break;
Jamie Madill70656a62014-03-05 15:01:26 -05002510 case GL_BUFFER_ACCESS_FLAGS:
2511 *params = buffer->accessFlags();
2512 break;
2513 case GL_BUFFER_MAPPED:
2514 *params = static_cast<GLint>(buffer->mapped());
2515 break;
2516 case GL_BUFFER_MAP_OFFSET:
2517 *params = gl::clampCast<GLint>(buffer->mapOffset());
2518 break;
2519 case GL_BUFFER_MAP_LENGTH:
2520 *params = gl::clampCast<GLint>(buffer->mapLength());
2521 break;
2522 default: UNREACHABLE(); break;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002523 }
2524 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002525 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002526 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002528 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002529 }
2530}
2531
2532GLenum __stdcall glGetError(void)
2533{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002534 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535
2536 gl::Context *context = gl::getContext();
2537
2538 if (context)
2539 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002540 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002541 }
2542
2543 return GL_NO_ERROR;
2544}
2545
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002546void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002548 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002549
2550 try
2551 {
2552
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002553 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002554
2555 if (context)
2556 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002557 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002558
2559 if (fenceObject == NULL)
2560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002561 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002562 }
2563
Jamie Madillfb9a7402013-07-26 11:55:01 -04002564 if (fenceObject->isFence() != GL_TRUE)
2565 {
2566 return gl::error(GL_INVALID_OPERATION);
2567 }
2568
2569 switch (pname)
2570 {
2571 case GL_FENCE_STATUS_NV:
2572 case GL_FENCE_CONDITION_NV:
2573 break;
2574
2575 default: return gl::error(GL_INVALID_ENUM);
2576 }
2577
2578 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002579 }
2580 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002581 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002583 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002584 }
2585}
2586
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002587void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2588{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002589 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002590
2591 try
2592 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002593 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002594
2595 if (context)
2596 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002597 GLenum nativeType;
2598 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002599 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2600 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002601 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002602 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002603
2604 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002605 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002606 context->getFloatv(pname, params);
2607 }
Jamie Madill55856b12014-01-02 13:59:50 -05002608 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002609 {
Jamie Madill55856b12014-01-02 13:59:50 -05002610 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002611 }
2612 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002613 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002614 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002616 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002617 }
2618}
2619
2620void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2621{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002622 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 +00002623 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002624
2625 try
2626 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002628
2629 if (context)
2630 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002631 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002633 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002634 }
2635
Geoff Lang646559f2013-08-15 11:08:15 -04002636 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002637 {
Geoff Lang646559f2013-08-15 11:08:15 -04002638 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2639 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2640 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2641 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2642 break;
2643 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2644 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2645 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2646 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2647 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2648 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2649 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2650 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2651 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2652 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002653 {
Geoff Lang646559f2013-08-15 11:08:15 -04002654 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002655 }
Geoff Lang646559f2013-08-15 11:08:15 -04002656 default:
2657 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002658 }
Geoff Lang646559f2013-08-15 11:08:15 -04002659
2660 // Determine if the attachment is a valid enum
2661 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002662 {
Geoff Lang646559f2013-08-15 11:08:15 -04002663 case GL_BACK:
2664 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002665 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002666 case GL_STENCIL:
2667 case GL_DEPTH_STENCIL_ATTACHMENT:
2668 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002669 {
Geoff Lang646559f2013-08-15 11:08:15 -04002670 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002671 }
Geoff Lang646559f2013-08-15 11:08:15 -04002672 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002673
Geoff Lang646559f2013-08-15 11:08:15 -04002674 case GL_DEPTH_ATTACHMENT:
2675 case GL_STENCIL_ATTACHMENT:
2676 break;
2677
2678 default:
2679 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2680 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2681 {
2682 return gl::error(GL_INVALID_ENUM);
2683 }
2684 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002685 }
2686
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002687 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2688 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002689 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2690
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002691 GLenum attachmentType;
2692 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002693 GLuint attachmentLevel;
2694 GLuint attachmentLayer;
Jamie Madill3c7fa222014-06-05 13:08:51 -04002695 gl::FramebufferAttachment *attachmentObject;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002696
Jamie Madill3c7fa222014-06-05 13:08:51 -04002697 if (framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002698 {
Jamie Madill3c7fa222014-06-05 13:08:51 -04002699 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002700 {
Geoff Lang646559f2013-08-15 11:08:15 -04002701 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002702 }
2703
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002704 switch (attachment)
2705 {
Geoff Lang646559f2013-08-15 11:08:15 -04002706 case GL_BACK:
2707 attachmentType = framebuffer->getColorbufferType(0);
2708 attachmentHandle = framebuffer->getColorbufferHandle(0);
2709 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2710 attachmentLayer = framebuffer->getColorbufferLayer(0);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002711 attachmentObject = framebuffer->getColorbuffer(0);
Geoff Lang646559f2013-08-15 11:08:15 -04002712 break;
2713 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002714 attachmentType = framebuffer->getDepthbufferType();
2715 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002716 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2717 attachmentLayer = framebuffer->getDepthbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002718 attachmentObject = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002719 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002720 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002721 attachmentType = framebuffer->getStencilbufferType();
2722 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002723 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2724 attachmentLayer = framebuffer->getStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002725 attachmentObject = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002726 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002727 default:
2728 return gl::error(GL_INVALID_OPERATION);
2729 }
2730 }
2731 else
2732 {
2733 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2734 {
2735 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2736 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2737 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2738 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2739 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002740 attachmentObject = framebuffer->getColorbuffer(colorAttachment);
Geoff Lang646559f2013-08-15 11:08:15 -04002741 }
2742 else
2743 {
2744 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002745 {
Geoff Lang646559f2013-08-15 11:08:15 -04002746 case GL_DEPTH_ATTACHMENT:
2747 attachmentType = framebuffer->getDepthbufferType();
2748 attachmentHandle = framebuffer->getDepthbufferHandle();
2749 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2750 attachmentLayer = framebuffer->getDepthbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002751 attachmentObject = framebuffer->getDepthbuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002752 break;
2753 case GL_STENCIL_ATTACHMENT:
2754 attachmentType = framebuffer->getStencilbufferType();
2755 attachmentHandle = framebuffer->getStencilbufferHandle();
2756 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2757 attachmentLayer = framebuffer->getStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002758 attachmentObject = framebuffer->getStencilbuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002759 break;
2760 case GL_DEPTH_STENCIL_ATTACHMENT:
2761 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2762 {
2763 return gl::error(GL_INVALID_OPERATION);
2764 }
2765 attachmentType = framebuffer->getDepthStencilbufferType();
2766 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2767 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2768 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002769 attachmentObject = framebuffer->getDepthStencilBuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002770 break;
2771 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002772 return gl::error(GL_INVALID_OPERATION);
2773 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002774 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002775 }
2776
2777 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002778 if (framebufferHandle == 0)
2779 {
2780 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2781 }
2782 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002783 {
2784 attachmentObjectType = attachmentType;
2785 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002786 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002787 {
2788 attachmentObjectType = GL_TEXTURE;
2789 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002790 else
2791 {
2792 UNREACHABLE();
2793 return;
2794 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002795
Geoff Lang646559f2013-08-15 11:08:15 -04002796 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002797 {
Geoff Lang646559f2013-08-15 11:08:15 -04002798 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2799 // is NONE, then querying any other pname will generate INVALID_ENUM.
2800
2801 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2802 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2803 // INVALID_OPERATION for all other pnames
2804
2805 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002806 {
Geoff Lang646559f2013-08-15 11:08:15 -04002807 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2808 *params = attachmentObjectType;
2809 break;
2810
2811 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2812 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002813 {
Geoff Lang646559f2013-08-15 11:08:15 -04002814 return gl::error(GL_INVALID_ENUM);
2815 }
2816 *params = 0;
2817 break;
2818
2819 default:
2820 if (context->getClientVersion() < 3)
2821 {
2822 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002823 }
2824 else
2825 {
Geoff Lang646559f2013-08-15 11:08:15 -04002826 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002827 }
2828 }
Geoff Lang646559f2013-08-15 11:08:15 -04002829 }
2830 else
2831 {
2832 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2833 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002834 ASSERT(attachmentObject != NULL);
Geoff Lang646559f2013-08-15 11:08:15 -04002835
2836 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002837 {
Geoff Lang646559f2013-08-15 11:08:15 -04002838 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2839 *params = attachmentObjectType;
2840 break;
2841
2842 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2843 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2844 {
2845 return gl::error(GL_INVALID_ENUM);
2846 }
2847 *params = attachmentHandle;
2848 break;
2849
2850 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2851 if (attachmentObjectType != GL_TEXTURE)
2852 {
2853 return gl::error(GL_INVALID_ENUM);
2854 }
2855 *params = attachmentLevel;
2856 break;
2857
2858 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2859 if (attachmentObjectType != GL_TEXTURE)
2860 {
2861 return gl::error(GL_INVALID_ENUM);
2862 }
2863 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2864 break;
2865
2866 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002867 *params = attachmentObject->getRedSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002868 break;
2869
2870 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002871 *params = attachmentObject->getGreenSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002872 break;
2873
2874 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002875 *params = attachmentObject->getBlueSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002876 break;
2877
2878 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002879 *params = attachmentObject->getAlphaSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002880 break;
2881
2882 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002883 *params = attachmentObject->getDepthSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002884 break;
2885
2886 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002887 *params = attachmentObject->getStencilSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002888 break;
2889
2890 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2891 if (attachment == GL_DEPTH_STENCIL)
2892 {
2893 gl::error(GL_INVALID_OPERATION);
2894 }
Jamie Madill3c7fa222014-06-05 13:08:51 -04002895 *params = attachmentObject->getComponentType();
Geoff Lang646559f2013-08-15 11:08:15 -04002896 break;
2897
2898 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002899 *params = attachmentObject->getColorEncoding();
Geoff Lang646559f2013-08-15 11:08:15 -04002900 break;
2901
2902 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2903 if (attachmentObjectType != GL_TEXTURE)
2904 {
2905 return gl::error(GL_INVALID_ENUM);
2906 }
2907 *params = attachmentLayer;
2908 break;
2909
2910 default:
2911 UNREACHABLE();
2912 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002913 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002914 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002915 }
2916 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002917 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002919 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002920 }
2921}
2922
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002923GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2924{
2925 EVENT("()");
2926
2927 try
2928 {
2929 gl::Context *context = gl::getContext();
2930
2931 if (context)
2932 {
2933 return context->getResetStatus();
2934 }
2935
2936 return GL_NO_ERROR;
2937 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002938 catch (...)
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002939 {
2940 return GL_OUT_OF_MEMORY;
2941 }
2942}
2943
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002944void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2945{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002946 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002947
2948 try
2949 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002950 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002951
2952 if (context)
2953 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002954 GLenum nativeType;
2955 unsigned int numParams = 0;
Jamie Madill79f2f452013-12-19 11:13:02 -05002956
Jamie Madill893ab082014-05-16 16:56:10 -04002957 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2958 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002959 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002960 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002961
2962 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002963 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002964 context->getIntegerv(pname, params);
2965 }
Jamie Madill55856b12014-01-02 13:59:50 -05002966 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002967 {
Jamie Madill55856b12014-01-02 13:59:50 -05002968 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002969 }
2970 }
2971 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002972 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002974 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002975 }
2976}
2977
2978void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2979{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002980 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002981
2982 try
2983 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002984 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002985
2986 if (context)
2987 {
2988 gl::Program *programObject = context->getProgram(program);
2989
2990 if (!programObject)
2991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002992 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002993 }
2994
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002995 if (context->getClientVersion() < 3)
2996 {
2997 switch (pname)
2998 {
2999 case GL_ACTIVE_UNIFORM_BLOCKS:
3000 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003001 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3002 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3003 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003004 return gl::error(GL_INVALID_ENUM);
3005 }
3006 }
3007
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003008 switch (pname)
3009 {
3010 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003011 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003012 return;
3013 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003014 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003015 return;
3016 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003017 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003018 return;
3019 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003020 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003021 return;
3022 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003023 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003024 return;
3025 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003026 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003027 return;
3028 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003029 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003030 return;
3031 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003032 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003033 return;
3034 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003035 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003036 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003037 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003038 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003039 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003040 case GL_ACTIVE_UNIFORM_BLOCKS:
3041 *params = programObject->getActiveUniformBlockCount();
3042 return;
3043 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3044 *params = programObject->getActiveUniformBlockMaxLength();
3045 break;
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003046 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3047 *params = programObject->getTransformFeedbackBufferMode();
3048 break;
3049 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3050 *params = programObject->getTransformFeedbackVaryingCount();
3051 break;
3052 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
3053 *params = programObject->getTransformFeedbackVaryingMaxLength();
3054 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003055 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003056 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003057 }
3058 }
3059 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003060 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003062 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003063 }
3064}
3065
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003066void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003067{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003068 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 +00003069 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003070
3071 try
3072 {
3073 if (bufsize < 0)
3074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003075 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003076 }
3077
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003078 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003079
3080 if (context)
3081 {
3082 gl::Program *programObject = context->getProgram(program);
3083
3084 if (!programObject)
3085 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003086 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003087 }
3088
3089 programObject->getInfoLog(bufsize, length, infolog);
3090 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003091 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003092 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003094 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003095 }
3096}
3097
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003098void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3099{
3100 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3101
3102 try
3103 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003104 gl::Context *context = gl::getNonLostContext();
3105
3106 if (context)
3107 {
Geoff Lang37dde692014-01-31 16:34:54 -05003108 if (!ValidQueryType(context, target))
3109 {
3110 return gl::error(GL_INVALID_ENUM);
3111 }
3112
3113 switch (pname)
3114 {
3115 case GL_CURRENT_QUERY_EXT:
Jamie Madill45c785d2014-05-13 14:09:34 -04003116 params[0] = context->getActiveQueryId(target);
Geoff Lang37dde692014-01-31 16:34:54 -05003117 break;
3118
3119 default:
3120 return gl::error(GL_INVALID_ENUM);
3121 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003122 }
3123 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003124 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003126 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003127 }
3128}
3129
3130void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3131{
3132 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3133
3134 try
3135 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003136 gl::Context *context = gl::getNonLostContext();
3137
3138 if (context)
3139 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003140 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3141
3142 if (!queryObject)
3143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003144 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003145 }
3146
Jamie Madill45c785d2014-05-13 14:09:34 -04003147 if (context->getActiveQueryId(queryObject->getType()) == id)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003149 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003150 }
3151
3152 switch(pname)
3153 {
3154 case GL_QUERY_RESULT_EXT:
3155 params[0] = queryObject->getResult();
3156 break;
3157 case GL_QUERY_RESULT_AVAILABLE_EXT:
3158 params[0] = queryObject->isResultAvailable();
3159 break;
3160 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003161 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003162 }
3163 }
3164 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003165 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003167 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003168 }
3169}
3170
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003171void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3172{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003173 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 +00003174
3175 try
3176 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003177 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003178
3179 if (context)
3180 {
3181 if (target != GL_RENDERBUFFER)
3182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003183 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003184 }
3185
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003186 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003188 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003189 }
3190
Jamie Madill3c7fa222014-06-05 13:08:51 -04003191 gl::FramebufferAttachment *attachment = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003192
3193 switch (pname)
3194 {
Jamie Madill3c7fa222014-06-05 13:08:51 -04003195 case GL_RENDERBUFFER_WIDTH: *params = attachment->getWidth(); break;
3196 case GL_RENDERBUFFER_HEIGHT: *params = attachment->getHeight(); break;
3197 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = attachment->getInternalFormat(); break;
3198 case GL_RENDERBUFFER_RED_SIZE: *params = attachment->getRedSize(); break;
3199 case GL_RENDERBUFFER_GREEN_SIZE: *params = attachment->getGreenSize(); break;
3200 case GL_RENDERBUFFER_BLUE_SIZE: *params = attachment->getBlueSize(); break;
3201 case GL_RENDERBUFFER_ALPHA_SIZE: *params = attachment->getAlphaSize(); break;
3202 case GL_RENDERBUFFER_DEPTH_SIZE: *params = attachment->getDepthSize(); break;
3203 case GL_RENDERBUFFER_STENCIL_SIZE: *params = attachment->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003204 case GL_RENDERBUFFER_SAMPLES_ANGLE:
Geoff Langcec35902014-04-16 10:52:36 -04003205 if (!context->getCaps().extensions.framebufferMultisample)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003206 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003207 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003208 }
Geoff Langcec35902014-04-16 10:52:36 -04003209 *params = attachment->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003210 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003211 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003212 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003213 }
3214 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003215 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003216 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003217 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003218 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003219 }
3220}
3221
3222void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3223{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003224 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003225
3226 try
3227 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003228 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003229
3230 if (context)
3231 {
3232 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003233
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003234 if (!shaderObject)
3235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003236 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003237 }
3238
3239 switch (pname)
3240 {
3241 case GL_SHADER_TYPE:
3242 *params = shaderObject->getType();
3243 return;
3244 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003245 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003246 return;
3247 case GL_COMPILE_STATUS:
3248 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3249 return;
3250 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003251 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003252 return;
3253 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003254 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003255 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003256 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3257 *params = shaderObject->getTranslatedSourceLength();
3258 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003259 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003260 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003261 }
3262 }
3263 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003264 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003266 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003267 }
3268}
3269
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003270void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003271{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003272 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 +00003273 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003274
3275 try
3276 {
3277 if (bufsize < 0)
3278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003279 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003280 }
3281
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003282 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003283
3284 if (context)
3285 {
3286 gl::Shader *shaderObject = context->getShader(shader);
3287
3288 if (!shaderObject)
3289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003290 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003291 }
3292
3293 shaderObject->getInfoLog(bufsize, length, infolog);
3294 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003295 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003296 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003298 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003299 }
3300}
3301
3302void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3303{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003304 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 +00003305 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003306
3307 try
3308 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003309 switch (shadertype)
3310 {
3311 case GL_VERTEX_SHADER:
3312 case GL_FRAGMENT_SHADER:
3313 break;
3314 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003315 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003316 }
3317
3318 switch (precisiontype)
3319 {
3320 case GL_LOW_FLOAT:
3321 case GL_MEDIUM_FLOAT:
3322 case GL_HIGH_FLOAT:
3323 // Assume IEEE 754 precision
3324 range[0] = 127;
3325 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003326 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003327 break;
3328 case GL_LOW_INT:
3329 case GL_MEDIUM_INT:
3330 case GL_HIGH_INT:
3331 // Some (most) hardware only supports single-precision floating-point numbers,
3332 // which can accurately represent integers up to +/-16777216
3333 range[0] = 24;
3334 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003335 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003336 break;
3337 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003338 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003339 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003340 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003341 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003343 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003344 }
3345}
3346
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003347void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003348{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003349 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 +00003350 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003351
3352 try
3353 {
3354 if (bufsize < 0)
3355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003356 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003357 }
3358
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003359 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003360
3361 if (context)
3362 {
3363 gl::Shader *shaderObject = context->getShader(shader);
3364
3365 if (!shaderObject)
3366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003367 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003368 }
3369
3370 shaderObject->getSource(bufsize, length, source);
3371 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003372 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003373 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003375 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003376 }
3377}
3378
zmo@google.coma574f782011-10-03 21:45:23 +00003379void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3380{
3381 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3382 shader, bufsize, length, source);
3383
3384 try
3385 {
3386 if (bufsize < 0)
3387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003388 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003389 }
3390
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003391 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003392
3393 if (context)
3394 {
3395 gl::Shader *shaderObject = context->getShader(shader);
3396
3397 if (!shaderObject)
3398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003399 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003400 }
3401
3402 shaderObject->getTranslatedSource(bufsize, length, source);
3403 }
3404 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003405 catch (...)
zmo@google.coma574f782011-10-03 21:45:23 +00003406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003407 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003408 }
3409}
3410
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003411const GLubyte* __stdcall glGetString(GLenum name)
3412{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003413 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003414
3415 try
3416 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003417 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003418
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003419 switch (name)
3420 {
3421 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003422 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003423 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003424 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003425 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003426 if (context->getClientVersion() == 2)
3427 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003428 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003429 }
3430 else
3431 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003432 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003433 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003434 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003435 if (context->getClientVersion() == 2)
3436 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003437 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003438 }
3439 else
3440 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003441 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003442 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003443 case GL_EXTENSIONS:
Geoff Langcec35902014-04-16 10:52:36 -04003444 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003445 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003446 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003447 }
3448 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003449 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003450 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003451 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003452 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003453}
3454
3455void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3456{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003457 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 +00003458
3459 try
3460 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003461 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003462
3463 if (context)
3464 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003465 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003466
Jamie Madillfb8a8302013-07-03 14:24:12 -04003467 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003469 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003470 }
3471
3472 switch (pname)
3473 {
3474 case GL_TEXTURE_MAG_FILTER:
3475 *params = (GLfloat)texture->getMagFilter();
3476 break;
3477 case GL_TEXTURE_MIN_FILTER:
3478 *params = (GLfloat)texture->getMinFilter();
3479 break;
3480 case GL_TEXTURE_WRAP_S:
3481 *params = (GLfloat)texture->getWrapS();
3482 break;
3483 case GL_TEXTURE_WRAP_T:
3484 *params = (GLfloat)texture->getWrapT();
3485 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003486 case GL_TEXTURE_WRAP_R:
3487 if (context->getClientVersion() < 3)
3488 {
3489 return gl::error(GL_INVALID_ENUM);
3490 }
3491 *params = (GLfloat)texture->getWrapR();
3492 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003493 case GL_TEXTURE_IMMUTABLE_FORMAT:
3494 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003495 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3496 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003497 case GL_TEXTURE_IMMUTABLE_LEVELS:
3498 if (context->getClientVersion() < 3)
3499 {
3500 return gl::error(GL_INVALID_ENUM);
3501 }
Jamie Madill51a94372013-10-24 17:49:43 -04003502 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003503 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003504 case GL_TEXTURE_USAGE_ANGLE:
3505 *params = (GLfloat)texture->getUsage();
3506 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003507 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langcec35902014-04-16 10:52:36 -04003508 if (!context->getCaps().extensions.textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003510 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003511 }
3512 *params = (GLfloat)texture->getMaxAnisotropy();
3513 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003514 case GL_TEXTURE_SWIZZLE_R:
3515 if (context->getClientVersion() < 3)
3516 {
3517 return gl::error(GL_INVALID_ENUM);
3518 }
3519 *params = (GLfloat)texture->getSwizzleRed();
3520 break;
3521 case GL_TEXTURE_SWIZZLE_G:
3522 if (context->getClientVersion() < 3)
3523 {
3524 return gl::error(GL_INVALID_ENUM);
3525 }
3526 *params = (GLfloat)texture->getSwizzleGreen();
3527 break;
3528 case GL_TEXTURE_SWIZZLE_B:
3529 if (context->getClientVersion() < 3)
3530 {
3531 return gl::error(GL_INVALID_ENUM);
3532 }
3533 *params = (GLfloat)texture->getSwizzleBlue();
3534 break;
3535 case GL_TEXTURE_SWIZZLE_A:
3536 if (context->getClientVersion() < 3)
3537 {
3538 return gl::error(GL_INVALID_ENUM);
3539 }
3540 *params = (GLfloat)texture->getSwizzleAlpha();
3541 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003542 case GL_TEXTURE_BASE_LEVEL:
3543 if (context->getClientVersion() < 3)
3544 {
3545 return gl::error(GL_INVALID_ENUM);
3546 }
3547 *params = (GLfloat)texture->getBaseLevel();
3548 break;
3549 case GL_TEXTURE_MAX_LEVEL:
3550 if (context->getClientVersion() < 3)
3551 {
3552 return gl::error(GL_INVALID_ENUM);
3553 }
3554 *params = (GLfloat)texture->getMaxLevel();
3555 break;
3556 case GL_TEXTURE_MIN_LOD:
3557 if (context->getClientVersion() < 3)
3558 {
3559 return gl::error(GL_INVALID_ENUM);
3560 }
3561 *params = texture->getMinLod();
3562 break;
3563 case GL_TEXTURE_MAX_LOD:
3564 if (context->getClientVersion() < 3)
3565 {
3566 return gl::error(GL_INVALID_ENUM);
3567 }
3568 *params = texture->getMaxLod();
3569 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003570 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003571 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003572 }
3573 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003574 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003575 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003577 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003578 }
3579}
3580
3581void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3582{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003583 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 +00003584
3585 try
3586 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003587 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003588
3589 if (context)
3590 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003591 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003592
Jamie Madillfb8a8302013-07-03 14:24:12 -04003593 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003595 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003596 }
3597
3598 switch (pname)
3599 {
3600 case GL_TEXTURE_MAG_FILTER:
3601 *params = texture->getMagFilter();
3602 break;
3603 case GL_TEXTURE_MIN_FILTER:
3604 *params = texture->getMinFilter();
3605 break;
3606 case GL_TEXTURE_WRAP_S:
3607 *params = texture->getWrapS();
3608 break;
3609 case GL_TEXTURE_WRAP_T:
3610 *params = texture->getWrapT();
3611 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003612 case GL_TEXTURE_WRAP_R:
3613 if (context->getClientVersion() < 3)
3614 {
3615 return gl::error(GL_INVALID_ENUM);
3616 }
3617 *params = texture->getWrapR();
3618 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003619 case GL_TEXTURE_IMMUTABLE_FORMAT:
3620 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003621 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3622 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003623 case GL_TEXTURE_IMMUTABLE_LEVELS:
3624 if (context->getClientVersion() < 3)
3625 {
3626 return gl::error(GL_INVALID_ENUM);
3627 }
Jamie Madill51a94372013-10-24 17:49:43 -04003628 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003629 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003630 case GL_TEXTURE_USAGE_ANGLE:
3631 *params = texture->getUsage();
3632 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003633 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langcec35902014-04-16 10:52:36 -04003634 if (!context->getCaps().extensions.textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003636 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003637 }
3638 *params = (GLint)texture->getMaxAnisotropy();
3639 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003640 case GL_TEXTURE_SWIZZLE_R:
3641 if (context->getClientVersion() < 3)
3642 {
3643 return gl::error(GL_INVALID_ENUM);
3644 }
3645 *params = texture->getSwizzleRed();
3646 break;
3647 case GL_TEXTURE_SWIZZLE_G:
3648 if (context->getClientVersion() < 3)
3649 {
3650 return gl::error(GL_INVALID_ENUM);
3651 }
3652 *params = texture->getSwizzleGreen();
3653 break;
3654 case GL_TEXTURE_SWIZZLE_B:
3655 if (context->getClientVersion() < 3)
3656 {
3657 return gl::error(GL_INVALID_ENUM);
3658 }
3659 *params = texture->getSwizzleBlue();
3660 break;
3661 case GL_TEXTURE_SWIZZLE_A:
3662 if (context->getClientVersion() < 3)
3663 {
3664 return gl::error(GL_INVALID_ENUM);
3665 }
3666 *params = texture->getSwizzleAlpha();
3667 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003668 case GL_TEXTURE_BASE_LEVEL:
3669 if (context->getClientVersion() < 3)
3670 {
3671 return gl::error(GL_INVALID_ENUM);
3672 }
3673 *params = texture->getBaseLevel();
3674 break;
3675 case GL_TEXTURE_MAX_LEVEL:
3676 if (context->getClientVersion() < 3)
3677 {
3678 return gl::error(GL_INVALID_ENUM);
3679 }
3680 *params = texture->getMaxLevel();
3681 break;
3682 case GL_TEXTURE_MIN_LOD:
3683 if (context->getClientVersion() < 3)
3684 {
3685 return gl::error(GL_INVALID_ENUM);
3686 }
3687 *params = (GLint)texture->getMinLod();
3688 break;
3689 case GL_TEXTURE_MAX_LOD:
3690 if (context->getClientVersion() < 3)
3691 {
3692 return gl::error(GL_INVALID_ENUM);
3693 }
3694 *params = (GLint)texture->getMaxLod();
3695 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003696 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003697 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003698 }
3699 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003700 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003701 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003703 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003704 }
3705}
3706
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003707void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3708{
3709 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3710 program, location, bufSize, params);
3711
3712 try
3713 {
3714 if (bufSize < 0)
3715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003716 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003717 }
3718
3719 gl::Context *context = gl::getNonLostContext();
3720
3721 if (context)
3722 {
3723 if (program == 0)
3724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003725 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003726 }
3727
3728 gl::Program *programObject = context->getProgram(program);
3729
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003730 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003732 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003733 }
3734
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003735 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3736 if (!programBinary)
3737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003738 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003739 }
3740
3741 if (!programBinary->getUniformfv(location, &bufSize, params))
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 }
3746 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003747 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003749 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003750 }
3751}
3752
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003753void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3754{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003755 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003756
3757 try
3758 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003759 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003760
3761 if (context)
3762 {
3763 if (program == 0)
3764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003765 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003766 }
3767
3768 gl::Program *programObject = context->getProgram(program);
3769
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003770 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003772 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003773 }
3774
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003775 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3776 if (!programBinary)
3777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003778 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003779 }
3780
3781 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003783 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003784 }
3785 }
3786 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003787 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003789 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003790 }
3791}
3792
3793void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3794{
3795 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3796 program, location, bufSize, params);
3797
3798 try
3799 {
3800 if (bufSize < 0)
3801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003802 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003803 }
3804
3805 gl::Context *context = gl::getNonLostContext();
3806
3807 if (context)
3808 {
3809 if (program == 0)
3810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003811 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003812 }
3813
3814 gl::Program *programObject = context->getProgram(program);
3815
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003816 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003818 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003819 }
3820
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003821 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3822 if (!programBinary)
3823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003824 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003825 }
3826
3827 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003829 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003830 }
3831 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003832 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003833 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003835 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003836 }
3837}
3838
3839void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3840{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003841 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003842
3843 try
3844 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003845 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003846
3847 if (context)
3848 {
3849 if (program == 0)
3850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003851 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003852 }
3853
3854 gl::Program *programObject = context->getProgram(program);
3855
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003856 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003858 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003859 }
3860
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003861 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3862 if (!programBinary)
3863 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003864 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003865 }
3866
3867 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003869 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003870 }
3871 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003872 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003873 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003875 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003876 }
3877}
3878
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003879int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003880{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003881 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003882
3883 try
3884 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003885 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003886
3887 if (strstr(name, "gl_") == name)
3888 {
3889 return -1;
3890 }
3891
3892 if (context)
3893 {
3894 gl::Program *programObject = context->getProgram(program);
3895
3896 if (!programObject)
3897 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003898 if (context->getShader(program))
3899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003900 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003901 }
3902 else
3903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003904 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003905 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003906 }
3907
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003908 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003909 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003911 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003912 }
3913
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003914 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003915 }
3916 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003917 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003919 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003920 }
3921
3922 return -1;
3923}
3924
3925void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3926{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003927 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003928
3929 try
3930 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003931 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003932
daniel@transgaming.come0078962010-04-15 20:45:08 +00003933 if (context)
3934 {
3935 if (index >= gl::MAX_VERTEX_ATTRIBS)
3936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003937 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003938 }
3939
daniel@transgaming.com83921382011-01-08 05:46:00 +00003940 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003941
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003942 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003943 {
Jamie Madillaff71502013-07-02 11:57:05 -04003944 return;
3945 }
3946
3947 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3948 {
3949 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3950 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003951 {
Jamie Madillaff71502013-07-02 11:57:05 -04003952 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003953 }
Jamie Madillaff71502013-07-02 11:57:05 -04003954 }
3955 else
3956 {
3957 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003958 }
3959 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003960 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003961 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003963 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003964 }
3965}
3966
3967void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3968{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003969 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003970
3971 try
3972 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003973 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003974
daniel@transgaming.come0078962010-04-15 20:45:08 +00003975 if (context)
3976 {
3977 if (index >= gl::MAX_VERTEX_ATTRIBS)
3978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003979 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003980 }
3981
daniel@transgaming.com83921382011-01-08 05:46:00 +00003982 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003983
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003984 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003985 {
Jamie Madillaff71502013-07-02 11:57:05 -04003986 return;
3987 }
3988
3989 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3990 {
3991 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3992 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003993 {
Jamie Madillaff71502013-07-02 11:57:05 -04003994 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003995 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003996 }
Jamie Madillaff71502013-07-02 11:57:05 -04003997 }
3998 else
3999 {
4000 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004001 }
4002 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004003 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004004 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004006 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004007 }
4008}
4009
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004010void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004011{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004012 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004013
4014 try
4015 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004016 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004017
daniel@transgaming.come0078962010-04-15 20:45:08 +00004018 if (context)
4019 {
4020 if (index >= gl::MAX_VERTEX_ATTRIBS)
4021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004022 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004023 }
4024
4025 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4026 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004027 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004028 }
4029
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004030 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004031 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004032 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004033 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004035 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004036 }
4037}
4038
4039void __stdcall glHint(GLenum target, GLenum mode)
4040{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004041 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004042
4043 try
4044 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004045 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004046 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004047 case GL_FASTEST:
4048 case GL_NICEST:
4049 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004050 break;
4051 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004052 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004053 }
4054
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004055 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004056 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004057 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004058 case GL_GENERATE_MIPMAP_HINT:
4059 if (context) context->setGenerateMipmapHint(mode);
4060 break;
4061 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4062 if (context) context->setFragmentShaderDerivativeHint(mode);
4063 break;
4064 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004065 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004066 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004067 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004068 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004069 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004070 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004071 }
4072}
4073
4074GLboolean __stdcall glIsBuffer(GLuint buffer)
4075{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004076 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004077
4078 try
4079 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004080 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004081
4082 if (context && buffer)
4083 {
4084 gl::Buffer *bufferObject = context->getBuffer(buffer);
4085
4086 if (bufferObject)
4087 {
4088 return GL_TRUE;
4089 }
4090 }
4091 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004092 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004094 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004095 }
4096
4097 return GL_FALSE;
4098}
4099
4100GLboolean __stdcall glIsEnabled(GLenum cap)
4101{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004102 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004103
4104 try
4105 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004106 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004107
4108 if (context)
4109 {
Geoff Lang0550d032014-01-30 11:29:07 -05004110 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004111 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004112 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004113 }
Geoff Lang0550d032014-01-30 11:29:07 -05004114
4115 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004116 }
4117 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004118 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004119 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004120 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004121 }
4122
4123 return false;
4124}
4125
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004126GLboolean __stdcall glIsFenceNV(GLuint fence)
4127{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004128 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004129
4130 try
4131 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004132 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004133
4134 if (context)
4135 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004136 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004137
4138 if (fenceObject == NULL)
4139 {
4140 return GL_FALSE;
4141 }
4142
4143 return fenceObject->isFence();
4144 }
4145 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004146 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004148 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004149 }
4150
4151 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004152}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004153
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004154GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4155{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004156 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004157
4158 try
4159 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004160 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004161
4162 if (context && framebuffer)
4163 {
4164 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4165
4166 if (framebufferObject)
4167 {
4168 return GL_TRUE;
4169 }
4170 }
4171 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004172 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004174 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004175 }
4176
4177 return GL_FALSE;
4178}
4179
4180GLboolean __stdcall glIsProgram(GLuint program)
4181{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004182 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004183
4184 try
4185 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004186 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004187
4188 if (context && program)
4189 {
4190 gl::Program *programObject = context->getProgram(program);
4191
4192 if (programObject)
4193 {
4194 return GL_TRUE;
4195 }
4196 }
4197 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004198 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004199 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004200 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004201 }
4202
4203 return GL_FALSE;
4204}
4205
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004206GLboolean __stdcall glIsQueryEXT(GLuint id)
4207{
4208 EVENT("(GLuint id = %d)", id);
4209
4210 try
4211 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004212 gl::Context *context = gl::getNonLostContext();
4213
4214 if (context)
4215 {
Geoff Lang37dde692014-01-31 16:34:54 -05004216 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004217 }
4218 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004219 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004221 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004222 }
4223
4224 return GL_FALSE;
4225}
4226
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004227GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4228{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004229 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004230
4231 try
4232 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004233 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004234
4235 if (context && renderbuffer)
4236 {
Jamie Madill3c7fa222014-06-05 13:08:51 -04004237 gl::FramebufferAttachment *renderbufferObject = context->getRenderbuffer(renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004238
4239 if (renderbufferObject)
4240 {
4241 return GL_TRUE;
4242 }
4243 }
4244 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004245 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004247 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004248 }
4249
4250 return GL_FALSE;
4251}
4252
4253GLboolean __stdcall glIsShader(GLuint shader)
4254{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004255 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004256
4257 try
4258 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004259 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004260
4261 if (context && shader)
4262 {
4263 gl::Shader *shaderObject = context->getShader(shader);
4264
4265 if (shaderObject)
4266 {
4267 return GL_TRUE;
4268 }
4269 }
4270 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004271 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004273 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004274 }
4275
4276 return GL_FALSE;
4277}
4278
4279GLboolean __stdcall glIsTexture(GLuint texture)
4280{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004281 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004282
4283 try
4284 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004285 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004286
4287 if (context && texture)
4288 {
4289 gl::Texture *textureObject = context->getTexture(texture);
4290
4291 if (textureObject)
4292 {
4293 return GL_TRUE;
4294 }
4295 }
4296 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004297 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004299 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004300 }
4301
4302 return GL_FALSE;
4303}
4304
4305void __stdcall glLineWidth(GLfloat width)
4306{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004307 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004308
4309 try
4310 {
4311 if (width <= 0.0f)
4312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004313 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004314 }
4315
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004316 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004317
4318 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004319 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004320 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004321 }
4322 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004323 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004325 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004326 }
4327}
4328
4329void __stdcall glLinkProgram(GLuint program)
4330{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004331 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004332
4333 try
4334 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004335 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004336
4337 if (context)
4338 {
4339 gl::Program *programObject = context->getProgram(program);
4340
4341 if (!programObject)
4342 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004343 if (context->getShader(program))
4344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004345 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004346 }
4347 else
4348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004349 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004350 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004351 }
4352
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004353 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004354 }
4355 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004356 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004358 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004359 }
4360}
4361
4362void __stdcall glPixelStorei(GLenum pname, GLint param)
4363{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004364 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004365
4366 try
4367 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004368 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004369
4370 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004371 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004372 switch (pname)
4373 {
4374 case GL_UNPACK_ALIGNMENT:
4375 if (param != 1 && param != 2 && param != 4 && param != 8)
4376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004377 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004378 }
4379
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004380 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004381 break;
4382
4383 case GL_PACK_ALIGNMENT:
4384 if (param != 1 && param != 2 && param != 4 && param != 8)
4385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004386 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004387 }
4388
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004389 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004390 break;
4391
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004392 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4393 context->setPackReverseRowOrder(param != 0);
4394 break;
4395
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004396 case GL_UNPACK_IMAGE_HEIGHT:
4397 case GL_UNPACK_SKIP_IMAGES:
4398 case GL_UNPACK_ROW_LENGTH:
4399 case GL_UNPACK_SKIP_ROWS:
4400 case GL_UNPACK_SKIP_PIXELS:
4401 case GL_PACK_ROW_LENGTH:
4402 case GL_PACK_SKIP_ROWS:
4403 case GL_PACK_SKIP_PIXELS:
4404 if (context->getClientVersion() < 3)
4405 {
4406 return gl::error(GL_INVALID_ENUM);
4407 }
4408 UNIMPLEMENTED();
4409 break;
4410
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004411 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004412 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004413 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004414 }
4415 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004416 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004417 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004418 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004419 }
4420}
4421
4422void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4423{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004424 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004425
4426 try
4427 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004428 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004429
4430 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004431 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004432 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004433 }
4434 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004435 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004437 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004438 }
4439}
4440
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004441void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4442 GLenum format, GLenum type, GLsizei bufSize,
4443 GLvoid *data)
4444{
4445 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4446 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4447 x, y, width, height, format, type, bufSize, data);
4448
4449 try
4450 {
4451 if (width < 0 || height < 0 || bufSize < 0)
4452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004453 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004454 }
4455
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004456 gl::Context *context = gl::getNonLostContext();
4457
4458 if (context)
4459 {
Jamie Madill26e91952014-03-05 15:01:27 -05004460 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4461 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004462 {
Jamie Madill26e91952014-03-05 15:01:27 -05004463 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004464 }
4465
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004466 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4467 }
4468 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004469 catch (...)
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004471 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004472 }
4473}
4474
4475void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4476 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004477{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004478 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004479 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004480 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004481
4482 try
4483 {
4484 if (width < 0 || height < 0)
4485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004486 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004487 }
4488
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004489 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004490
4491 if (context)
4492 {
Jamie Madill26e91952014-03-05 15:01:27 -05004493 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4494 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004495 {
Jamie Madill26e91952014-03-05 15:01:27 -05004496 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004497 }
4498
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004499 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004500 }
4501 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004502 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004503 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004504 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004505 }
4506}
4507
4508void __stdcall glReleaseShaderCompiler(void)
4509{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004510 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004511
4512 try
4513 {
4514 gl::Shader::releaseCompiler();
4515 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004516 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004518 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004519 }
4520}
4521
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004522void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004523{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004524 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 +00004525 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004526
4527 try
4528 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004529 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004530
4531 if (context)
4532 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004533 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004534 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004535 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004536 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004537 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004538
4539 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004540 }
4541 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004542 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004544 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545 }
4546}
4547
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004548void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4549{
4550 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4551}
4552
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004553void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4554{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004555 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004556
4557 try
4558 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004559 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004560
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004561 if (context)
4562 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004563 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004564 }
4565 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004566 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004567 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004568 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004569 }
4570}
4571
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004572void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4573{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004574 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004575
4576 try
4577 {
4578 if (condition != GL_ALL_COMPLETED_NV)
4579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004580 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004581 }
4582
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004583 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004584
4585 if (context)
4586 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004587 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004588
4589 if (fenceObject == NULL)
4590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004591 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004592 }
4593
4594 fenceObject->setFence(condition);
4595 }
4596 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004597 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004599 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004600 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004601}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004602
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004603void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4604{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004605 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 +00004606
4607 try
4608 {
4609 if (width < 0 || height < 0)
4610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004611 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004612 }
4613
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004614 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004615
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004616 if (context)
4617 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004618 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004619 }
4620 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004621 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004623 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004624 }
4625}
4626
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004627void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004628{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004629 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004630 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004631 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004632
4633 try
4634 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004635 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004636 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004637 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004638 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004640 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004641 }
4642}
4643
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004644void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004645{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004646 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 +00004647 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004648
4649 try
4650 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004651 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004653 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004654 }
4655
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004656 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004657
4658 if (context)
4659 {
4660 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004661
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004662 if (!shaderObject)
4663 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004664 if (context->getProgram(shader))
4665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004666 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004667 }
4668 else
4669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004670 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004671 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004672 }
4673
4674 shaderObject->setSource(count, string, length);
4675 }
4676 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004677 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004679 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004680 }
4681}
4682
4683void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4684{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004685 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004686}
4687
4688void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4689{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004690 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 +00004691
4692 try
4693 {
4694 switch (face)
4695 {
4696 case GL_FRONT:
4697 case GL_BACK:
4698 case GL_FRONT_AND_BACK:
4699 break;
4700 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004701 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004702 }
4703
4704 switch (func)
4705 {
4706 case GL_NEVER:
4707 case GL_ALWAYS:
4708 case GL_LESS:
4709 case GL_LEQUAL:
4710 case GL_EQUAL:
4711 case GL_GEQUAL:
4712 case GL_GREATER:
4713 case GL_NOTEQUAL:
4714 break;
4715 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004716 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004717 }
4718
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004719 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004720
4721 if (context)
4722 {
4723 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4724 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004725 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004726 }
4727
4728 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4729 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004730 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004731 }
4732 }
4733 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004734 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004736 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004737 }
4738}
4739
4740void __stdcall glStencilMask(GLuint mask)
4741{
4742 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4743}
4744
4745void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4746{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004747 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004748
4749 try
4750 {
4751 switch (face)
4752 {
4753 case GL_FRONT:
4754 case GL_BACK:
4755 case GL_FRONT_AND_BACK:
4756 break;
4757 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004758 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004759 }
4760
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004761 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004762
4763 if (context)
4764 {
4765 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4766 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004767 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004768 }
4769
4770 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4771 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004772 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004773 }
4774 }
4775 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004776 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004778 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004779 }
4780}
4781
4782void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4783{
4784 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4785}
4786
4787void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4788{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004789 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 +00004790 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004791
4792 try
4793 {
4794 switch (face)
4795 {
4796 case GL_FRONT:
4797 case GL_BACK:
4798 case GL_FRONT_AND_BACK:
4799 break;
4800 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004801 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004802 }
4803
4804 switch (fail)
4805 {
4806 case GL_ZERO:
4807 case GL_KEEP:
4808 case GL_REPLACE:
4809 case GL_INCR:
4810 case GL_DECR:
4811 case GL_INVERT:
4812 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004813 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004814 break;
4815 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004816 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004817 }
4818
4819 switch (zfail)
4820 {
4821 case GL_ZERO:
4822 case GL_KEEP:
4823 case GL_REPLACE:
4824 case GL_INCR:
4825 case GL_DECR:
4826 case GL_INVERT:
4827 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004828 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004829 break;
4830 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004831 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004832 }
4833
4834 switch (zpass)
4835 {
4836 case GL_ZERO:
4837 case GL_KEEP:
4838 case GL_REPLACE:
4839 case GL_INCR:
4840 case GL_DECR:
4841 case GL_INVERT:
4842 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004843 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004844 break;
4845 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004846 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004847 }
4848
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004849 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004850
4851 if (context)
4852 {
4853 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4854 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004855 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004856 }
4857
4858 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4859 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004860 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004861 }
4862 }
4863 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004864 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004866 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004867 }
4868}
4869
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004870GLboolean __stdcall glTestFenceNV(GLuint fence)
4871{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004872 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004873
4874 try
4875 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004876 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004877
4878 if (context)
4879 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004880 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004881
4882 if (fenceObject == NULL)
4883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004884 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004885 }
4886
Jamie Madillfb9a7402013-07-26 11:55:01 -04004887 if (fenceObject->isFence() != GL_TRUE)
4888 {
4889 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4890 }
4891
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004892 return fenceObject->testFence();
4893 }
4894 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004895 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004896 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004897 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004898 }
4899
4900 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004901}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004902
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004903void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4904 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004905{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004906 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004907 "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 +00004908 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004909
4910 try
4911 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004912 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004913
4914 if (context)
4915 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004916 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004917 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004918 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004919 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004920 return;
4921 }
4922
4923 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004924 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004925 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004926 {
4927 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004928 }
4929
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004930 switch (target)
4931 {
4932 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004933 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004934 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004935 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004936 }
4937 break;
4938 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004939 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004940 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004941 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004942 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004943 break;
4944 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4945 {
4946 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004947 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004948 }
4949 break;
4950 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4951 {
4952 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004953 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004954 }
4955 break;
4956 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4957 {
4958 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004959 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004960 }
4961 break;
4962 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4963 {
4964 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004965 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004966 }
4967 break;
4968 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4969 {
4970 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004971 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004972 }
4973 break;
4974 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004975 }
4976 }
4977 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004978 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004980 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004981 }
4982}
4983
4984void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4985{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004986 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4987
4988 try
4989 {
4990 gl::Context *context = gl::getNonLostContext();
4991
4992 if (context)
4993 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004994 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004995 {
4996 return;
4997 }
4998
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004999 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005000
Jamie Madillfb8a8302013-07-03 14:24:12 -04005001 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005003 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005004 }
5005
5006 switch (pname)
5007 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005008 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5009 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5010 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5011 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5012 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5013 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
Geoff Langcec35902014-04-16 10:52:36 -04005014 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(param, context->getCaps().extensions.maxTextureAnisotropy); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005015 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5016 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005017 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
5018 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
5019 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
5020 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005021 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(gl::iround<GLint>(param)); break;
5022 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(gl::iround<GLint>(param)); break;
5023 case GL_TEXTURE_MIN_LOD: texture->setMinLod(param); break;
5024 case GL_TEXTURE_MAX_LOD: texture->setMaxLod(param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005025 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005026 }
5027 }
5028 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005029 catch (...)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005031 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005032 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005033}
5034
5035void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5036{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005037 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005038}
5039
5040void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5041{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005042 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005043
5044 try
5045 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005046 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005047
5048 if (context)
5049 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005050 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005051 {
5052 return;
5053 }
5054
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005055 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005056
Jamie Madillfb8a8302013-07-03 14:24:12 -04005057 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005059 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005060 }
5061
5062 switch (pname)
5063 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005064 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5065 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5066 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5067 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5068 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5069 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
Geoff Langcec35902014-04-16 10:52:36 -04005070 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getCaps().extensions.maxTextureAnisotropy); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005071 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5072 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005073 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5074 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5075 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5076 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005077 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(param); break;
5078 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(param); break;
5079 case GL_TEXTURE_MIN_LOD: texture->setMinLod((GLfloat)param); break;
5080 case GL_TEXTURE_MAX_LOD: texture->setMaxLod((GLfloat)param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005081 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005082 }
5083 }
5084 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005085 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005087 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005088 }
5089}
5090
5091void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5092{
5093 glTexParameteri(target, pname, *params);
5094}
5095
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005096void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5097{
5098 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5099 target, levels, internalformat, width, height);
5100
5101 try
5102 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005103 gl::Context *context = gl::getNonLostContext();
5104
5105 if (context)
5106 {
Geoff Langcec35902014-04-16 10:52:36 -04005107 if (!context->getCaps().extensions.textureStorage)
5108 {
5109 return gl::error(GL_INVALID_OPERATION);
5110 }
5111
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005112 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005113 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005114 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005115 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005116 }
5117
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005118 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005119 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005120 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005121 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005122 }
5123
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005124 switch (target)
5125 {
5126 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005127 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005128 gl::Texture2D *texture2d = context->getTexture2D();
5129 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005130 }
5131 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005132
Geoff Lang01c21d22013-09-24 11:52:16 -04005133 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005134 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005135 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5136 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005137 }
5138 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005139
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005140 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005141 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005142 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005143 }
5144 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005145 catch (...)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005147 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005148 }
5149}
5150
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005151void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5152 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005153{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005154 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005155 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005156 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005157 target, level, xoffset, yoffset, width, height, format, type, pixels);
5158
5159 try
5160 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005161 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005162
5163 if (context)
5164 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005165 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005166 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005167 xoffset, yoffset, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005168 {
5169 return;
5170 }
5171
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005172 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005173 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005174 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005175 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005176 return;
5177 }
5178
Geoff Langc41e42d2014-04-28 10:58:16 -04005179 // Zero sized uploads are valid but no-ops
5180 if (width == 0 || height == 0)
5181 {
5182 return;
5183 }
5184
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005185 switch (target)
5186 {
5187 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005188 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005189 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005190 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005191 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005192 break;
5193
5194 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5195 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5196 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5197 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5198 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5199 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005200 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005201 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005202 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005203 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005204 break;
5205
5206 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005207 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005208 }
5209 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005210 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005211 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005213 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005214 }
5215}
5216
5217void __stdcall glUniform1f(GLint location, GLfloat x)
5218{
5219 glUniform1fv(location, 1, &x);
5220}
5221
5222void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5223{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005224 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005225
5226 try
5227 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005228 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005229
5230 if (context)
5231 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005232 if (!ValidateUniform(context, GL_FLOAT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005233 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005234 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005235 }
5236
Jamie Madillaa981bd2014-05-20 10:55:55 -04005237 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005238 programBinary->setUniform1fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005239 }
5240 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005241 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005243 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005244 }
5245}
5246
5247void __stdcall glUniform1i(GLint location, GLint x)
5248{
5249 glUniform1iv(location, 1, &x);
5250}
5251
5252void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5253{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005254 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005255
5256 try
5257 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005258 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005259
5260 if (context)
5261 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005262 if (!ValidateUniform(context, GL_INT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005263 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005264 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005265 }
5266
Jamie Madillaa981bd2014-05-20 10:55:55 -04005267 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005268 programBinary->setUniform1iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005269 }
5270 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005271 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005273 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005274 }
5275}
5276
5277void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5278{
5279 GLfloat xy[2] = {x, y};
5280
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005281 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005282}
5283
5284void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5285{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005286 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005287
5288 try
5289 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005290 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005291
5292 if (context)
5293 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005294 if (!ValidateUniform(context, GL_FLOAT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005295 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005296 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005297 }
5298
Jamie Madillaa981bd2014-05-20 10:55:55 -04005299 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005300 programBinary->setUniform2fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005301 }
5302 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005303 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005305 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005306 }
5307}
5308
5309void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5310{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005311 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005312
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005313 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005314}
5315
5316void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5317{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005318 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005319
5320 try
5321 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005322 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005323
5324 if (context)
5325 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005326 if (!ValidateUniform(context, GL_INT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005327 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005328 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005329 }
5330
Jamie Madillaa981bd2014-05-20 10:55:55 -04005331 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005332 programBinary->setUniform2iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005333 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005334 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005335 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005337 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005338 }
5339}
5340
5341void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5342{
5343 GLfloat xyz[3] = {x, y, z};
5344
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005345 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005346}
5347
5348void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5349{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005350 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005351
5352 try
5353 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005354 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005355
5356 if (context)
5357 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005358 if (!ValidateUniform(context, GL_FLOAT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005359 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005360 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005361 }
5362
Jamie Madillaa981bd2014-05-20 10:55:55 -04005363 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005364 programBinary->setUniform3fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005365 }
5366 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005367 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005369 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005370 }
5371}
5372
5373void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5374{
5375 GLint xyz[3] = {x, y, z};
5376
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005377 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005378}
5379
5380void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5381{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005382 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005383
5384 try
5385 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005386 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005387
5388 if (context)
5389 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005390 if (!ValidateUniform(context, GL_INT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005391 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005392 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005393 }
5394
Jamie Madillaa981bd2014-05-20 10:55:55 -04005395 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005396 programBinary->setUniform3iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005397 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005398 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005399 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005401 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005402 }
5403}
5404
5405void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5406{
5407 GLfloat xyzw[4] = {x, y, z, w};
5408
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005409 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005410}
5411
5412void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5413{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005414 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005415
5416 try
5417 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005418 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005419
5420 if (context)
5421 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005422 if (!ValidateUniform(context, GL_FLOAT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005423 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005424 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005425 }
5426
Jamie Madillaa981bd2014-05-20 10:55:55 -04005427 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005428 programBinary->setUniform4fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005429 }
5430 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005431 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005433 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005434 }
5435}
5436
5437void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5438{
5439 GLint xyzw[4] = {x, y, z, w};
5440
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005441 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005442}
5443
5444void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5445{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005446 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005447
5448 try
5449 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005450 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005451
5452 if (context)
5453 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005454 if (!ValidateUniform(context, GL_INT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005455 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005456 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005457 }
5458
Jamie Madillaa981bd2014-05-20 10:55:55 -04005459 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005460 programBinary->setUniform4iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005461 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005462 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005463 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005465 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005466 }
5467}
5468
5469void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5470{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005471 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005472 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005473
5474 try
5475 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005476 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005477
5478 if (context)
5479 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005480 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005481 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005482 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005483 }
5484
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005485 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005486 programBinary->setUniformMatrix2fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005487 }
5488 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005489 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005491 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005492 }
5493}
5494
5495void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5496{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005497 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005498 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005499
5500 try
5501 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005502 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005503
5504 if (context)
5505 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005506 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005507 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005508 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005509 }
5510
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005511 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005512 programBinary->setUniformMatrix3fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005513 }
5514 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005515 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005517 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005518 }
5519}
5520
5521void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5522{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005523 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005524 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005525
5526 try
5527 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005528 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005529
5530 if (context)
5531 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005532 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005533 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005534 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005535 }
5536
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005537 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005538 programBinary->setUniformMatrix4fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005539 }
5540 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005541 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005543 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005544 }
5545}
5546
5547void __stdcall glUseProgram(GLuint program)
5548{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005549 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005550
5551 try
5552 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005553 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005554
5555 if (context)
5556 {
5557 gl::Program *programObject = context->getProgram(program);
5558
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005559 if (!programObject && program != 0)
5560 {
5561 if (context->getShader(program))
5562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005563 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005564 }
5565 else
5566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005567 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005568 }
5569 }
5570
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005571 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005572 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005573 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005574 }
5575
5576 context->useProgram(program);
5577 }
5578 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005579 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005581 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005582 }
5583}
5584
5585void __stdcall glValidateProgram(GLuint program)
5586{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005587 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005588
5589 try
5590 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005591 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005592
5593 if (context)
5594 {
5595 gl::Program *programObject = context->getProgram(program);
5596
5597 if (!programObject)
5598 {
5599 if (context->getShader(program))
5600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005601 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005602 }
5603 else
5604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005605 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005606 }
5607 }
5608
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005609 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +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 glVertexAttrib1f(GLuint index, GLfloat x)
5619{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005620 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
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] = { x, 0, 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 glVertexAttrib1fv(GLuint index, const GLfloat* values)
5644{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005645 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
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] = { values[0], 0, 0, 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 glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5669{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005670 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
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] = { x, y, 0, 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 glVertexAttrib2fv(GLuint index, const GLfloat* values)
5694{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005695 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
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] = { values[0], values[1], 0, 1 };
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 glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5719{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005720 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 +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 {
5733 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005734 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005735 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005736 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005737 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005740 }
5741}
5742
5743void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5744{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005745 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005746
5747 try
5748 {
5749 if (index >= gl::MAX_VERTEX_ATTRIBS)
5750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005751 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005752 }
5753
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005754 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005755
5756 if (context)
5757 {
5758 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005759 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005760 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005761 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005762 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005763 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005764 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005765 }
5766}
5767
5768void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5769{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005770 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 +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
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005779 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005780
5781 if (context)
5782 {
5783 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005784 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005785 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005786 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005787 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005789 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005790 }
5791}
5792
5793void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5794{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005795 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005796
5797 try
5798 {
5799 if (index >= gl::MAX_VERTEX_ATTRIBS)
5800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005801 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005802 }
5803
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005804 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005805
5806 if (context)
5807 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005808 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005809 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005810 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005811 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005812 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005813 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005814 }
5815}
5816
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005817void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5818{
5819 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5820
5821 try
5822 {
5823 if (index >= gl::MAX_VERTEX_ATTRIBS)
5824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005825 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005826 }
5827
5828 gl::Context *context = gl::getNonLostContext();
5829
5830 if (context)
5831 {
5832 context->setVertexAttribDivisor(index, divisor);
5833 }
5834 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005835 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005837 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005838 }
5839}
5840
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005841void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005842{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005843 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005844 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005845 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005846
5847 try
5848 {
5849 if (index >= gl::MAX_VERTEX_ATTRIBS)
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
5854 if (size < 1 || size > 4)
5855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005856 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005857 }
5858
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005859 gl::Context *context = gl::getNonLostContext();
5860
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005861 switch (type)
5862 {
5863 case GL_BYTE:
5864 case GL_UNSIGNED_BYTE:
5865 case GL_SHORT:
5866 case GL_UNSIGNED_SHORT:
5867 case GL_FIXED:
5868 case GL_FLOAT:
5869 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005870 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005871 case GL_INT:
5872 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005873 case GL_INT_2_10_10_10_REV:
5874 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005875 if (context && context->getClientVersion() < 3)
5876 {
5877 return gl::error(GL_INVALID_ENUM);
5878 }
5879 else
5880 {
5881 break;
5882 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005883 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005884 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005885 }
5886
5887 if (stride < 0)
5888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005889 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005890 }
5891
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005892 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
5893 {
5894 return gl::error(GL_INVALID_OPERATION);
5895 }
5896
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005897 if (context)
5898 {
Jamie Madilld8db8662013-07-02 11:57:04 -04005899 // [OpenGL ES 3.0.2] Section 2.8 page 24:
5900 // An INVALID_OPERATION error is generated when a non-zero vertex array object
5901 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
5902 // and the pointer argument is not NULL.
5903 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
5904 {
5905 return gl::error(GL_INVALID_OPERATION);
5906 }
5907
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00005908 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
5909 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005910 }
5911 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005912 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005914 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005915 }
5916}
5917
5918void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
5919{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005920 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 +00005921
5922 try
5923 {
5924 if (width < 0 || height < 0)
5925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005926 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005927 }
5928
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005929 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005930
5931 if (context)
5932 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005933 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005934 }
5935 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005936 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005938 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005939 }
5940}
5941
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005942// OpenGL ES 3.0 functions
5943
5944void __stdcall glReadBuffer(GLenum mode)
5945{
5946 EVENT("(GLenum mode = 0x%X)", mode);
5947
5948 try
5949 {
5950 gl::Context *context = gl::getNonLostContext();
5951
5952 if (context)
5953 {
5954 if (context->getClientVersion() < 3)
5955 {
5956 return gl::error(GL_INVALID_OPERATION);
5957 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005958
Jamie Madill54133512013-06-21 09:33:07 -04005959 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005960 UNIMPLEMENTED();
5961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005962 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005963 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005964 {
5965 return gl::error(GL_OUT_OF_MEMORY);
5966 }
5967}
5968
5969void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
5970{
5971 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
5972 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
5973
5974 try
5975 {
5976 gl::Context *context = gl::getNonLostContext();
5977
5978 if (context)
5979 {
5980 if (context->getClientVersion() < 3)
5981 {
5982 return gl::error(GL_INVALID_OPERATION);
5983 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005984
Jamie Madill54133512013-06-21 09:33:07 -04005985 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005986 UNIMPLEMENTED();
5987 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005988 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005989 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005990 {
5991 return gl::error(GL_OUT_OF_MEMORY);
5992 }
5993}
5994
5995void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
5996{
5997 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
5998 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
5999 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6000 target, level, internalformat, width, height, depth, border, format, type, pixels);
6001
6002 try
6003 {
6004 gl::Context *context = gl::getNonLostContext();
6005
6006 if (context)
6007 {
6008 if (context->getClientVersion() < 3)
6009 {
6010 return gl::error(GL_INVALID_OPERATION);
6011 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006012
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006013 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006014 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006015 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006016 {
6017 return;
6018 }
6019
6020 switch(target)
6021 {
6022 case GL_TEXTURE_3D:
6023 {
6024 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006025 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006026 }
6027 break;
6028
6029 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006030 {
6031 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006032 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006033 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006034 break;
6035
6036 default:
6037 return gl::error(GL_INVALID_ENUM);
6038 }
6039 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006040 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006041 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006042 {
6043 return gl::error(GL_OUT_OF_MEMORY);
6044 }
6045}
6046
6047void __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)
6048{
6049 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6050 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6051 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6052 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6053
6054 try
6055 {
6056 gl::Context *context = gl::getNonLostContext();
6057
6058 if (context)
6059 {
6060 if (context->getClientVersion() < 3)
6061 {
6062 return gl::error(GL_INVALID_OPERATION);
6063 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006064
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006065 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006066 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006067 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006068 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006069 {
6070 return;
6071 }
6072
Geoff Langc41e42d2014-04-28 10:58:16 -04006073 // Zero sized uploads are valid but no-ops
6074 if (width == 0 || height == 0 || depth == 0)
6075 {
6076 return;
6077 }
6078
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006079 switch(target)
6080 {
6081 case GL_TEXTURE_3D:
6082 {
6083 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006084 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 +00006085 }
6086 break;
6087
6088 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006089 {
6090 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006091 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 +00006092 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006093 break;
6094
6095 default:
6096 return gl::error(GL_INVALID_ENUM);
6097 }
6098 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006099 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006100 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006101 {
6102 return gl::error(GL_OUT_OF_MEMORY);
6103 }
6104}
6105
6106void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6107{
6108 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6109 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6110 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6111
6112 try
6113 {
6114 gl::Context *context = gl::getNonLostContext();
6115
6116 if (context)
6117 {
6118 if (context->getClientVersion() < 3)
6119 {
6120 return gl::error(GL_INVALID_OPERATION);
6121 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006122
Jamie Madill6f38f822014-06-06 17:12:20 -04006123 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006124 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006125 {
6126 return;
6127 }
6128
6129 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6130 gl::Texture *texture = NULL;
6131 switch (target)
6132 {
6133 case GL_TEXTURE_3D:
6134 texture = context->getTexture3D();
6135 break;
6136
6137 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006138 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006139 break;
6140
6141 default:
6142 return gl::error(GL_INVALID_ENUM);
6143 }
6144
6145 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6146 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006147 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006148 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006149 {
6150 return gl::error(GL_OUT_OF_MEMORY);
6151 }
6152}
6153
6154void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6155{
Geoff Langeef52cc2013-10-16 15:07:39 -04006156 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 +00006157 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6158 "const GLvoid* data = 0x%0.8p)",
6159 target, level, internalformat, width, height, depth, border, imageSize, data);
6160
6161 try
6162 {
6163 gl::Context *context = gl::getNonLostContext();
6164
6165 if (context)
6166 {
6167 if (context->getClientVersion() < 3)
6168 {
6169 return gl::error(GL_INVALID_OPERATION);
6170 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006171
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006172 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 +00006173 {
6174 return gl::error(GL_INVALID_VALUE);
6175 }
6176
6177 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006178 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006179 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006180 {
6181 return;
6182 }
6183
6184 switch(target)
6185 {
6186 case GL_TEXTURE_3D:
6187 {
6188 gl::Texture3D *texture = context->getTexture3D();
6189 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6190 }
6191 break;
6192
6193 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006194 {
6195 gl::Texture2DArray *texture = context->getTexture2DArray();
6196 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6197 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006198 break;
6199
6200 default:
6201 return gl::error(GL_INVALID_ENUM);
6202 }
6203 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006204 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006205 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006206 {
6207 return gl::error(GL_OUT_OF_MEMORY);
6208 }
6209}
6210
6211void __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)
6212{
6213 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6214 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6215 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6216 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6217
6218 try
6219 {
6220 gl::Context *context = gl::getNonLostContext();
6221
6222 if (context)
6223 {
6224 if (context->getClientVersion() < 3)
6225 {
6226 return gl::error(GL_INVALID_OPERATION);
6227 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006228
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006229 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 +00006230 {
6231 return gl::error(GL_INVALID_VALUE);
6232 }
6233
6234 if (!data)
6235 {
6236 return gl::error(GL_INVALID_VALUE);
6237 }
6238
6239 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006240 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006241 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006242 {
6243 return;
6244 }
6245
Geoff Langc41e42d2014-04-28 10:58:16 -04006246 // Zero sized uploads are valid but no-ops
6247 if (width == 0 || height == 0)
6248 {
6249 return;
6250 }
6251
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006252 switch(target)
6253 {
6254 case GL_TEXTURE_3D:
6255 {
6256 gl::Texture3D *texture = context->getTexture3D();
6257 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6258 format, imageSize, data);
6259 }
6260 break;
6261
6262 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006263 {
6264 gl::Texture2DArray *texture = context->getTexture2DArray();
6265 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6266 format, imageSize, data);
6267 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006268 break;
6269
6270 default:
6271 return gl::error(GL_INVALID_ENUM);
6272 }
6273 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006274 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006275 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006276 {
6277 return gl::error(GL_OUT_OF_MEMORY);
6278 }
6279}
6280
6281void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6282{
6283 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6284
6285 try
6286 {
6287 gl::Context *context = gl::getNonLostContext();
6288
6289 if (context)
6290 {
6291 if (context->getClientVersion() < 3)
6292 {
6293 return gl::error(GL_INVALID_OPERATION);
6294 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006295
Geoff Lang37dde692014-01-31 16:34:54 -05006296 if (n < 0)
6297 {
6298 return gl::error(GL_INVALID_VALUE);
6299 }
6300
6301 for (GLsizei i = 0; i < n; i++)
6302 {
6303 ids[i] = context->createQuery();
6304 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006305 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006306 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006307 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006308 {
6309 return gl::error(GL_OUT_OF_MEMORY);
6310 }
6311}
6312
6313void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6314{
6315 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6316
6317 try
6318 {
6319 gl::Context *context = gl::getNonLostContext();
6320
6321 if (context)
6322 {
6323 if (context->getClientVersion() < 3)
6324 {
6325 return gl::error(GL_INVALID_OPERATION);
6326 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006327
Geoff Lang37dde692014-01-31 16:34:54 -05006328 if (n < 0)
6329 {
6330 return gl::error(GL_INVALID_VALUE);
6331 }
6332
6333 for (GLsizei i = 0; i < n; i++)
6334 {
6335 context->deleteQuery(ids[i]);
6336 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006337 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006338 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006339 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006340 {
6341 return gl::error(GL_OUT_OF_MEMORY);
6342 }
6343}
6344
6345GLboolean __stdcall glIsQuery(GLuint id)
6346{
6347 EVENT("(GLuint id = %u)", id);
6348
6349 try
6350 {
6351 gl::Context *context = gl::getNonLostContext();
6352
6353 if (context)
6354 {
6355 if (context->getClientVersion() < 3)
6356 {
6357 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6358 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006359
Geoff Lang37dde692014-01-31 16:34:54 -05006360 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006361 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006362 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006363 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006364 {
6365 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6366 }
6367
6368 return GL_FALSE;
6369}
6370
6371void __stdcall glBeginQuery(GLenum target, GLuint id)
6372{
6373 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6374
6375 try
6376 {
6377 gl::Context *context = gl::getNonLostContext();
6378
6379 if (context)
6380 {
6381 if (context->getClientVersion() < 3)
6382 {
6383 return gl::error(GL_INVALID_OPERATION);
6384 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006385
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006386 if (!ValidateBeginQuery(context, target, id))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006387 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006388 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006389 }
Geoff Lang37dde692014-01-31 16:34:54 -05006390 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006391 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006392 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006393 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006394 {
6395 return gl::error(GL_OUT_OF_MEMORY);
6396 }
6397}
6398
6399void __stdcall glEndQuery(GLenum target)
6400{
6401 EVENT("(GLenum target = 0x%X)", target);
6402
6403 try
6404 {
6405 gl::Context *context = gl::getNonLostContext();
6406
6407 if (context)
6408 {
6409 if (context->getClientVersion() < 3)
6410 {
6411 return gl::error(GL_INVALID_OPERATION);
6412 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006413
Jamie Madill45c785d2014-05-13 14:09:34 -04006414 if (!ValidateEndQuery(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006415 {
Jamie Madill45c785d2014-05-13 14:09:34 -04006416 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006417 }
Geoff Lang37dde692014-01-31 16:34:54 -05006418
6419 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006420 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006421 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006422 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006423 {
6424 return gl::error(GL_OUT_OF_MEMORY);
6425 }
6426}
6427
6428void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6429{
6430 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6431
6432 try
6433 {
6434 gl::Context *context = gl::getNonLostContext();
6435
6436 if (context)
6437 {
6438 if (context->getClientVersion() < 3)
6439 {
6440 return gl::error(GL_INVALID_OPERATION);
6441 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006442
Geoff Lang37dde692014-01-31 16:34:54 -05006443 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006444 {
Geoff Lang37dde692014-01-31 16:34:54 -05006445 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006446 }
Geoff Lang37dde692014-01-31 16:34:54 -05006447
6448 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006449 {
Geoff Lang37dde692014-01-31 16:34:54 -05006450 case GL_CURRENT_QUERY:
Jamie Madill45c785d2014-05-13 14:09:34 -04006451 params[0] = static_cast<GLint>(context->getActiveQueryId(target));
Geoff Lang37dde692014-01-31 16:34:54 -05006452 break;
6453
6454 default:
6455 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006456 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006457 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006458 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006459 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006460 {
6461 return gl::error(GL_OUT_OF_MEMORY);
6462 }
6463}
6464
6465void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6466{
6467 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6468
6469 try
6470 {
6471 gl::Context *context = gl::getNonLostContext();
6472
6473 if (context)
6474 {
6475 if (context->getClientVersion() < 3)
6476 {
6477 return gl::error(GL_INVALID_OPERATION);
6478 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006479
Geoff Lang37dde692014-01-31 16:34:54 -05006480 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6481
6482 if (!queryObject)
6483 {
6484 return gl::error(GL_INVALID_OPERATION);
6485 }
6486
Jamie Madill45c785d2014-05-13 14:09:34 -04006487 if (context->getActiveQueryId(queryObject->getType()) == id)
Geoff Lang37dde692014-01-31 16:34:54 -05006488 {
6489 return gl::error(GL_INVALID_OPERATION);
6490 }
6491
6492 switch(pname)
6493 {
6494 case GL_QUERY_RESULT:
6495 params[0] = queryObject->getResult();
6496 break;
6497 case GL_QUERY_RESULT_AVAILABLE:
6498 params[0] = queryObject->isResultAvailable();
6499 break;
6500 default:
6501 return gl::error(GL_INVALID_ENUM);
6502 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006503 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006504 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006505 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006506 {
6507 return gl::error(GL_OUT_OF_MEMORY);
6508 }
6509}
6510
6511GLboolean __stdcall glUnmapBuffer(GLenum target)
6512{
6513 EVENT("(GLenum target = 0x%X)", target);
6514
6515 try
6516 {
6517 gl::Context *context = gl::getNonLostContext();
6518
6519 if (context)
6520 {
6521 if (context->getClientVersion() < 3)
6522 {
6523 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6524 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006525
Shannon Woodsb3801742014-03-27 14:59:19 -04006526 return glUnmapBufferOES(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006527 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006528 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006529 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006530 {
6531 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6532 }
6533
6534 return GL_FALSE;
6535}
6536
6537void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6538{
6539 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6540
6541 try
6542 {
6543 gl::Context *context = gl::getNonLostContext();
6544
6545 if (context)
6546 {
6547 if (context->getClientVersion() < 3)
6548 {
6549 return gl::error(GL_INVALID_OPERATION);
6550 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006551
Shannon Woodsb3801742014-03-27 14:59:19 -04006552 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006553 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006554 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006555 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006556 {
6557 return gl::error(GL_OUT_OF_MEMORY);
6558 }
6559}
6560
6561void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6562{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006563 try
6564 {
6565 gl::Context *context = gl::getNonLostContext();
6566
6567 if (context)
6568 {
6569 if (context->getClientVersion() < 3)
6570 {
6571 return gl::error(GL_INVALID_OPERATION);
6572 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006573
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006574 glDrawBuffersEXT(n, bufs);
6575 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006576 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006577 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006578 {
6579 return gl::error(GL_OUT_OF_MEMORY);
6580 }
6581}
6582
6583void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6584{
6585 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6586 location, count, transpose, value);
6587
6588 try
6589 {
6590 gl::Context *context = gl::getNonLostContext();
6591
6592 if (context)
6593 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006594 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006595 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006596 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006597 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006598
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006599 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006600 programBinary->setUniformMatrix2x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006601 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006602 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006603 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006604 {
6605 return gl::error(GL_OUT_OF_MEMORY);
6606 }
6607}
6608
6609void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6610{
6611 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6612 location, count, transpose, value);
6613
6614 try
6615 {
6616 gl::Context *context = gl::getNonLostContext();
6617
6618 if (context)
6619 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006620 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006621 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006622 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006623 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006624
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006625 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006626 programBinary->setUniformMatrix3x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006627 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006628 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006629 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006630 {
6631 return gl::error(GL_OUT_OF_MEMORY);
6632 }
6633}
6634
6635void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6636{
6637 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6638 location, count, transpose, value);
6639
6640 try
6641 {
6642 gl::Context *context = gl::getNonLostContext();
6643
6644 if (context)
6645 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006646 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006647 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006648 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006649 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006650
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006651 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006652 programBinary->setUniformMatrix2x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006653 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006654 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006655 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006656 {
6657 return gl::error(GL_OUT_OF_MEMORY);
6658 }
6659}
6660
6661void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6662{
6663 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6664 location, count, transpose, value);
6665
6666 try
6667 {
6668 gl::Context *context = gl::getNonLostContext();
6669
6670 if (context)
6671 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006672 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006673 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006674 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006675 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006676
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006677 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006678 programBinary->setUniformMatrix4x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006679 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006680 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006681 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006682 {
6683 return gl::error(GL_OUT_OF_MEMORY);
6684 }
6685}
6686
6687void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6688{
6689 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6690 location, count, transpose, value);
6691
6692 try
6693 {
6694 gl::Context *context = gl::getNonLostContext();
6695
6696 if (context)
6697 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006698 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006699 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006700 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006701 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006702
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006703 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006704 programBinary->setUniformMatrix3x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006705 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006706 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006707 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006708 {
6709 return gl::error(GL_OUT_OF_MEMORY);
6710 }
6711}
6712
6713void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6714{
6715 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6716 location, count, transpose, value);
6717
6718 try
6719 {
6720 gl::Context *context = gl::getNonLostContext();
6721
6722 if (context)
6723 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006724 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006725 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006726 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006727 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006728
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006729 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006730 programBinary->setUniformMatrix4x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006731 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006732 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006733 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006734 {
6735 return gl::error(GL_OUT_OF_MEMORY);
6736 }
6737}
6738
6739void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6740{
6741 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6742 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6743 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6744
6745 try
6746 {
6747 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006748 if (context)
6749 {
6750 if (context->getClientVersion() < 3)
6751 {
6752 return gl::error(GL_INVALID_OPERATION);
6753 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006754
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006755 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006756 dstX0, dstY0, dstX1, dstY1, mask, filter,
6757 false))
6758 {
6759 return;
6760 }
6761
6762 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6763 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006764 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006765 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006766 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006767 {
6768 return gl::error(GL_OUT_OF_MEMORY);
6769 }
6770}
6771
6772void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
6773{
6774 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6775 target, samples, internalformat, width, height);
6776
6777 try
6778 {
6779 gl::Context *context = gl::getNonLostContext();
6780
6781 if (context)
6782 {
6783 if (context->getClientVersion() < 3)
6784 {
6785 return gl::error(GL_INVALID_OPERATION);
6786 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006787
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006788 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04006789 width, height, false))
6790 {
6791 return;
6792 }
6793
6794 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006795 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006796 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006797 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006798 {
6799 return gl::error(GL_OUT_OF_MEMORY);
6800 }
6801}
6802
6803void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
6804{
6805 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
6806 target, attachment, texture, level, layer);
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
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006819 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04006820 {
6821 return;
6822 }
6823
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05006824 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
6825 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04006826
6827 gl::Texture *textureObject = context->getTexture(texture);
6828 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
6829
6830 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
6831 {
6832 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
6833 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
6834 }
6835 else
6836 {
6837 switch (attachment)
6838 {
6839 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
6840 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
6841 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
6842 }
6843 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006844 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006845 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006846 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006847 {
6848 return gl::error(GL_OUT_OF_MEMORY);
6849 }
6850}
6851
6852GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
6853{
6854 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
6855 target, offset, length, access);
6856
6857 try
6858 {
6859 gl::Context *context = gl::getNonLostContext();
6860
6861 if (context)
6862 {
6863 if (context->getClientVersion() < 3)
6864 {
6865 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
6866 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006867
Shannon Woods916e7692014-03-27 16:58:22 -04006868 return glMapBufferRangeEXT(target, offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006869 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006870 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006871 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006872 {
6873 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
6874 }
6875
6876 return NULL;
6877}
6878
6879void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
6880{
6881 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
6882
6883 try
6884 {
6885 gl::Context *context = gl::getNonLostContext();
6886
6887 if (context)
6888 {
6889 if (context->getClientVersion() < 3)
6890 {
6891 return gl::error(GL_INVALID_OPERATION);
6892 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006893
Shannon Woods916e7692014-03-27 16:58:22 -04006894 glFlushMappedBufferRangeEXT(target, offset, length);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006895 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006896 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006897 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006898 {
6899 return gl::error(GL_OUT_OF_MEMORY);
6900 }
6901}
6902
6903void __stdcall glBindVertexArray(GLuint array)
6904{
6905 EVENT("(GLuint array = %u)", array);
6906
6907 try
6908 {
6909 gl::Context *context = gl::getNonLostContext();
6910
6911 if (context)
6912 {
6913 if (context->getClientVersion() < 3)
6914 {
6915 return gl::error(GL_INVALID_OPERATION);
6916 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006917
Jamie Madilld1028542013-07-02 11:57:04 -04006918 gl::VertexArray *vao = context->getVertexArray(array);
6919
6920 if (!vao)
6921 {
6922 // The default VAO should always exist
6923 ASSERT(array != 0);
6924 return gl::error(GL_INVALID_OPERATION);
6925 }
6926
6927 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006928 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006929 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006930 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006931 {
6932 return gl::error(GL_OUT_OF_MEMORY);
6933 }
6934}
6935
6936void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
6937{
6938 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
6939
6940 try
6941 {
6942 gl::Context *context = gl::getNonLostContext();
6943
6944 if (context)
6945 {
6946 if (context->getClientVersion() < 3)
6947 {
6948 return gl::error(GL_INVALID_OPERATION);
6949 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006950
Jamie Madilld1028542013-07-02 11:57:04 -04006951 if (n < 0)
6952 {
6953 return gl::error(GL_INVALID_VALUE);
6954 }
6955
6956 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6957 {
6958 if (arrays[arrayIndex] != 0)
6959 {
6960 context->deleteVertexArray(arrays[arrayIndex]);
6961 }
6962 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006963 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006964 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006965 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006966 {
6967 return gl::error(GL_OUT_OF_MEMORY);
6968 }
6969}
6970
6971void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
6972{
6973 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
6974
6975 try
6976 {
6977 gl::Context *context = gl::getNonLostContext();
6978
6979 if (context)
6980 {
6981 if (context->getClientVersion() < 3)
6982 {
6983 return gl::error(GL_INVALID_OPERATION);
6984 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006985
Jamie Madilld1028542013-07-02 11:57:04 -04006986 if (n < 0)
6987 {
6988 return gl::error(GL_INVALID_VALUE);
6989 }
6990
6991 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6992 {
6993 arrays[arrayIndex] = context->createVertexArray();
6994 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006995 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006996 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006997 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006998 {
6999 return gl::error(GL_OUT_OF_MEMORY);
7000 }
7001}
7002
7003GLboolean __stdcall glIsVertexArray(GLuint array)
7004{
7005 EVENT("(GLuint array = %u)", array);
7006
7007 try
7008 {
7009 gl::Context *context = gl::getNonLostContext();
7010
7011 if (context)
7012 {
7013 if (context->getClientVersion() < 3)
7014 {
7015 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7016 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007017
Jamie Madilld1028542013-07-02 11:57:04 -04007018 if (array == 0)
7019 {
7020 return GL_FALSE;
7021 }
7022
7023 gl::VertexArray *vao = context->getVertexArray(array);
7024
7025 return (vao != NULL ? GL_TRUE : GL_FALSE);
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, GL_FALSE);
7031 }
7032
7033 return GL_FALSE;
7034}
7035
7036void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7037{
7038 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7039 target, index, data);
7040
7041 try
7042 {
7043 gl::Context *context = gl::getNonLostContext();
7044
7045 if (context)
7046 {
7047 if (context->getClientVersion() < 3)
7048 {
7049 return gl::error(GL_INVALID_OPERATION);
7050 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007051
Shannon Woods15934d52013-08-19 14:28:49 -04007052 switch (target)
7053 {
7054 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7055 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7056 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7057 if (index >= context->getMaxTransformFeedbackBufferBindings())
7058 return gl::error(GL_INVALID_VALUE);
7059 break;
7060 case GL_UNIFORM_BUFFER_START:
7061 case GL_UNIFORM_BUFFER_SIZE:
7062 case GL_UNIFORM_BUFFER_BINDING:
7063 if (index >= context->getMaximumCombinedUniformBufferBindings())
7064 return gl::error(GL_INVALID_VALUE);
7065 break;
7066 default:
7067 return gl::error(GL_INVALID_ENUM);
7068 }
7069
7070 if (!(context->getIndexedIntegerv(target, index, data)))
7071 {
7072 GLenum nativeType;
7073 unsigned int numParams = 0;
7074 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7075 return gl::error(GL_INVALID_ENUM);
7076
7077 if (numParams == 0)
7078 return; // it is known that pname is valid, but there are no parameters to return
7079
7080 if (nativeType == GL_INT_64_ANGLEX)
7081 {
7082 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7083 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7084 GLint64 *int64Params = new GLint64[numParams];
7085
7086 context->getIndexedInteger64v(target, index, int64Params);
7087
7088 for (unsigned int i = 0; i < numParams; ++i)
7089 {
7090 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7091 data[i] = static_cast<GLint>(clampedValue);
7092 }
7093
7094 delete [] int64Params;
7095 }
7096 else
7097 {
7098 UNREACHABLE();
7099 }
7100 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007101 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007102 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007103 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007104 {
7105 return gl::error(GL_OUT_OF_MEMORY);
7106 }
7107}
7108
7109void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7110{
7111 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7112
7113 try
7114 {
7115 gl::Context *context = gl::getNonLostContext();
7116
7117 if (context)
7118 {
7119 if (context->getClientVersion() < 3)
7120 {
7121 return gl::error(GL_INVALID_OPERATION);
7122 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007123
Geoff Langc8058452014-02-03 12:04:11 -05007124 switch (primitiveMode)
7125 {
7126 case GL_TRIANGLES:
7127 case GL_LINES:
7128 case GL_POINTS:
7129 break;
7130 default:
7131 return gl::error(GL_INVALID_ENUM);
7132 }
7133
7134 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7135 ASSERT(transformFeedback != NULL);
7136
7137 if (transformFeedback->isStarted())
7138 {
7139 return gl::error(GL_INVALID_OPERATION);
7140 }
7141
7142 if (transformFeedback->isPaused())
7143 {
7144 transformFeedback->resume();
7145 }
7146 else
7147 {
7148 transformFeedback->start(primitiveMode);
7149 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007150 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007151 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007152 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007153 {
7154 return gl::error(GL_OUT_OF_MEMORY);
7155 }
7156}
7157
7158void __stdcall glEndTransformFeedback(void)
7159{
7160 EVENT("(void)");
7161
7162 try
7163 {
7164 gl::Context *context = gl::getNonLostContext();
7165
7166 if (context)
7167 {
7168 if (context->getClientVersion() < 3)
7169 {
7170 return gl::error(GL_INVALID_OPERATION);
7171 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007172
Geoff Langc8058452014-02-03 12:04:11 -05007173 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7174 ASSERT(transformFeedback != NULL);
7175
7176 if (!transformFeedback->isStarted())
7177 {
7178 return gl::error(GL_INVALID_OPERATION);
7179 }
7180
7181 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007182 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007183 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007184 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007185 {
7186 return gl::error(GL_OUT_OF_MEMORY);
7187 }
7188}
7189
7190void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7191{
7192 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7193 target, index, buffer, offset, size);
7194
7195 try
7196 {
7197 gl::Context *context = gl::getNonLostContext();
7198
7199 if (context)
7200 {
7201 if (context->getClientVersion() < 3)
7202 {
7203 return gl::error(GL_INVALID_OPERATION);
7204 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007205
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007206 switch (target)
7207 {
7208 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007209 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007210 {
7211 return gl::error(GL_INVALID_VALUE);
7212 }
7213 break;
7214
7215 case GL_UNIFORM_BUFFER:
7216 if (index >= context->getMaximumCombinedUniformBufferBindings())
7217 {
7218 return gl::error(GL_INVALID_VALUE);
7219 }
7220 break;
7221
7222 default:
7223 return gl::error(GL_INVALID_ENUM);
7224 }
7225
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007226 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007227 {
7228 return gl::error(GL_INVALID_VALUE);
7229 }
7230
7231 switch (target)
7232 {
7233 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007234
7235 // size and offset must be a multiple of 4
7236 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7237 {
7238 return gl::error(GL_INVALID_VALUE);
7239 }
7240
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007241 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7242 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007243 break;
7244
7245 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007246
7247 // it is an error to bind an offset not a multiple of the alignment
7248 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7249 {
7250 return gl::error(GL_INVALID_VALUE);
7251 }
7252
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007253 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7254 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007255 break;
7256
7257 default:
7258 UNREACHABLE();
7259 }
7260 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007261 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007262 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007263 {
7264 return gl::error(GL_OUT_OF_MEMORY);
7265 }
7266}
7267
7268void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7269{
7270 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7271 target, index, buffer);
7272
7273 try
7274 {
7275 gl::Context *context = gl::getNonLostContext();
7276
7277 if (context)
7278 {
7279 if (context->getClientVersion() < 3)
7280 {
7281 return gl::error(GL_INVALID_OPERATION);
7282 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007283
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007284 switch (target)
7285 {
7286 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007287 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007288 {
7289 return gl::error(GL_INVALID_VALUE);
7290 }
7291 break;
7292
7293 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007294 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007295 {
7296 return gl::error(GL_INVALID_VALUE);
7297 }
7298 break;
7299
7300 default:
7301 return gl::error(GL_INVALID_ENUM);
7302 }
7303
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007304 switch (target)
7305 {
7306 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007307 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007308 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007309 break;
7310
7311 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007312 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007313 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007314 break;
7315
7316 default:
7317 UNREACHABLE();
7318 }
7319 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007320 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007321 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007322 {
7323 return gl::error(GL_OUT_OF_MEMORY);
7324 }
7325}
7326
7327void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7328{
7329 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7330 program, count, varyings, bufferMode);
7331
7332 try
7333 {
7334 gl::Context *context = gl::getNonLostContext();
7335
7336 if (context)
7337 {
7338 if (context->getClientVersion() < 3)
7339 {
7340 return gl::error(GL_INVALID_OPERATION);
7341 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007342
Geoff Lang48dcae72014-02-05 16:28:24 -05007343 if (count < 0)
7344 {
7345 return gl::error(GL_INVALID_VALUE);
7346 }
7347
7348 switch (bufferMode)
7349 {
7350 case GL_INTERLEAVED_ATTRIBS:
7351 break;
7352 case GL_SEPARATE_ATTRIBS:
7353 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7354 {
7355 return gl::error(GL_INVALID_VALUE);
7356 }
7357 break;
7358 default:
7359 return gl::error(GL_INVALID_ENUM);
7360 }
7361
7362 if (!gl::ValidProgram(context, program))
7363 {
7364 return;
7365 }
7366
7367 gl::Program *programObject = context->getProgram(program);
7368 ASSERT(programObject);
7369
7370 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007371 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007372 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007373 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007374 {
7375 return gl::error(GL_OUT_OF_MEMORY);
7376 }
7377}
7378
7379void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7380{
7381 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7382 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7383 program, index, bufSize, length, size, type, name);
7384
7385 try
7386 {
7387 gl::Context *context = gl::getNonLostContext();
7388
7389 if (context)
7390 {
7391 if (context->getClientVersion() < 3)
7392 {
7393 return gl::error(GL_INVALID_OPERATION);
7394 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007395
Geoff Lang48dcae72014-02-05 16:28:24 -05007396 if (bufSize < 0)
7397 {
7398 return gl::error(GL_INVALID_VALUE);
7399 }
7400
7401 if (!gl::ValidProgram(context, program))
7402 {
7403 return;
7404 }
7405
7406 gl::Program *programObject = context->getProgram(program);
7407 ASSERT(programObject);
7408
7409 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7410 {
7411 return gl::error(GL_INVALID_VALUE);
7412 }
7413
7414 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007415 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007416 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007417 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007418 {
7419 return gl::error(GL_OUT_OF_MEMORY);
7420 }
7421}
7422
7423void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7424{
7425 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7426 index, size, type, stride, pointer);
7427
7428 try
7429 {
7430 gl::Context *context = gl::getNonLostContext();
7431
7432 if (context)
7433 {
7434 if (context->getClientVersion() < 3)
7435 {
7436 return gl::error(GL_INVALID_OPERATION);
7437 }
7438 }
7439
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007440 if (index >= gl::MAX_VERTEX_ATTRIBS)
7441 {
7442 return gl::error(GL_INVALID_VALUE);
7443 }
7444
7445 if (size < 1 || size > 4)
7446 {
7447 return gl::error(GL_INVALID_VALUE);
7448 }
7449
7450 switch (type)
7451 {
7452 case GL_BYTE:
7453 case GL_UNSIGNED_BYTE:
7454 case GL_SHORT:
7455 case GL_UNSIGNED_SHORT:
7456 case GL_INT:
7457 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007458 case GL_INT_2_10_10_10_REV:
7459 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007460 break;
7461 default:
7462 return gl::error(GL_INVALID_ENUM);
7463 }
7464
7465 if (stride < 0)
7466 {
7467 return gl::error(GL_INVALID_VALUE);
7468 }
7469
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007470 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7471 {
7472 return gl::error(GL_INVALID_OPERATION);
7473 }
7474
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007475 if (context)
7476 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007477 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7478 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7479 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7480 // and the pointer argument is not NULL.
7481 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7482 {
7483 return gl::error(GL_INVALID_OPERATION);
7484 }
7485
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007486 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7487 stride, pointer);
7488 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007489 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007490 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007491 {
7492 return gl::error(GL_OUT_OF_MEMORY);
7493 }
7494}
7495
7496void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7497{
7498 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7499 index, pname, params);
7500
7501 try
7502 {
7503 gl::Context *context = gl::getNonLostContext();
7504
7505 if (context)
7506 {
7507 if (context->getClientVersion() < 3)
7508 {
7509 return gl::error(GL_INVALID_OPERATION);
7510 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007511
Jamie Madilla7d05862013-07-02 11:57:06 -04007512 if (index >= gl::MAX_VERTEX_ATTRIBS)
7513 {
7514 return gl::error(GL_INVALID_VALUE);
7515 }
7516
7517 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7518
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007519 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007520 {
7521 return;
7522 }
7523
7524 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7525 {
7526 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7527 for (int i = 0; i < 4; ++i)
7528 {
7529 params[i] = currentValueData.IntValues[i];
7530 }
7531 }
7532 else
7533 {
7534 *params = attribState.querySingleParameter<GLint>(pname);
7535 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007536 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007537 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007538 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007539 {
7540 return gl::error(GL_OUT_OF_MEMORY);
7541 }
7542}
7543
7544void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7545{
7546 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7547 index, pname, params);
7548
7549 try
7550 {
7551 gl::Context *context = gl::getNonLostContext();
7552
7553 if (context)
7554 {
7555 if (context->getClientVersion() < 3)
7556 {
7557 return gl::error(GL_INVALID_OPERATION);
7558 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007559
Jamie Madilla7d05862013-07-02 11:57:06 -04007560 if (index >= gl::MAX_VERTEX_ATTRIBS)
7561 {
7562 return gl::error(GL_INVALID_VALUE);
7563 }
7564
7565 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7566
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007567 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007568 {
7569 return;
7570 }
7571
7572 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7573 {
7574 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7575 for (int i = 0; i < 4; ++i)
7576 {
7577 params[i] = currentValueData.UnsignedIntValues[i];
7578 }
7579 }
7580 else
7581 {
7582 *params = attribState.querySingleParameter<GLuint>(pname);
7583 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007584 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007585 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007586 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007587 {
7588 return gl::error(GL_OUT_OF_MEMORY);
7589 }
7590}
7591
7592void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7593{
7594 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7595 index, x, y, z, w);
7596
7597 try
7598 {
7599 gl::Context *context = gl::getNonLostContext();
7600
7601 if (context)
7602 {
7603 if (context->getClientVersion() < 3)
7604 {
7605 return gl::error(GL_INVALID_OPERATION);
7606 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007607
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007608 if (index >= gl::MAX_VERTEX_ATTRIBS)
7609 {
7610 return gl::error(GL_INVALID_VALUE);
7611 }
7612
7613 GLint vals[4] = { x, y, z, w };
7614 context->setVertexAttribi(index, vals);
7615 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007616 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007617 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007618 {
7619 return gl::error(GL_OUT_OF_MEMORY);
7620 }
7621}
7622
7623void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7624{
7625 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7626 index, x, y, z, w);
7627
7628 try
7629 {
7630 gl::Context *context = gl::getNonLostContext();
7631
7632 if (context)
7633 {
7634 if (context->getClientVersion() < 3)
7635 {
7636 return gl::error(GL_INVALID_OPERATION);
7637 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007638
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007639 if (index >= gl::MAX_VERTEX_ATTRIBS)
7640 {
7641 return gl::error(GL_INVALID_VALUE);
7642 }
7643
7644 GLuint vals[4] = { x, y, z, w };
7645 context->setVertexAttribu(index, vals);
7646 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007647 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007648 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007649 {
7650 return gl::error(GL_OUT_OF_MEMORY);
7651 }
7652}
7653
7654void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7655{
7656 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7657
7658 try
7659 {
7660 gl::Context *context = gl::getNonLostContext();
7661
7662 if (context)
7663 {
7664 if (context->getClientVersion() < 3)
7665 {
7666 return gl::error(GL_INVALID_OPERATION);
7667 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007668
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007669 if (index >= gl::MAX_VERTEX_ATTRIBS)
7670 {
7671 return gl::error(GL_INVALID_VALUE);
7672 }
7673
7674 context->setVertexAttribi(index, v);
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
7683void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7684{
7685 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7686
7687 try
7688 {
7689 gl::Context *context = gl::getNonLostContext();
7690
7691 if (context)
7692 {
7693 if (context->getClientVersion() < 3)
7694 {
7695 return gl::error(GL_INVALID_OPERATION);
7696 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007697
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007698 if (index >= gl::MAX_VERTEX_ATTRIBS)
7699 {
7700 return gl::error(GL_INVALID_VALUE);
7701 }
7702
7703 context->setVertexAttribu(index, v);
7704 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007705 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007706 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007707 {
7708 return gl::error(GL_OUT_OF_MEMORY);
7709 }
7710}
7711
7712void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7713{
7714 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7715 program, location, params);
7716
7717 try
7718 {
7719 gl::Context *context = gl::getNonLostContext();
7720
7721 if (context)
7722 {
7723 if (context->getClientVersion() < 3)
7724 {
7725 return gl::error(GL_INVALID_OPERATION);
7726 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007727
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007728 if (program == 0)
7729 {
7730 return gl::error(GL_INVALID_VALUE);
7731 }
7732
7733 gl::Program *programObject = context->getProgram(program);
7734
7735 if (!programObject || !programObject->isLinked())
7736 {
7737 return gl::error(GL_INVALID_OPERATION);
7738 }
7739
7740 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7741 if (!programBinary)
7742 {
7743 return gl::error(GL_INVALID_OPERATION);
7744 }
7745
7746 if (!programBinary->getUniformuiv(location, NULL, params))
7747 {
7748 return gl::error(GL_INVALID_OPERATION);
7749 }
7750 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007751 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007752 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007753 {
7754 return gl::error(GL_OUT_OF_MEMORY);
7755 }
7756}
7757
7758GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7759{
7760 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7761 program, name);
7762
7763 try
7764 {
7765 gl::Context *context = gl::getNonLostContext();
7766
7767 if (context)
7768 {
7769 if (context->getClientVersion() < 3)
7770 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007771 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007772 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007773
Jamie Madilld1e78c92013-06-20 11:55:50 -04007774 if (program == 0)
7775 {
7776 return gl::error(GL_INVALID_VALUE, -1);
7777 }
7778
7779 gl::Program *programObject = context->getProgram(program);
7780
7781 if (!programObject || !programObject->isLinked())
7782 {
7783 return gl::error(GL_INVALID_OPERATION, -1);
7784 }
7785
7786 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7787 if (!programBinary)
7788 {
7789 return gl::error(GL_INVALID_OPERATION, -1);
7790 }
7791
7792 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007793 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007794 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007795 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007796 {
7797 return gl::error(GL_OUT_OF_MEMORY, 0);
7798 }
7799
7800 return 0;
7801}
7802
7803void __stdcall glUniform1ui(GLint location, GLuint v0)
7804{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007805 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007806}
7807
7808void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
7809{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007810 const GLuint xy[] = { v0, v1 };
7811 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007812}
7813
7814void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
7815{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007816 const GLuint xyz[] = { v0, v1, v2 };
7817 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007818}
7819
7820void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
7821{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007822 const GLuint xyzw[] = { v0, v1, v2, v3 };
7823 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007824}
7825
7826void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
7827{
7828 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7829 location, count, value);
7830
7831 try
7832 {
7833 gl::Context *context = gl::getNonLostContext();
7834
7835 if (context)
7836 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007837 if (!ValidateUniform(context, GL_UNSIGNED_INT, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007838 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007839 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007840 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007841
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007842 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007843 programBinary->setUniform1uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007844 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007845 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007846 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007847 {
7848 return gl::error(GL_OUT_OF_MEMORY);
7849 }
7850}
7851
7852void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
7853{
7854 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7855 location, count, value);
7856
7857 try
7858 {
7859 gl::Context *context = gl::getNonLostContext();
7860
7861 if (context)
7862 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007863 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC2, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007864 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007865 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007866 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007867
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007868 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007869 programBinary->setUniform2uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007870 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007871 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007872 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007873 {
7874 return gl::error(GL_OUT_OF_MEMORY);
7875 }
7876}
7877
7878void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
7879{
7880 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
7881 location, count, value);
7882
7883 try
7884 {
7885 gl::Context *context = gl::getNonLostContext();
7886
7887 if (context)
7888 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007889 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC3, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007890 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007891 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007892 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007893
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007894 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007895 programBinary->setUniform3uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007896 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007897 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007898 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007899 {
7900 return gl::error(GL_OUT_OF_MEMORY);
7901 }
7902}
7903
7904void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
7905{
7906 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7907 location, count, value);
7908
7909 try
7910 {
7911 gl::Context *context = gl::getNonLostContext();
7912
7913 if (context)
7914 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007915 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC4, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007916 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007917 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007918 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007919
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007920 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007921 programBinary->setUniform4uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007922 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007923 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007924 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007925 {
7926 return gl::error(GL_OUT_OF_MEMORY);
7927 }
7928}
7929
7930void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
7931{
7932 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
7933 buffer, drawbuffer, value);
7934
7935 try
7936 {
7937 gl::Context *context = gl::getNonLostContext();
7938
7939 if (context)
7940 {
7941 if (context->getClientVersion() < 3)
7942 {
7943 return gl::error(GL_INVALID_OPERATION);
7944 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007945
Geoff Lang42359ca2013-08-21 13:25:17 -04007946 switch (buffer)
7947 {
7948 case GL_COLOR:
7949 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7950 {
7951 return gl::error(GL_INVALID_VALUE);
7952 }
7953 break;
7954 case GL_STENCIL:
7955 if (drawbuffer != 0)
7956 {
7957 return gl::error(GL_INVALID_VALUE);
7958 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05007959 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04007960 default:
7961 return gl::error(GL_INVALID_ENUM);
7962 }
7963
7964 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007965 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007966 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007967 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007968 {
7969 return gl::error(GL_OUT_OF_MEMORY);
7970 }
7971}
7972
7973void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
7974{
7975 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
7976 buffer, drawbuffer, value);
7977
7978 try
7979 {
7980 gl::Context *context = gl::getNonLostContext();
7981
7982 if (context)
7983 {
7984 if (context->getClientVersion() < 3)
7985 {
7986 return gl::error(GL_INVALID_OPERATION);
7987 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007988
Geoff Lang42359ca2013-08-21 13:25:17 -04007989 switch (buffer)
7990 {
7991 case GL_COLOR:
7992 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7993 {
7994 return gl::error(GL_INVALID_VALUE);
7995 }
7996 break;
7997 default:
7998 return gl::error(GL_INVALID_ENUM);
7999 }
8000
8001 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008002 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008003 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008004 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008005 {
8006 return gl::error(GL_OUT_OF_MEMORY);
8007 }
8008}
8009
8010void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8011{
8012 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8013 buffer, drawbuffer, value);
8014
8015 try
8016 {
8017 gl::Context *context = gl::getNonLostContext();
8018
8019 if (context)
8020 {
8021 if (context->getClientVersion() < 3)
8022 {
8023 return gl::error(GL_INVALID_OPERATION);
8024 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008025
Geoff Lang42359ca2013-08-21 13:25:17 -04008026 switch (buffer)
8027 {
8028 case GL_COLOR:
8029 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8030 {
8031 return gl::error(GL_INVALID_VALUE);
8032 }
8033 break;
8034 case GL_DEPTH:
8035 if (drawbuffer != 0)
8036 {
8037 return gl::error(GL_INVALID_VALUE);
8038 }
8039 break;
8040 default:
8041 return gl::error(GL_INVALID_ENUM);
8042 }
8043
8044 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008045 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008046 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008047 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008048 {
8049 return gl::error(GL_OUT_OF_MEMORY);
8050 }
8051}
8052
8053void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8054{
8055 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8056 buffer, drawbuffer, depth, stencil);
8057
8058 try
8059 {
8060 gl::Context *context = gl::getNonLostContext();
8061
8062 if (context)
8063 {
8064 if (context->getClientVersion() < 3)
8065 {
8066 return gl::error(GL_INVALID_OPERATION);
8067 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008068
Geoff Lang42359ca2013-08-21 13:25:17 -04008069 switch (buffer)
8070 {
8071 case GL_DEPTH_STENCIL:
8072 if (drawbuffer != 0)
8073 {
8074 return gl::error(GL_INVALID_VALUE);
8075 }
8076 break;
8077 default:
8078 return gl::error(GL_INVALID_ENUM);
8079 }
8080
8081 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008082 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008083 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008084 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008085 {
8086 return gl::error(GL_OUT_OF_MEMORY);
8087 }
8088}
8089
8090const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8091{
8092 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8093
8094 try
8095 {
8096 gl::Context *context = gl::getNonLostContext();
8097
8098 if (context)
8099 {
8100 if (context->getClientVersion() < 3)
8101 {
8102 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8103 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008104
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008105 if (name != GL_EXTENSIONS)
8106 {
8107 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8108 }
8109
Geoff Langcec35902014-04-16 10:52:36 -04008110 if (index >= context->getExtensionStringCount())
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008111 {
8112 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8113 }
Geoff Langcec35902014-04-16 10:52:36 -04008114
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008115 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8116 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008117 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008118 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008119 {
8120 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8121 }
8122
8123 return NULL;
8124}
8125
8126void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8127{
8128 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8129 readTarget, writeTarget, readOffset, writeOffset, size);
8130
8131 try
8132 {
8133 gl::Context *context = gl::getNonLostContext();
8134
8135 if (context)
8136 {
8137 if (context->getClientVersion() < 3)
8138 {
8139 return gl::error(GL_INVALID_OPERATION);
8140 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008141
Jamie Madill8c96d582014-03-05 15:01:23 -05008142 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008143 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008144 return gl::error(GL_INVALID_ENUM);
8145 }
8146
Jamie Madill8c96d582014-03-05 15:01:23 -05008147 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8148 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008149
8150 if (!readBuffer || !writeBuffer)
8151 {
8152 return gl::error(GL_INVALID_OPERATION);
8153 }
8154
Jamie Madill7a5f7382014-03-05 15:01:24 -05008155 if (readBuffer->mapped() || writeBuffer->mapped())
8156 {
8157 return gl::error(GL_INVALID_OPERATION);
8158 }
8159
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008160 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8161 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8162 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8163 {
8164 return gl::error(GL_INVALID_VALUE);
8165 }
8166
8167 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8168 {
8169 return gl::error(GL_INVALID_VALUE);
8170 }
8171
8172 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8173
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008174 // if size is zero, the copy is a successful no-op
8175 if (size > 0)
8176 {
8177 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8178 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008179 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008180 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008181 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008182 {
8183 return gl::error(GL_OUT_OF_MEMORY);
8184 }
8185}
8186
8187void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8188{
8189 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8190 program, uniformCount, uniformNames, uniformIndices);
8191
8192 try
8193 {
8194 gl::Context *context = gl::getNonLostContext();
8195
8196 if (context)
8197 {
8198 if (context->getClientVersion() < 3)
8199 {
8200 return gl::error(GL_INVALID_OPERATION);
8201 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008202
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008203 if (uniformCount < 0)
8204 {
8205 return gl::error(GL_INVALID_VALUE);
8206 }
8207
8208 gl::Program *programObject = context->getProgram(program);
8209
8210 if (!programObject)
8211 {
8212 if (context->getShader(program))
8213 {
8214 return gl::error(GL_INVALID_OPERATION);
8215 }
8216 else
8217 {
8218 return gl::error(GL_INVALID_VALUE);
8219 }
8220 }
8221
8222 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8223 if (!programObject->isLinked() || !programBinary)
8224 {
8225 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8226 {
8227 uniformIndices[uniformId] = GL_INVALID_INDEX;
8228 }
8229 }
8230 else
8231 {
8232 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8233 {
8234 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8235 }
8236 }
8237 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008238 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008239 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008240 {
8241 return gl::error(GL_OUT_OF_MEMORY);
8242 }
8243}
8244
8245void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8246{
8247 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8248 program, uniformCount, uniformIndices, pname, params);
8249
8250 try
8251 {
8252 gl::Context *context = gl::getNonLostContext();
8253
8254 if (context)
8255 {
8256 if (context->getClientVersion() < 3)
8257 {
8258 return gl::error(GL_INVALID_OPERATION);
8259 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008260
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008261 if (uniformCount < 0)
8262 {
8263 return gl::error(GL_INVALID_VALUE);
8264 }
8265
8266 gl::Program *programObject = context->getProgram(program);
8267
8268 if (!programObject)
8269 {
8270 if (context->getShader(program))
8271 {
8272 return gl::error(GL_INVALID_OPERATION);
8273 }
8274 else
8275 {
8276 return gl::error(GL_INVALID_VALUE);
8277 }
8278 }
8279
8280 switch (pname)
8281 {
8282 case GL_UNIFORM_TYPE:
8283 case GL_UNIFORM_SIZE:
8284 case GL_UNIFORM_NAME_LENGTH:
8285 case GL_UNIFORM_BLOCK_INDEX:
8286 case GL_UNIFORM_OFFSET:
8287 case GL_UNIFORM_ARRAY_STRIDE:
8288 case GL_UNIFORM_MATRIX_STRIDE:
8289 case GL_UNIFORM_IS_ROW_MAJOR:
8290 break;
8291 default:
8292 return gl::error(GL_INVALID_ENUM);
8293 }
8294
8295 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8296
8297 if (!programBinary && uniformCount > 0)
8298 {
8299 return gl::error(GL_INVALID_VALUE);
8300 }
8301
8302 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8303 {
8304 const GLuint index = uniformIndices[uniformId];
8305
8306 if (index >= (GLuint)programBinary->getActiveUniformCount())
8307 {
8308 return gl::error(GL_INVALID_VALUE);
8309 }
8310 }
8311
8312 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8313 {
8314 const GLuint index = uniformIndices[uniformId];
8315 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8316 }
8317 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008318 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008319 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008320 {
8321 return gl::error(GL_OUT_OF_MEMORY);
8322 }
8323}
8324
8325GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8326{
8327 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8328
8329 try
8330 {
8331 gl::Context *context = gl::getNonLostContext();
8332
8333 if (context)
8334 {
8335 if (context->getClientVersion() < 3)
8336 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008337 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008338 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008339
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008340 gl::Program *programObject = context->getProgram(program);
8341
8342 if (!programObject)
8343 {
8344 if (context->getShader(program))
8345 {
8346 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8347 }
8348 else
8349 {
8350 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8351 }
8352 }
8353
8354 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8355 if (!programBinary)
8356 {
8357 return GL_INVALID_INDEX;
8358 }
8359
8360 return programBinary->getUniformBlockIndex(uniformBlockName);
8361 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008362 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008363 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008364 {
8365 return gl::error(GL_OUT_OF_MEMORY, 0);
8366 }
8367
8368 return 0;
8369}
8370
8371void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8372{
8373 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8374 program, uniformBlockIndex, pname, params);
8375
8376 try
8377 {
8378 gl::Context *context = gl::getNonLostContext();
8379
8380 if (context)
8381 {
8382 if (context->getClientVersion() < 3)
8383 {
8384 return gl::error(GL_INVALID_OPERATION);
8385 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008386 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008387
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008388 if (!programObject)
8389 {
8390 if (context->getShader(program))
8391 {
8392 return gl::error(GL_INVALID_OPERATION);
8393 }
8394 else
8395 {
8396 return gl::error(GL_INVALID_VALUE);
8397 }
8398 }
8399
8400 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8401
8402 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8403 {
8404 return gl::error(GL_INVALID_VALUE);
8405 }
8406
8407 switch (pname)
8408 {
8409 case GL_UNIFORM_BLOCK_BINDING:
8410 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8411 break;
8412
8413 case GL_UNIFORM_BLOCK_DATA_SIZE:
8414 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8415 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8416 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8417 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8418 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8419 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8420 break;
8421
8422 default:
8423 return gl::error(GL_INVALID_ENUM);
8424 }
8425 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008426 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008427 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008428 {
8429 return gl::error(GL_OUT_OF_MEMORY);
8430 }
8431}
8432
8433void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8434{
8435 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8436 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8437
8438 try
8439 {
8440 gl::Context *context = gl::getNonLostContext();
8441
8442 if (context)
8443 {
8444 if (context->getClientVersion() < 3)
8445 {
8446 return gl::error(GL_INVALID_OPERATION);
8447 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008448
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008449 gl::Program *programObject = context->getProgram(program);
8450
8451 if (!programObject)
8452 {
8453 if (context->getShader(program))
8454 {
8455 return gl::error(GL_INVALID_OPERATION);
8456 }
8457 else
8458 {
8459 return gl::error(GL_INVALID_VALUE);
8460 }
8461 }
8462
8463 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8464
8465 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8466 {
8467 return gl::error(GL_INVALID_VALUE);
8468 }
8469
8470 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8471 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008472 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008473 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008474 {
8475 return gl::error(GL_OUT_OF_MEMORY);
8476 }
8477}
8478
8479void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8480{
8481 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8482 program, uniformBlockIndex, uniformBlockBinding);
8483
8484 try
8485 {
8486 gl::Context *context = gl::getNonLostContext();
8487
8488 if (context)
8489 {
8490 if (context->getClientVersion() < 3)
8491 {
8492 return gl::error(GL_INVALID_OPERATION);
8493 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008494
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008495 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8496 {
8497 return gl::error(GL_INVALID_VALUE);
8498 }
8499
8500 gl::Program *programObject = context->getProgram(program);
8501
8502 if (!programObject)
8503 {
8504 if (context->getShader(program))
8505 {
8506 return gl::error(GL_INVALID_OPERATION);
8507 }
8508 else
8509 {
8510 return gl::error(GL_INVALID_VALUE);
8511 }
8512 }
8513
8514 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8515
8516 // if never linked, there won't be any uniform blocks
8517 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8518 {
8519 return gl::error(GL_INVALID_VALUE);
8520 }
8521
8522 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8523 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008524 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008525 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008526 {
8527 return gl::error(GL_OUT_OF_MEMORY);
8528 }
8529}
8530
8531void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8532{
8533 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8534 mode, first, count, instanceCount);
8535
8536 try
8537 {
8538 gl::Context *context = gl::getNonLostContext();
8539
8540 if (context)
8541 {
8542 if (context->getClientVersion() < 3)
8543 {
8544 return gl::error(GL_INVALID_OPERATION);
8545 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008546
Jamie Madill54133512013-06-21 09:33:07 -04008547 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008548 UNIMPLEMENTED();
8549 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008550 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008551 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008552 {
8553 return gl::error(GL_OUT_OF_MEMORY);
8554 }
8555}
8556
8557void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8558{
8559 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8560 mode, count, type, indices, instanceCount);
8561
8562 try
8563 {
8564 gl::Context *context = gl::getNonLostContext();
8565
8566 if (context)
8567 {
8568 if (context->getClientVersion() < 3)
8569 {
8570 return gl::error(GL_INVALID_OPERATION);
8571 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008572
Jamie Madill54133512013-06-21 09:33:07 -04008573 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008574 UNIMPLEMENTED();
8575 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008576 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008577 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008578 {
8579 return gl::error(GL_OUT_OF_MEMORY);
8580 }
8581}
8582
8583GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8584{
8585 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8586
8587 try
8588 {
8589 gl::Context *context = gl::getNonLostContext();
8590
8591 if (context)
8592 {
8593 if (context->getClientVersion() < 3)
8594 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008595 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008596 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008597
Jamie Madill5215e1a2013-07-26 11:55:19 -04008598 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8599 {
8600 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8601 }
8602
8603 if (flags != 0)
8604 {
8605 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8606 }
8607
8608 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008609 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008610 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008611 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008612 {
8613 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8614 }
8615
8616 return NULL;
8617}
8618
8619GLboolean __stdcall glIsSync(GLsync sync)
8620{
8621 EVENT("(GLsync sync = 0x%0.8p)", sync);
8622
8623 try
8624 {
8625 gl::Context *context = gl::getNonLostContext();
8626
8627 if (context)
8628 {
8629 if (context->getClientVersion() < 3)
8630 {
8631 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8632 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008633
Jamie Madill5215e1a2013-07-26 11:55:19 -04008634 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008635 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008636 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008637 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008638 {
8639 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8640 }
8641
8642 return GL_FALSE;
8643}
8644
8645void __stdcall glDeleteSync(GLsync sync)
8646{
8647 EVENT("(GLsync sync = 0x%0.8p)", sync);
8648
8649 try
8650 {
8651 gl::Context *context = gl::getNonLostContext();
8652
8653 if (context)
8654 {
8655 if (context->getClientVersion() < 3)
8656 {
8657 return gl::error(GL_INVALID_OPERATION);
8658 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008659
Jamie Madill5215e1a2013-07-26 11:55:19 -04008660 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8661 {
8662 return gl::error(GL_INVALID_VALUE);
8663 }
8664
8665 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008666 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008667 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008668 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008669 {
8670 return gl::error(GL_OUT_OF_MEMORY);
8671 }
8672}
8673
8674GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8675{
8676 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8677 sync, flags, timeout);
8678
8679 try
8680 {
8681 gl::Context *context = gl::getNonLostContext();
8682
8683 if (context)
8684 {
8685 if (context->getClientVersion() < 3)
8686 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008687 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008688 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008689
Jamie Madill5215e1a2013-07-26 11:55:19 -04008690 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8691 {
8692 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8693 }
8694
8695 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8696
8697 if (!fenceSync)
8698 {
8699 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8700 }
8701
8702 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008703 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008704 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008705 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008706 {
8707 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8708 }
8709
8710 return GL_FALSE;
8711}
8712
8713void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8714{
8715 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8716 sync, flags, timeout);
8717
8718 try
8719 {
8720 gl::Context *context = gl::getNonLostContext();
8721
8722 if (context)
8723 {
8724 if (context->getClientVersion() < 3)
8725 {
8726 return gl::error(GL_INVALID_OPERATION);
8727 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008728
Jamie Madill5215e1a2013-07-26 11:55:19 -04008729 if (flags != 0)
8730 {
8731 return gl::error(GL_INVALID_VALUE);
8732 }
8733
8734 if (timeout != GL_TIMEOUT_IGNORED)
8735 {
8736 return gl::error(GL_INVALID_VALUE);
8737 }
8738
8739 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8740
8741 if (!fenceSync)
8742 {
8743 return gl::error(GL_INVALID_VALUE);
8744 }
8745
8746 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008747 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008748 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008749 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008750 {
8751 return gl::error(GL_OUT_OF_MEMORY);
8752 }
8753}
8754
8755void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8756{
8757 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8758 pname, params);
8759
8760 try
8761 {
8762 gl::Context *context = gl::getNonLostContext();
8763
8764 if (context)
8765 {
8766 if (context->getClientVersion() < 3)
8767 {
8768 return gl::error(GL_INVALID_OPERATION);
8769 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008770
Jamie Madill79f2f452013-12-19 11:13:02 -05008771 GLenum nativeType;
8772 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04008773 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
8774 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008775 return;
Jamie Madill893ab082014-05-16 16:56:10 -04008776 }
Jamie Madill79f2f452013-12-19 11:13:02 -05008777
8778 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04008779 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008780 context->getInteger64v(pname, params);
8781 }
Jamie Madill55856b12014-01-02 13:59:50 -05008782 else
Jamie Madill79f2f452013-12-19 11:13:02 -05008783 {
Jamie Madill55856b12014-01-02 13:59:50 -05008784 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04008785 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008786 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008787 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008788 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008789 {
8790 return gl::error(GL_OUT_OF_MEMORY);
8791 }
8792}
8793
8794void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8795{
8796 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8797 sync, pname, bufSize, length, values);
8798
8799 try
8800 {
8801 gl::Context *context = gl::getNonLostContext();
8802
8803 if (context)
8804 {
8805 if (context->getClientVersion() < 3)
8806 {
8807 return gl::error(GL_INVALID_OPERATION);
8808 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008809
Jamie Madill5215e1a2013-07-26 11:55:19 -04008810 if (bufSize < 0)
8811 {
8812 return gl::error(GL_INVALID_VALUE);
8813 }
8814
8815 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8816
8817 if (!fenceSync)
8818 {
8819 return gl::error(GL_INVALID_VALUE);
8820 }
8821
8822 switch (pname)
8823 {
8824 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
8825 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
8826 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
8827 case GL_SYNC_FLAGS: values[0] = 0; break;
8828
8829 default:
8830 return gl::error(GL_INVALID_ENUM);
8831 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008832 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008833 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008834 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008835 {
8836 return gl::error(GL_OUT_OF_MEMORY);
8837 }
8838}
8839
8840void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8841{
8842 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8843 target, index, data);
8844
8845 try
8846 {
8847 gl::Context *context = gl::getNonLostContext();
8848
8849 if (context)
8850 {
8851 if (context->getClientVersion() < 3)
8852 {
8853 return gl::error(GL_INVALID_OPERATION);
8854 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008855
Shannon Woods15934d52013-08-19 14:28:49 -04008856 switch (target)
8857 {
8858 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
8859 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
8860 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
8861 if (index >= context->getMaxTransformFeedbackBufferBindings())
8862 return gl::error(GL_INVALID_VALUE);
8863 break;
8864 case GL_UNIFORM_BUFFER_START:
8865 case GL_UNIFORM_BUFFER_SIZE:
8866 case GL_UNIFORM_BUFFER_BINDING:
8867 if (index >= context->getMaximumCombinedUniformBufferBindings())
8868 return gl::error(GL_INVALID_VALUE);
8869 break;
8870 default:
8871 return gl::error(GL_INVALID_ENUM);
8872 }
8873
8874 if (!(context->getIndexedInteger64v(target, index, data)))
8875 {
8876 GLenum nativeType;
8877 unsigned int numParams = 0;
8878 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
8879 return gl::error(GL_INVALID_ENUM);
8880
8881 if (numParams == 0)
8882 return; // it is known that pname is valid, but there are no parameters to return
8883
8884 if (nativeType == GL_INT)
8885 {
8886 GLint *intParams = new GLint[numParams];
8887
8888 context->getIndexedIntegerv(target, index, intParams);
8889
8890 for (unsigned int i = 0; i < numParams; ++i)
8891 {
8892 data[i] = static_cast<GLint64>(intParams[i]);
8893 }
8894
8895 delete [] intParams;
8896 }
8897 else
8898 {
8899 UNREACHABLE();
8900 }
8901 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008902 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008903 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008904 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008905 {
8906 return gl::error(GL_OUT_OF_MEMORY);
8907 }
8908}
8909
8910void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8911{
8912 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8913 target, pname, params);
8914
8915 try
8916 {
8917 gl::Context *context = gl::getNonLostContext();
8918
8919 if (context)
8920 {
8921 if (context->getClientVersion() < 3)
8922 {
8923 return gl::error(GL_INVALID_OPERATION);
8924 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008925
Jamie Madill70656a62014-03-05 15:01:26 -05008926 if (!gl::ValidBufferTarget(context, target))
8927 {
8928 return gl::error(GL_INVALID_ENUM);
8929 }
8930
8931 if (!gl::ValidBufferParameter(context, pname))
8932 {
8933 return gl::error(GL_INVALID_ENUM);
8934 }
8935
8936 gl::Buffer *buffer = context->getTargetBuffer(target);
8937
8938 if (!buffer)
8939 {
8940 // A null buffer means that "0" is bound to the requested buffer target
8941 return gl::error(GL_INVALID_OPERATION);
8942 }
8943
8944 switch (pname)
8945 {
8946 case GL_BUFFER_USAGE:
8947 *params = static_cast<GLint64>(buffer->usage());
8948 break;
8949 case GL_BUFFER_SIZE:
8950 *params = buffer->size();
8951 break;
8952 case GL_BUFFER_ACCESS_FLAGS:
8953 *params = static_cast<GLint64>(buffer->accessFlags());
8954 break;
8955 case GL_BUFFER_MAPPED:
8956 *params = static_cast<GLint64>(buffer->mapped());
8957 break;
8958 case GL_BUFFER_MAP_OFFSET:
8959 *params = buffer->mapOffset();
8960 break;
8961 case GL_BUFFER_MAP_LENGTH:
8962 *params = buffer->mapLength();
8963 break;
8964 default: UNREACHABLE(); break;
8965 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008966 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008967 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008968 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008969 {
8970 return gl::error(GL_OUT_OF_MEMORY);
8971 }
8972}
8973
8974void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
8975{
8976 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
8977
8978 try
8979 {
8980 gl::Context *context = gl::getNonLostContext();
8981
8982 if (context)
8983 {
8984 if (context->getClientVersion() < 3)
8985 {
8986 return gl::error(GL_INVALID_OPERATION);
8987 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008988
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008989 if (count < 0)
8990 {
8991 return gl::error(GL_INVALID_VALUE);
8992 }
8993
8994 for (int i = 0; i < count; i++)
8995 {
8996 samplers[i] = context->createSampler();
8997 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008998 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008999 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009000 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009001 {
9002 return gl::error(GL_OUT_OF_MEMORY);
9003 }
9004}
9005
9006void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9007{
9008 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9009
9010 try
9011 {
9012 gl::Context *context = gl::getNonLostContext();
9013
9014 if (context)
9015 {
9016 if (context->getClientVersion() < 3)
9017 {
9018 return gl::error(GL_INVALID_OPERATION);
9019 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009020
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009021 if (count < 0)
9022 {
9023 return gl::error(GL_INVALID_VALUE);
9024 }
9025
9026 for (int i = 0; i < count; i++)
9027 {
9028 context->deleteSampler(samplers[i]);
9029 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009030 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009031 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009032 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009033 {
9034 return gl::error(GL_OUT_OF_MEMORY);
9035 }
9036}
9037
9038GLboolean __stdcall glIsSampler(GLuint sampler)
9039{
9040 EVENT("(GLuint sampler = %u)", sampler);
9041
9042 try
9043 {
9044 gl::Context *context = gl::getNonLostContext();
9045
9046 if (context)
9047 {
9048 if (context->getClientVersion() < 3)
9049 {
9050 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9051 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009052
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009053 return context->isSampler(sampler);
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, GL_FALSE);
9059 }
9060
9061 return GL_FALSE;
9062}
9063
9064void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9065{
9066 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9067
9068 try
9069 {
9070 gl::Context *context = gl::getNonLostContext();
9071
9072 if (context)
9073 {
9074 if (context->getClientVersion() < 3)
9075 {
9076 return gl::error(GL_INVALID_OPERATION);
9077 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009078
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009079 if (sampler != 0 && !context->isSampler(sampler))
9080 {
9081 return gl::error(GL_INVALID_OPERATION);
9082 }
9083
9084 if (unit >= context->getMaximumCombinedTextureImageUnits())
9085 {
9086 return gl::error(GL_INVALID_VALUE);
9087 }
9088
9089 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009090 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009091 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009092 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009093 {
9094 return gl::error(GL_OUT_OF_MEMORY);
9095 }
9096}
9097
9098void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9099{
9100 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9101
9102 try
9103 {
9104 gl::Context *context = gl::getNonLostContext();
9105
9106 if (context)
9107 {
9108 if (context->getClientVersion() < 3)
9109 {
9110 return gl::error(GL_INVALID_OPERATION);
9111 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009112
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009113 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009114 {
9115 return;
9116 }
9117
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009118 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009119 {
9120 return;
9121 }
9122
9123 if (!context->isSampler(sampler))
9124 {
9125 return gl::error(GL_INVALID_OPERATION);
9126 }
9127
9128 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009129 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009130 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009131 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009132 {
9133 return gl::error(GL_OUT_OF_MEMORY);
9134 }
9135}
9136
9137void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9138{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009139 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009140}
9141
9142void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9143{
9144 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9145
9146 try
9147 {
9148 gl::Context *context = gl::getNonLostContext();
9149
9150 if (context)
9151 {
9152 if (context->getClientVersion() < 3)
9153 {
9154 return gl::error(GL_INVALID_OPERATION);
9155 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009156
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009157 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009158 {
9159 return;
9160 }
9161
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009162 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009163 {
9164 return;
9165 }
9166
9167 if (!context->isSampler(sampler))
9168 {
9169 return gl::error(GL_INVALID_OPERATION);
9170 }
9171
9172 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009173 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009174 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009175 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009176 {
9177 return gl::error(GL_OUT_OF_MEMORY);
9178 }
9179}
9180
9181void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9182{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009183 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009184}
9185
9186void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9187{
9188 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9189
9190 try
9191 {
9192 gl::Context *context = gl::getNonLostContext();
9193
9194 if (context)
9195 {
9196 if (context->getClientVersion() < 3)
9197 {
9198 return gl::error(GL_INVALID_OPERATION);
9199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009200
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009201 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009202 {
9203 return;
9204 }
9205
9206 if (!context->isSampler(sampler))
9207 {
9208 return gl::error(GL_INVALID_OPERATION);
9209 }
9210
9211 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009212 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009213 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009214 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009215 {
9216 return gl::error(GL_OUT_OF_MEMORY);
9217 }
9218}
9219
9220void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9221{
9222 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9223
9224 try
9225 {
9226 gl::Context *context = gl::getNonLostContext();
9227
9228 if (context)
9229 {
9230 if (context->getClientVersion() < 3)
9231 {
9232 return gl::error(GL_INVALID_OPERATION);
9233 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009234
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009235 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009236 {
9237 return;
9238 }
9239
9240 if (!context->isSampler(sampler))
9241 {
9242 return gl::error(GL_INVALID_OPERATION);
9243 }
9244
9245 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009246 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009247 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009248 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009249 {
9250 return gl::error(GL_OUT_OF_MEMORY);
9251 }
9252}
9253
9254void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9255{
9256 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9257
9258 try
9259 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009260 if (index >= gl::MAX_VERTEX_ATTRIBS)
9261 {
9262 return gl::error(GL_INVALID_VALUE);
9263 }
9264
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009265 gl::Context *context = gl::getNonLostContext();
9266
9267 if (context)
9268 {
9269 if (context->getClientVersion() < 3)
9270 {
9271 return gl::error(GL_INVALID_OPERATION);
9272 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009273
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009274 context->setVertexAttribDivisor(index, divisor);
9275 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009276 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009277 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009278 {
9279 return gl::error(GL_OUT_OF_MEMORY);
9280 }
9281}
9282
9283void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9284{
9285 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9286
9287 try
9288 {
9289 gl::Context *context = gl::getNonLostContext();
9290
9291 if (context)
9292 {
9293 if (context->getClientVersion() < 3)
9294 {
9295 return gl::error(GL_INVALID_OPERATION);
9296 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009297
Geoff Langc8058452014-02-03 12:04:11 -05009298 switch (target)
9299 {
9300 case GL_TRANSFORM_FEEDBACK:
9301 {
9302 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9303 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9304 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9305 {
9306 return gl::error(GL_INVALID_OPERATION);
9307 }
9308
9309 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9310 if (context->getTransformFeedback(id) == NULL)
9311 {
9312 return gl::error(GL_INVALID_OPERATION);
9313 }
9314
9315 context->bindTransformFeedback(id);
9316 }
9317 break;
9318
9319 default:
9320 return gl::error(GL_INVALID_ENUM);
9321 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009322 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009323 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009324 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009325 {
9326 return gl::error(GL_OUT_OF_MEMORY);
9327 }
9328}
9329
9330void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9331{
9332 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9333
9334 try
9335 {
9336 gl::Context *context = gl::getNonLostContext();
9337
9338 if (context)
9339 {
9340 if (context->getClientVersion() < 3)
9341 {
9342 return gl::error(GL_INVALID_OPERATION);
9343 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009344
Geoff Langc8058452014-02-03 12:04:11 -05009345 for (int i = 0; i < n; i++)
9346 {
9347 context->deleteTransformFeedback(ids[i]);
9348 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009349 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009350 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009351 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009352 {
9353 return gl::error(GL_OUT_OF_MEMORY);
9354 }
9355}
9356
9357void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9358{
9359 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9360
9361 try
9362 {
9363 gl::Context *context = gl::getNonLostContext();
9364
9365 if (context)
9366 {
9367 if (context->getClientVersion() < 3)
9368 {
9369 return gl::error(GL_INVALID_OPERATION);
9370 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009371
Geoff Langc8058452014-02-03 12:04:11 -05009372 for (int i = 0; i < n; i++)
9373 {
9374 ids[i] = context->createTransformFeedback();
9375 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009376 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009377 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009378 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009379 {
9380 return gl::error(GL_OUT_OF_MEMORY);
9381 }
9382}
9383
9384GLboolean __stdcall glIsTransformFeedback(GLuint id)
9385{
9386 EVENT("(GLuint id = %u)", id);
9387
9388 try
9389 {
9390 gl::Context *context = gl::getNonLostContext();
9391
9392 if (context)
9393 {
9394 if (context->getClientVersion() < 3)
9395 {
9396 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9397 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009398
Geoff Langc8058452014-02-03 12:04:11 -05009399 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009400 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009401 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009402 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009403 {
9404 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9405 }
9406
9407 return GL_FALSE;
9408}
9409
9410void __stdcall glPauseTransformFeedback(void)
9411{
9412 EVENT("(void)");
9413
9414 try
9415 {
9416 gl::Context *context = gl::getNonLostContext();
9417
9418 if (context)
9419 {
9420 if (context->getClientVersion() < 3)
9421 {
9422 return gl::error(GL_INVALID_OPERATION);
9423 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009424
Geoff Langc8058452014-02-03 12:04:11 -05009425 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9426 ASSERT(transformFeedback != NULL);
9427
9428 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9429 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9430 {
9431 return gl::error(GL_INVALID_OPERATION);
9432 }
9433
9434 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009435 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009436 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009437 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009438 {
9439 return gl::error(GL_OUT_OF_MEMORY);
9440 }
9441}
9442
9443void __stdcall glResumeTransformFeedback(void)
9444{
9445 EVENT("(void)");
9446
9447 try
9448 {
9449 gl::Context *context = gl::getNonLostContext();
9450
9451 if (context)
9452 {
9453 if (context->getClientVersion() < 3)
9454 {
9455 return gl::error(GL_INVALID_OPERATION);
9456 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009457
Geoff Langc8058452014-02-03 12:04:11 -05009458 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9459 ASSERT(transformFeedback != NULL);
9460
9461 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9462 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9463 {
9464 return gl::error(GL_INVALID_OPERATION);
9465 }
9466
9467 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009468 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009469 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009470 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009471 {
9472 return gl::error(GL_OUT_OF_MEMORY);
9473 }
9474}
9475
9476void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9477{
9478 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9479 program, bufSize, length, binaryFormat, binary);
9480
9481 try
9482 {
9483 gl::Context *context = gl::getNonLostContext();
9484
9485 if (context)
9486 {
9487 if (context->getClientVersion() < 3)
9488 {
9489 return gl::error(GL_INVALID_OPERATION);
9490 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009491
Jamie Madill54133512013-06-21 09:33:07 -04009492 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009493 UNIMPLEMENTED();
9494 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009495 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009496 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009497 {
9498 return gl::error(GL_OUT_OF_MEMORY);
9499 }
9500}
9501
9502void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9503{
9504 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9505 program, binaryFormat, binary, length);
9506
9507 try
9508 {
9509 gl::Context *context = gl::getNonLostContext();
9510
9511 if (context)
9512 {
9513 if (context->getClientVersion() < 3)
9514 {
9515 return gl::error(GL_INVALID_OPERATION);
9516 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009517
Jamie Madill54133512013-06-21 09:33:07 -04009518 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009519 UNIMPLEMENTED();
9520 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009521 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009522 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009523 {
9524 return gl::error(GL_OUT_OF_MEMORY);
9525 }
9526}
9527
9528void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9529{
9530 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9531 program, pname, value);
9532
9533 try
9534 {
9535 gl::Context *context = gl::getNonLostContext();
9536
9537 if (context)
9538 {
9539 if (context->getClientVersion() < 3)
9540 {
9541 return gl::error(GL_INVALID_OPERATION);
9542 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009543
Jamie Madill54133512013-06-21 09:33:07 -04009544 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009545 UNIMPLEMENTED();
9546 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009547 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009548 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009549 {
9550 return gl::error(GL_OUT_OF_MEMORY);
9551 }
9552}
9553
9554void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9555{
9556 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9557 target, numAttachments, attachments);
9558
9559 try
9560 {
9561 gl::Context *context = gl::getNonLostContext();
9562
9563 if (context)
9564 {
9565 if (context->getClientVersion() < 3)
9566 {
9567 return gl::error(GL_INVALID_OPERATION);
9568 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009569
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009570 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009571 {
9572 return;
9573 }
9574
9575 int maxDimension = context->getMaximumRenderbufferDimension();
9576 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9577 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009578 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009579 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009580 {
9581 return gl::error(GL_OUT_OF_MEMORY);
9582 }
9583}
9584
9585void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9586{
9587 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9588 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9589 target, numAttachments, attachments, x, y, width, height);
9590
9591 try
9592 {
9593 gl::Context *context = gl::getNonLostContext();
9594
9595 if (context)
9596 {
9597 if (context->getClientVersion() < 3)
9598 {
9599 return gl::error(GL_INVALID_OPERATION);
9600 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009601
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009602 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009603 {
9604 return;
9605 }
9606
9607 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9608 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009609 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009610 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009611 {
9612 return gl::error(GL_OUT_OF_MEMORY);
9613 }
9614}
9615
9616void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9617{
9618 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9619 target, levels, internalformat, width, height);
9620
9621 try
9622 {
9623 gl::Context *context = gl::getNonLostContext();
9624
9625 if (context)
9626 {
9627 if (context->getClientVersion() < 3)
9628 {
9629 return gl::error(GL_INVALID_OPERATION);
9630 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009631
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009632 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009633 {
9634 return;
9635 }
9636
9637 switch (target)
9638 {
9639 case GL_TEXTURE_2D:
9640 {
9641 gl::Texture2D *texture2d = context->getTexture2D();
9642 texture2d->storage(levels, internalformat, width, height);
9643 }
9644 break;
9645
Geoff Lang01c21d22013-09-24 11:52:16 -04009646 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009647 {
9648 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9649 textureCube->storage(levels, internalformat, width);
9650 }
9651 break;
9652
9653 default:
9654 return gl::error(GL_INVALID_ENUM);
9655 }
9656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009657 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009658 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009659 {
9660 return gl::error(GL_OUT_OF_MEMORY);
9661 }
9662}
9663
9664void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9665{
9666 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9667 "GLsizei height = %d, GLsizei depth = %d)",
9668 target, levels, internalformat, width, height, depth);
9669
9670 try
9671 {
9672 gl::Context *context = gl::getNonLostContext();
9673
9674 if (context)
9675 {
9676 if (context->getClientVersion() < 3)
9677 {
9678 return gl::error(GL_INVALID_OPERATION);
9679 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009680
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009681 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009682 {
9683 return;
9684 }
9685
9686 switch (target)
9687 {
9688 case GL_TEXTURE_3D:
9689 {
9690 gl::Texture3D *texture3d = context->getTexture3D();
9691 texture3d->storage(levels, internalformat, width, height, depth);
9692 }
9693 break;
9694
9695 case GL_TEXTURE_2D_ARRAY:
9696 {
9697 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9698 texture2darray->storage(levels, internalformat, width, height, depth);
9699 }
9700 break;
9701
9702 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009703 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009704 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009705 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009706 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009707 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009708 {
9709 return gl::error(GL_OUT_OF_MEMORY);
9710 }
9711}
9712
9713void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9714{
9715 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9716 "GLint* params = 0x%0.8p)",
9717 target, internalformat, pname, bufSize, params);
9718
9719 try
9720 {
9721 gl::Context *context = gl::getNonLostContext();
9722
9723 if (context)
9724 {
9725 if (context->getClientVersion() < 3)
9726 {
9727 return gl::error(GL_INVALID_OPERATION);
9728 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009729
Geoff Langcec35902014-04-16 10:52:36 -04009730 const gl::TextureCaps &formatCaps = context->getCaps().textureCaps.get(internalformat);
9731 if (!formatCaps.colorRendering && !formatCaps.depthRendering && !formatCaps.stencilRendering)
Shannon Woods809d2502013-07-08 10:32:18 -04009732 {
9733 return gl::error(GL_INVALID_ENUM);
9734 }
9735
9736 if (target != GL_RENDERBUFFER)
9737 {
9738 return gl::error(GL_INVALID_ENUM);
9739 }
9740
9741 if (bufSize < 0)
9742 {
9743 return gl::error(GL_INVALID_VALUE);
9744 }
9745
9746 switch (pname)
9747 {
9748 case GL_NUM_SAMPLE_COUNTS:
9749 if (bufSize != 0)
9750 *params = context->getNumSampleCounts(internalformat);
9751 break;
9752 case GL_SAMPLES:
9753 context->getSampleCounts(internalformat, bufSize, params);
9754 break;
9755 default:
9756 return gl::error(GL_INVALID_ENUM);
9757 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009758 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009759 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009760 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009761 {
9762 return gl::error(GL_OUT_OF_MEMORY);
9763 }
9764}
9765
9766// Extension functions
9767
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009768void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9769 GLbitfield mask, GLenum filter)
9770{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009771 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009772 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9773 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9774 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9775
9776 try
9777 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009778 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009779
9780 if (context)
9781 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009782 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04009783 dstX0, dstY0, dstX1, dstY1, mask, filter,
9784 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009785 {
Geoff Lang758d5b22013-06-11 11:42:50 -04009786 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009787 }
9788
Geoff Lang758d5b22013-06-11 11:42:50 -04009789 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
9790 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009791 }
9792 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009793 catch (...)
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009795 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009796 }
9797}
9798
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009799void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9800 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009801{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009802 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009803 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009804 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009805 target, level, internalformat, width, height, depth, border, format, type, pixels);
9806
9807 try
9808 {
9809 UNIMPLEMENTED(); // FIXME
9810 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009811 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009812 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009813 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009814 }
9815}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009816
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009817void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9818 GLenum *binaryFormat, void *binary)
9819{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009820 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 +00009821 program, bufSize, length, binaryFormat, binary);
9822
9823 try
9824 {
9825 gl::Context *context = gl::getNonLostContext();
9826
9827 if (context)
9828 {
9829 gl::Program *programObject = context->getProgram(program);
9830
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009831 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009833 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009834 }
9835
9836 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9837
9838 if (!programBinary)
9839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009840 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009841 }
9842
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009843 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009845 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009846 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009847
9848 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009849 }
9850 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009851 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009853 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009854 }
9855}
9856
9857void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9858 const void *binary, GLint length)
9859{
9860 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9861 program, binaryFormat, binary, length);
9862
9863 try
9864 {
9865 gl::Context *context = gl::getNonLostContext();
9866
9867 if (context)
9868 {
9869 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009871 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009872 }
9873
9874 gl::Program *programObject = context->getProgram(program);
9875
9876 if (!programObject)
9877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009878 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009879 }
9880
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009881 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009882 }
9883 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009884 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009886 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009887 }
9888}
9889
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009890void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9891{
9892 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9893
9894 try
9895 {
9896 gl::Context *context = gl::getNonLostContext();
9897
9898 if (context)
9899 {
9900 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9901 {
9902 return gl::error(GL_INVALID_VALUE);
9903 }
9904
9905 if (context->getDrawFramebufferHandle() == 0)
9906 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009907 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009908 {
9909 return gl::error(GL_INVALID_OPERATION);
9910 }
9911
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009912 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009913 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009914 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009915 }
9916 }
9917 else
9918 {
9919 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9920 {
9921 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9922 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9923 {
9924 return gl::error(GL_INVALID_OPERATION);
9925 }
9926 }
9927 }
9928
9929 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9930
9931 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9932 {
9933 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9934 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009935
9936 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9937 {
9938 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9939 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009940 }
9941 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009942 catch (...)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009943 {
9944 return gl::error(GL_OUT_OF_MEMORY);
9945 }
9946}
9947
Shannon Woodsb3801742014-03-27 14:59:19 -04009948void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
9949{
9950 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
9951
9952 try
9953 {
9954 gl::Context *context = gl::getNonLostContext();
9955
9956 if (context)
9957 {
Shannon Woodsb3801742014-03-27 14:59:19 -04009958 if (!gl::ValidBufferTarget(context, target))
9959 {
9960 return gl::error(GL_INVALID_ENUM);
9961 }
9962
9963 if (pname != GL_BUFFER_MAP_POINTER)
9964 {
9965 return gl::error(GL_INVALID_ENUM);
9966 }
9967
9968 gl::Buffer *buffer = context->getTargetBuffer(target);
9969
9970 if (!buffer || !buffer->mapped())
9971 {
9972 *params = NULL;
9973 }
9974
9975 *params = buffer->mapPointer();
9976 }
9977 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009978 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009979 {
9980 return gl::error(GL_OUT_OF_MEMORY);
9981 }
9982}
9983
9984void * __stdcall glMapBufferOES(GLenum target, GLenum access)
9985{
9986 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
9987
9988 try
9989 {
9990 gl::Context *context = gl::getNonLostContext();
9991
9992 if (context)
9993 {
9994 if (!gl::ValidBufferTarget(context, target))
9995 {
9996 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9997 }
9998
9999 gl::Buffer *buffer = context->getTargetBuffer(target);
10000
10001 if (buffer == NULL)
10002 {
10003 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10004 }
10005
10006 if (access != GL_WRITE_ONLY_OES)
10007 {
10008 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10009 }
10010
10011 if (buffer->mapped())
10012 {
10013 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10014 }
10015
10016 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
10017 }
10018 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010019 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -040010020 {
10021 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10022 }
10023
10024 return NULL;
10025}
10026
10027GLboolean __stdcall glUnmapBufferOES(GLenum target)
10028{
10029 EVENT("(GLenum target = 0x%X)", target);
10030
10031 try
10032 {
10033 gl::Context *context = gl::getNonLostContext();
10034
10035 if (context)
10036 {
10037 if (!gl::ValidBufferTarget(context, target))
10038 {
10039 return gl::error(GL_INVALID_ENUM, GL_FALSE);
10040 }
10041
10042 gl::Buffer *buffer = context->getTargetBuffer(target);
10043
10044 if (buffer == NULL || !buffer->mapped())
10045 {
10046 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10047 }
10048
10049 // TODO: detect if we had corruption. if so, throw an error and return false.
10050
10051 buffer->unmap();
10052
10053 return GL_TRUE;
10054 }
10055 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010056 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -040010057 {
10058 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10059 }
10060
10061 return GL_FALSE;
10062}
10063
Shannon Woods916e7692014-03-27 16:58:22 -040010064void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
10065{
10066 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
10067 target, offset, length, access);
10068
10069 try
10070 {
10071 gl::Context *context = gl::getNonLostContext();
10072
10073 if (context)
10074 {
10075 if (!gl::ValidBufferTarget(context, target))
10076 {
10077 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10078 }
10079
10080 if (offset < 0 || length < 0)
10081 {
10082 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10083 }
10084
10085 gl::Buffer *buffer = context->getTargetBuffer(target);
10086
10087 if (buffer == NULL)
10088 {
10089 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10090 }
10091
10092 // Check for buffer overflow
10093 size_t offsetSize = static_cast<size_t>(offset);
10094 size_t lengthSize = static_cast<size_t>(length);
10095
10096 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10097 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
10098 {
10099 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10100 }
10101
10102 // Check for invalid bits in the mask
10103 GLbitfield allAccessBits = GL_MAP_READ_BIT |
10104 GL_MAP_WRITE_BIT |
10105 GL_MAP_INVALIDATE_RANGE_BIT |
10106 GL_MAP_INVALIDATE_BUFFER_BIT |
10107 GL_MAP_FLUSH_EXPLICIT_BIT |
10108 GL_MAP_UNSYNCHRONIZED_BIT;
10109
10110 if (access & ~(allAccessBits))
10111 {
10112 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10113 }
10114
10115 if (length == 0 || buffer->mapped())
10116 {
10117 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10118 }
10119
10120 // Check for invalid bit combinations
10121 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10122 {
10123 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10124 }
10125
10126 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10127 GL_MAP_INVALIDATE_BUFFER_BIT |
10128 GL_MAP_UNSYNCHRONIZED_BIT;
10129
10130 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10131 {
10132 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10133 }
10134
10135 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10136 {
10137 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10138 }
10139
10140 return buffer->mapRange(offset, length, access);
10141 }
10142 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010143 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010144 {
10145 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10146 }
10147
10148 return NULL;
10149}
10150
10151void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10152{
10153 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10154
10155 try
10156 {
10157 gl::Context *context = gl::getNonLostContext();
10158
10159 if (context)
10160 {
10161 if (offset < 0 || length < 0)
10162 {
10163 return gl::error(GL_INVALID_VALUE);
10164 }
10165
10166 if (!gl::ValidBufferTarget(context, target))
10167 {
10168 return gl::error(GL_INVALID_ENUM);
10169 }
10170
10171 gl::Buffer *buffer = context->getTargetBuffer(target);
10172
10173 if (buffer == NULL)
10174 {
10175 return gl::error(GL_INVALID_OPERATION);
10176 }
10177
10178 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
10179 {
10180 return gl::error(GL_INVALID_OPERATION);
10181 }
10182
10183 // Check for buffer overflow
10184 size_t offsetSize = static_cast<size_t>(offset);
10185 size_t lengthSize = static_cast<size_t>(length);
10186
10187 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10188 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
10189 {
10190 return gl::error(GL_INVALID_VALUE);
10191 }
10192
10193 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10194 }
10195 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010196 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010197 {
10198 return gl::error(GL_OUT_OF_MEMORY);
10199 }
10200}
10201
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010202__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10203{
10204 struct Extension
10205 {
10206 const char *name;
10207 __eglMustCastToProperFunctionPointerType address;
10208 };
10209
10210 static const Extension glExtensions[] =
10211 {
10212 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010213 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010214 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010215 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10216 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10217 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10218 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10219 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10220 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10221 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010222 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010223 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010224 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10225 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10226 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10227 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010228 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10229 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10230 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10231 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10232 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10233 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10234 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010235 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010236 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10237 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10238 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010239 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010240 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10241 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10242 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -040010243 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10244 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10245 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010246
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010247 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010248 {
10249 if (strcmp(procname, glExtensions[ext].name) == 0)
10250 {
10251 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10252 }
10253 }
10254
10255 return NULL;
10256}
10257
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010258// Non-public functions used by EGL
10259
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010260bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010261{
10262 EVENT("(egl::Surface* surface = 0x%0.8p)",
10263 surface);
10264
10265 try
10266 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010267 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010268
10269 if (context)
10270 {
10271 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010272 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010273
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010274 if (textureObject->isImmutable())
10275 {
10276 return false;
10277 }
10278
Geoff Lang32d508e2014-02-11 09:39:48 -050010279 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010280 }
10281 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010282 catch (...)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010284 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010285 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010286
10287 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010288}
10289
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010290}