blob: a2fea54af7878db177e4bd7574869852034bb155 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
Geoff Lang48dcae72014-02-05 16:28:24 -05003// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040024#include "libGLESv2/VertexArray.h"
Brandon Jones5bf98292014-06-06 17:19:38 -070025#include "libGLESv2/VertexAttribute.h"
Geoff Langc8058452014-02-03 12:04:11 -050026#include "libGLESv2/TransformFeedback.h"
Jamie Madille261b442014-06-25 12:42:21 -040027#include "libGLESv2/FramebufferAttachment.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000028
Geoff Lange8ebe7f2013-08-05 15:03:13 -040029#include "libGLESv2/validationES.h"
30#include "libGLESv2/validationES2.h"
31#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050032#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040033
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000034extern "C"
35{
36
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000037// OpenGL ES 2.0 functions
38
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000039void __stdcall glActiveTexture(GLenum texture)
40{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000041 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000042
Geoff Langbfdea662014-07-23 14:16:32 -040043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000044
Geoff Langbfdea662014-07-23 14:16:32 -040045 if (context)
46 {
47 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000048 {
Geoff Langbfdea662014-07-23 14:16:32 -040049 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000050 }
Geoff Langbfdea662014-07-23 14:16:32 -040051
52 context->getState().setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053 }
54}
55
56void __stdcall glAttachShader(GLuint program, GLuint shader)
57{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000058 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000059
Geoff Langbfdea662014-07-23 14:16:32 -040060 gl::Context *context = gl::getNonLostContext();
61
62 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000063 {
Geoff Langbfdea662014-07-23 14:16:32 -040064 gl::Program *programObject = context->getProgram(program);
65 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000066
Geoff Langbfdea662014-07-23 14:16:32 -040067 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068 {
Geoff Langbfdea662014-07-23 14:16:32 -040069 if (context->getShader(program))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000071 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000072 }
Geoff Langbfdea662014-07-23 14:16:32 -040073 else
74 {
75 return gl::error(GL_INVALID_VALUE);
76 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000077 }
Geoff Langbfdea662014-07-23 14:16:32 -040078
79 if (!shaderObject)
80 {
81 if (context->getProgram(shader))
82 {
83 return gl::error(GL_INVALID_OPERATION);
84 }
85 else
86 {
87 return gl::error(GL_INVALID_VALUE);
88 }
89 }
90
91 if (!programObject->attachShader(shaderObject))
92 {
93 return gl::error(GL_INVALID_OPERATION);
94 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000095 }
96}
97
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000098void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
99{
100 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
101
Geoff Langbfdea662014-07-23 14:16:32 -0400102 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000103
Geoff Langbfdea662014-07-23 14:16:32 -0400104 if (context)
105 {
106 if (!ValidateBeginQuery(context, target, id))
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000107 {
Geoff Langbfdea662014-07-23 14:16:32 -0400108 return;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000109 }
Geoff Langbfdea662014-07-23 14:16:32 -0400110
111 context->beginQuery(target, id);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000112 }
113}
114
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000115void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000116{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000117 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000118
Geoff Langbfdea662014-07-23 14:16:32 -0400119 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000120 {
Geoff Langbfdea662014-07-23 14:16:32 -0400121 return gl::error(GL_INVALID_VALUE);
122 }
123
124 gl::Context *context = gl::getNonLostContext();
125
126 if (context)
127 {
128 gl::Program *programObject = context->getProgram(program);
129
130 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000131 {
Geoff Langbfdea662014-07-23 14:16:32 -0400132 if (context->getShader(program))
daniel@transgaming.com98079832010-04-13 03:26:29 +0000133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000134 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000135 }
Geoff Langbfdea662014-07-23 14:16:32 -0400136 else
137 {
138 return gl::error(GL_INVALID_VALUE);
139 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000140 }
Geoff Langbfdea662014-07-23 14:16:32 -0400141
142 if (strncmp(name, "gl_", 3) == 0)
143 {
144 return gl::error(GL_INVALID_OPERATION);
145 }
146
147 programObject->bindAttributeLocation(index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148 }
149}
150
151void __stdcall glBindBuffer(GLenum target, GLuint buffer)
152{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000153 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000154
Geoff Langbfdea662014-07-23 14:16:32 -0400155 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000156
Geoff Langbfdea662014-07-23 14:16:32 -0400157 if (context)
158 {
159 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000160 {
Geoff Langbfdea662014-07-23 14:16:32 -0400161 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000162 }
Geoff Langbfdea662014-07-23 14:16:32 -0400163
164 switch (target)
165 {
166 case GL_ARRAY_BUFFER:
167 context->bindArrayBuffer(buffer);
168 return;
169 case GL_ELEMENT_ARRAY_BUFFER:
170 context->bindElementArrayBuffer(buffer);
171 return;
172 case GL_COPY_READ_BUFFER:
173 context->bindCopyReadBuffer(buffer);
174 return;
175 case GL_COPY_WRITE_BUFFER:
176 context->bindCopyWriteBuffer(buffer);
177 return;
178 case GL_PIXEL_PACK_BUFFER:
179 context->bindPixelPackBuffer(buffer);
180 return;
181 case GL_PIXEL_UNPACK_BUFFER:
182 context->bindPixelUnpackBuffer(buffer);
183 return;
184 case GL_UNIFORM_BUFFER:
185 context->bindGenericUniformBuffer(buffer);
186 return;
187 case GL_TRANSFORM_FEEDBACK_BUFFER:
188 context->bindGenericTransformFeedbackBuffer(buffer);
189 return;
190 default:
191 return gl::error(GL_INVALID_ENUM);
192 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000193 }
194}
195
196void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
197{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000198 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000199
Geoff Langbfdea662014-07-23 14:16:32 -0400200 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000201 {
Geoff Langbfdea662014-07-23 14:16:32 -0400202 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000203 }
Geoff Langbfdea662014-07-23 14:16:32 -0400204
205 gl::Context *context = gl::getNonLostContext();
206
207 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000208 {
Geoff Langbfdea662014-07-23 14:16:32 -0400209 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
210 {
211 context->bindReadFramebuffer(framebuffer);
212 }
213
214 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
215 {
216 context->bindDrawFramebuffer(framebuffer);
217 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000218 }
219}
220
221void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
222{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000223 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000224
Geoff Langbfdea662014-07-23 14:16:32 -0400225 if (target != GL_RENDERBUFFER)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000226 {
Geoff Langbfdea662014-07-23 14:16:32 -0400227 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000228 }
Geoff Langbfdea662014-07-23 14:16:32 -0400229
230 gl::Context *context = gl::getNonLostContext();
231
232 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000233 {
Geoff Langbfdea662014-07-23 14:16:32 -0400234 context->bindRenderbuffer(renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000235 }
236}
237
238void __stdcall glBindTexture(GLenum target, GLuint texture)
239{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000240 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000241
Geoff Langbfdea662014-07-23 14:16:32 -0400242 gl::Context *context = gl::getNonLostContext();
243
244 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000245 {
Geoff Langbfdea662014-07-23 14:16:32 -0400246 gl::Texture *textureObject = context->getTexture(texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000247
Geoff Langbfdea662014-07-23 14:16:32 -0400248 if (textureObject && textureObject->getTarget() != target && texture != 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000249 {
Geoff Langbfdea662014-07-23 14:16:32 -0400250 return gl::error(GL_INVALID_OPERATION);
251 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000252
Geoff Langbfdea662014-07-23 14:16:32 -0400253 switch (target)
254 {
255 case GL_TEXTURE_2D:
256 context->bindTexture2D(texture);
257 return;
258 case GL_TEXTURE_CUBE_MAP:
259 context->bindTextureCubeMap(texture);
260 return;
261 case GL_TEXTURE_3D:
262 if (context->getClientVersion() < 3)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000264 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000265 }
Geoff Langbfdea662014-07-23 14:16:32 -0400266 context->bindTexture3D(texture);
267 return;
268 case GL_TEXTURE_2D_ARRAY:
269 if (context->getClientVersion() < 3)
270 {
271 return gl::error(GL_INVALID_ENUM);
272 }
273 context->bindTexture2DArray(texture);
274 return;
275 default:
276 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000277 }
278 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000279}
280
281void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
282{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000283 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000284 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000285
Geoff Langbfdea662014-07-23 14:16:32 -0400286 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000287
Geoff Langbfdea662014-07-23 14:16:32 -0400288 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000289 {
Geoff Langbfdea662014-07-23 14:16:32 -0400290 context->getState().setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000291 }
292}
293
294void __stdcall glBlendEquation(GLenum mode)
295{
296 glBlendEquationSeparate(mode, mode);
297}
298
299void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
300{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000301 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000302
Geoff Langbfdea662014-07-23 14:16:32 -0400303 gl::Context *context = gl::getNonLostContext();
304
305 switch (modeRGB)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000306 {
Geoff Langbfdea662014-07-23 14:16:32 -0400307 case GL_FUNC_ADD:
308 case GL_FUNC_SUBTRACT:
309 case GL_FUNC_REVERSE_SUBTRACT:
310 case GL_MIN:
311 case GL_MAX:
312 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000313
Geoff Langbfdea662014-07-23 14:16:32 -0400314 default:
315 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000316 }
Geoff Langbfdea662014-07-23 14:16:32 -0400317
318 switch (modeAlpha)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000319 {
Geoff Langbfdea662014-07-23 14:16:32 -0400320 case GL_FUNC_ADD:
321 case GL_FUNC_SUBTRACT:
322 case GL_FUNC_REVERSE_SUBTRACT:
323 case GL_MIN:
324 case GL_MAX:
325 break;
326
327 default:
328 return gl::error(GL_INVALID_ENUM);
329 }
330
331 if (context)
332 {
333 context->getState().setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000334 }
335}
336
337void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
338{
339 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
340}
341
342void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
343{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000344 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 +0000345 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000346
Geoff Langbfdea662014-07-23 14:16:32 -0400347 gl::Context *context = gl::getNonLostContext();
348
349 switch (srcRGB)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000350 {
Geoff Langbfdea662014-07-23 14:16:32 -0400351 case GL_ZERO:
352 case GL_ONE:
353 case GL_SRC_COLOR:
354 case GL_ONE_MINUS_SRC_COLOR:
355 case GL_DST_COLOR:
356 case GL_ONE_MINUS_DST_COLOR:
357 case GL_SRC_ALPHA:
358 case GL_ONE_MINUS_SRC_ALPHA:
359 case GL_DST_ALPHA:
360 case GL_ONE_MINUS_DST_ALPHA:
361 case GL_CONSTANT_COLOR:
362 case GL_ONE_MINUS_CONSTANT_COLOR:
363 case GL_CONSTANT_ALPHA:
364 case GL_ONE_MINUS_CONSTANT_ALPHA:
365 case GL_SRC_ALPHA_SATURATE:
366 break;
367 default:
368 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000369 }
Geoff Langbfdea662014-07-23 14:16:32 -0400370
371 switch (dstRGB)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000372 {
Geoff Langbfdea662014-07-23 14:16:32 -0400373 case GL_ZERO:
374 case GL_ONE:
375 case GL_SRC_COLOR:
376 case GL_ONE_MINUS_SRC_COLOR:
377 case GL_DST_COLOR:
378 case GL_ONE_MINUS_DST_COLOR:
379 case GL_SRC_ALPHA:
380 case GL_ONE_MINUS_SRC_ALPHA:
381 case GL_DST_ALPHA:
382 case GL_ONE_MINUS_DST_ALPHA:
383 case GL_CONSTANT_COLOR:
384 case GL_ONE_MINUS_CONSTANT_COLOR:
385 case GL_CONSTANT_ALPHA:
386 case GL_ONE_MINUS_CONSTANT_ALPHA:
387 break;
388
389 case GL_SRC_ALPHA_SATURATE:
390 if (!context || context->getClientVersion() < 3)
391 {
392 return gl::error(GL_INVALID_ENUM);
393 }
394 break;
395
396 default:
397 return gl::error(GL_INVALID_ENUM);
398 }
399
400 switch (srcAlpha)
401 {
402 case GL_ZERO:
403 case GL_ONE:
404 case GL_SRC_COLOR:
405 case GL_ONE_MINUS_SRC_COLOR:
406 case GL_DST_COLOR:
407 case GL_ONE_MINUS_DST_COLOR:
408 case GL_SRC_ALPHA:
409 case GL_ONE_MINUS_SRC_ALPHA:
410 case GL_DST_ALPHA:
411 case GL_ONE_MINUS_DST_ALPHA:
412 case GL_CONSTANT_COLOR:
413 case GL_ONE_MINUS_CONSTANT_COLOR:
414 case GL_CONSTANT_ALPHA:
415 case GL_ONE_MINUS_CONSTANT_ALPHA:
416 case GL_SRC_ALPHA_SATURATE:
417 break;
418 default:
419 return gl::error(GL_INVALID_ENUM);
420 }
421
422 switch (dstAlpha)
423 {
424 case GL_ZERO:
425 case GL_ONE:
426 case GL_SRC_COLOR:
427 case GL_ONE_MINUS_SRC_COLOR:
428 case GL_DST_COLOR:
429 case GL_ONE_MINUS_DST_COLOR:
430 case GL_SRC_ALPHA:
431 case GL_ONE_MINUS_SRC_ALPHA:
432 case GL_DST_ALPHA:
433 case GL_ONE_MINUS_DST_ALPHA:
434 case GL_CONSTANT_COLOR:
435 case GL_ONE_MINUS_CONSTANT_COLOR:
436 case GL_CONSTANT_ALPHA:
437 case GL_ONE_MINUS_CONSTANT_ALPHA:
438 break;
439
440 case GL_SRC_ALPHA_SATURATE:
441 if (!context || context->getClientVersion() < 3)
442 {
443 return gl::error(GL_INVALID_ENUM);
444 }
445 break;
446
447 default:
448 return gl::error(GL_INVALID_ENUM);
449 }
450
451 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
452 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
453
454 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
455 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
456
457 if (constantColorUsed && constantAlphaUsed)
458 {
459 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
460 return gl::error(GL_INVALID_OPERATION);
461 }
462
463 if (context)
464 {
465 context->getState().setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000466 }
467}
468
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000469void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000470{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000471 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 +0000472 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000473
Geoff Langbfdea662014-07-23 14:16:32 -0400474 if (size < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000475 {
Geoff Langbfdea662014-07-23 14:16:32 -0400476 return gl::error(GL_INVALID_VALUE);
477 }
478
479 gl::Context *context = gl::getNonLostContext();
480
481 switch (usage)
482 {
483 case GL_STREAM_DRAW:
484 case GL_STATIC_DRAW:
485 case GL_DYNAMIC_DRAW:
486 break;
487
488 case GL_STREAM_READ:
489 case GL_STREAM_COPY:
490 case GL_STATIC_READ:
491 case GL_STATIC_COPY:
492 case GL_DYNAMIC_READ:
493 case GL_DYNAMIC_COPY:
494 if (context && context->getClientVersion() < 3)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000495 {
Geoff Langbfdea662014-07-23 14:16:32 -0400496 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000497 }
Geoff Langbfdea662014-07-23 14:16:32 -0400498 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000499
Geoff Langbfdea662014-07-23 14:16:32 -0400500 default:
501 return gl::error(GL_INVALID_ENUM);
502 }
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000503
Geoff Langbfdea662014-07-23 14:16:32 -0400504 if (context)
505 {
506 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000508 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000509 }
510
Geoff Langbfdea662014-07-23 14:16:32 -0400511 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
512
513 if (!buffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000514 {
Geoff Langbfdea662014-07-23 14:16:32 -0400515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000516 }
Geoff Langbfdea662014-07-23 14:16:32 -0400517
518 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000519 }
520}
521
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000522void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000523{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000524 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 +0000525 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000526
Geoff Langbfdea662014-07-23 14:16:32 -0400527 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000528 {
Geoff Langbfdea662014-07-23 14:16:32 -0400529 return gl::error(GL_INVALID_VALUE);
530 }
531
532 if (data == NULL)
533 {
534 return;
535 }
536
537 gl::Context *context = gl::getNonLostContext();
538
539 if (context)
540 {
541 if (!gl::ValidBufferTarget(context, target))
542 {
543 return gl::error(GL_INVALID_ENUM);
544 }
545
546 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
547
548 if (!buffer)
549 {
550 return gl::error(GL_INVALID_OPERATION);
551 }
552
553 if (buffer->isMapped())
554 {
555 return gl::error(GL_INVALID_OPERATION);
556 }
557
558 // Check for possible overflow of size + offset
559 if (!rx::IsUnsignedAdditionSafe<size_t>(size, offset))
560 {
561 return gl::error(GL_OUT_OF_MEMORY);
562 }
563
564 if (size + offset > buffer->getSize())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000566 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000567 }
568
Geoff Langbfdea662014-07-23 14:16:32 -0400569 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000570 }
571}
572
573GLenum __stdcall glCheckFramebufferStatus(GLenum target)
574{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000575 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000576
Geoff Langbfdea662014-07-23 14:16:32 -0400577 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000578 {
Geoff Langbfdea662014-07-23 14:16:32 -0400579 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000580 }
Geoff Langbfdea662014-07-23 14:16:32 -0400581
582 gl::Context *context = gl::getNonLostContext();
583
584 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000585 {
Geoff Langbfdea662014-07-23 14:16:32 -0400586 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
587 ASSERT(framebuffer);
588 return framebuffer->completeness();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000589 }
590
591 return 0;
592}
593
594void __stdcall glClear(GLbitfield mask)
595{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000596 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000597
Geoff Langbfdea662014-07-23 14:16:32 -0400598 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000599
Geoff Langbfdea662014-07-23 14:16:32 -0400600 if (context)
601 {
602 gl::Framebuffer *framebufferObject = context->getState().getDrawFramebuffer();
603
604 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000605 {
Geoff Langbfdea662014-07-23 14:16:32 -0400606 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000607 }
Geoff Langbfdea662014-07-23 14:16:32 -0400608
609 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
610 {
611 return gl::error(GL_INVALID_VALUE);
612 }
613
614 context->clear(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000615 }
616}
617
618void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
619{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000620 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000621 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000622
Geoff Langbfdea662014-07-23 14:16:32 -0400623 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000624
Geoff Langbfdea662014-07-23 14:16:32 -0400625 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000626 {
Geoff Langbfdea662014-07-23 14:16:32 -0400627 context->getState().setClearColor(red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000628 }
629}
630
631void __stdcall glClearDepthf(GLclampf depth)
632{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000633 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000634
Geoff Langbfdea662014-07-23 14:16:32 -0400635 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000636
Geoff Langbfdea662014-07-23 14:16:32 -0400637 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000638 {
Geoff Langbfdea662014-07-23 14:16:32 -0400639 context->getState().setClearDepth(depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000640 }
641}
642
643void __stdcall glClearStencil(GLint s)
644{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000645 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000646
Geoff Langbfdea662014-07-23 14:16:32 -0400647 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000648
Geoff Langbfdea662014-07-23 14:16:32 -0400649 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000650 {
Geoff Langbfdea662014-07-23 14:16:32 -0400651 context->getState().setClearStencil(s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000652 }
653}
654
655void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
656{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000657 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000658 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000659
Geoff Langbfdea662014-07-23 14:16:32 -0400660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000661
Geoff Langbfdea662014-07-23 14:16:32 -0400662 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000663 {
Geoff Langbfdea662014-07-23 14:16:32 -0400664 context->getState().setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000665 }
666}
667
668void __stdcall glCompileShader(GLuint shader)
669{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000670 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000671
Geoff Langbfdea662014-07-23 14:16:32 -0400672 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000673
Geoff Langbfdea662014-07-23 14:16:32 -0400674 if (context)
675 {
676 gl::Shader *shaderObject = context->getShader(shader);
677
678 if (!shaderObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000679 {
Geoff Langbfdea662014-07-23 14:16:32 -0400680 if (context->getProgram(shader))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000681 {
Geoff Langbfdea662014-07-23 14:16:32 -0400682 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000683 }
Geoff Langbfdea662014-07-23 14:16:32 -0400684 else
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000686 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000687 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000688 }
Geoff Langbfdea662014-07-23 14:16:32 -0400689
690 shaderObject->compile();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000691 }
Geoff Langbfdea662014-07-23 14:16:32 -0400692}
693
694void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
695 GLint border, GLsizei imageSize, const GLvoid* data)
696{
697 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
698 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
699 target, level, internalformat, width, height, border, imageSize, data);
700
701 gl::Context *context = gl::getNonLostContext();
702
703 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000704 {
Geoff Langbfdea662014-07-23 14:16:32 -0400705 if (context->getClientVersion() < 3 &&
706 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
707 0, 0, width, height, border, GL_NONE, GL_NONE, data))
708 {
709 return;
710 }
711
712 if (context->getClientVersion() >= 3 &&
713 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
714 0, 0, 0, width, height, 1, border, GL_NONE, GL_NONE, data))
715 {
716 return;
717 }
718
Geoff Lang5d601382014-07-22 15:14:06 -0400719 const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalformat);
720 if (imageSize < 0 || static_cast<GLuint>(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
Geoff Langbfdea662014-07-23 14:16:32 -0400721 {
722 return gl::error(GL_INVALID_VALUE);
723 }
724
725 switch (target)
726 {
727 case GL_TEXTURE_2D:
728 {
729 gl::Texture2D *texture = context->getTexture2D();
730 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
731 }
732 break;
733
734 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
735 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
736 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
737 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
738 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
739 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
740 {
741 gl::TextureCubeMap *texture = context->getTextureCubeMap();
742 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
743 }
744 break;
745
746 default:
747 return gl::error(GL_INVALID_ENUM);
748 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000749 }
750}
751
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000752void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
753 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000754{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000755 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000756 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000757 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000758 target, level, xoffset, yoffset, width, height, format, imageSize, data);
759
Geoff Langbfdea662014-07-23 14:16:32 -0400760 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000761
Geoff Langbfdea662014-07-23 14:16:32 -0400762 if (context)
763 {
764 if (context->getClientVersion() < 3 &&
765 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
766 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
daniel@transgaming.com01868132010-08-24 19:21:17 +0000767 {
Geoff Langbfdea662014-07-23 14:16:32 -0400768 return;
daniel@transgaming.com01868132010-08-24 19:21:17 +0000769 }
Geoff Langbfdea662014-07-23 14:16:32 -0400770
771 if (context->getClientVersion() >= 3 &&
772 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
773 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
774 {
775 return;
776 }
777
Geoff Lang5d601382014-07-22 15:14:06 -0400778 const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(format);
779 if (imageSize < 0 || static_cast<GLuint>(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
Geoff Langbfdea662014-07-23 14:16:32 -0400780 {
781 return gl::error(GL_INVALID_VALUE);
782 }
783
784 switch (target)
785 {
786 case GL_TEXTURE_2D:
787 {
788 gl::Texture2D *texture = context->getTexture2D();
789 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
790 }
791 break;
792
793 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
794 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
795 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
796 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
797 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
798 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
799 {
800 gl::TextureCubeMap *texture = context->getTextureCubeMap();
801 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
802 }
803 break;
804
805 default:
806 return gl::error(GL_INVALID_ENUM);
807 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000808 }
809}
810
811void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
812{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000813 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000814 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000815 target, level, internalformat, x, y, width, height, border);
816
Geoff Langbfdea662014-07-23 14:16:32 -0400817 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000818
Geoff Langbfdea662014-07-23 14:16:32 -0400819 if (context)
820 {
821 if (context->getClientVersion() < 3 &&
822 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
823 0, 0, x, y, width, height, border))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000824 {
Geoff Langbfdea662014-07-23 14:16:32 -0400825 return;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000826 }
Geoff Langbfdea662014-07-23 14:16:32 -0400827
828 if (context->getClientVersion() >= 3 &&
829 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
830 0, 0, 0, x, y, width, height, border))
831 {
832 return;
833 }
834
835 gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
836
837 switch (target)
838 {
839 case GL_TEXTURE_2D:
840 {
841 gl::Texture2D *texture = context->getTexture2D();
842 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
843 }
844 break;
845
846 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
847 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
848 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
849 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
850 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
851 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
852 {
853 gl::TextureCubeMap *texture = context->getTextureCubeMap();
854 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
855 }
856 break;
857
858 default:
859 return gl::error(GL_INVALID_ENUM);
860 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000861 }
862}
863
864void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
865{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000866 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000867 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000868 target, level, xoffset, yoffset, x, y, width, height);
869
Geoff Langbfdea662014-07-23 14:16:32 -0400870 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000871
Geoff Langbfdea662014-07-23 14:16:32 -0400872 if (context)
873 {
874 if (context->getClientVersion() < 3 &&
875 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
876 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000877 {
Geoff Langbfdea662014-07-23 14:16:32 -0400878 return;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000879 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000880
Geoff Langbfdea662014-07-23 14:16:32 -0400881 if (context->getClientVersion() >= 3 &&
882 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
883 xoffset, yoffset, 0, x, y, width, height, 0))
884 {
885 return;
886 }
887
888 gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
889
890 switch (target)
891 {
892 case GL_TEXTURE_2D:
893 {
894 gl::Texture2D *texture = context->getTexture2D();
895 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
896 }
897 break;
898
899 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
900 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
901 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
902 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
903 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
904 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
905 {
906 gl::TextureCubeMap *texture = context->getTextureCubeMap();
907 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
908 }
909 break;
910
911 default:
912 return gl::error(GL_INVALID_ENUM);
913 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000914 }
915}
916
917GLuint __stdcall glCreateProgram(void)
918{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000919 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000920
Geoff Langbfdea662014-07-23 14:16:32 -0400921 gl::Context *context = gl::getNonLostContext();
922 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000923 {
Geoff Langbfdea662014-07-23 14:16:32 -0400924 return context->createProgram();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000925 }
926
927 return 0;
928}
929
930GLuint __stdcall glCreateShader(GLenum type)
931{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000932 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000933
Geoff Langbfdea662014-07-23 14:16:32 -0400934 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000935
Geoff Langbfdea662014-07-23 14:16:32 -0400936 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000937 {
Geoff Langbfdea662014-07-23 14:16:32 -0400938 switch (type)
939 {
940 case GL_FRAGMENT_SHADER:
941 case GL_VERTEX_SHADER:
942 return context->createShader(type);
943 default:
944 return gl::error(GL_INVALID_ENUM, 0);
945 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000946 }
947
948 return 0;
949}
950
951void __stdcall glCullFace(GLenum mode)
952{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000953 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000954
Geoff Langbfdea662014-07-23 14:16:32 -0400955 switch (mode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000956 {
Geoff Langbfdea662014-07-23 14:16:32 -0400957 case GL_FRONT:
958 case GL_BACK:
959 case GL_FRONT_AND_BACK:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000960 {
Geoff Langbfdea662014-07-23 14:16:32 -0400961 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000962
Geoff Langbfdea662014-07-23 14:16:32 -0400963 if (context)
964 {
965 context->getState().setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000966 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000967 }
Geoff Langbfdea662014-07-23 14:16:32 -0400968 break;
969 default:
970 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000971 }
972}
973
974void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
975{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000976 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000977
Geoff Langbfdea662014-07-23 14:16:32 -0400978 if (n < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000979 {
Geoff Langbfdea662014-07-23 14:16:32 -0400980 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000981 }
Geoff Langbfdea662014-07-23 14:16:32 -0400982
983 gl::Context *context = gl::getNonLostContext();
984
985 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000986 {
Geoff Langbfdea662014-07-23 14:16:32 -0400987 for (int i = 0; i < n; i++)
988 {
989 context->deleteBuffer(buffers[i]);
990 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000991 }
992}
993
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +0000994void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
995{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000996 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +0000997
Geoff Langbfdea662014-07-23 14:16:32 -0400998 if (n < 0)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +0000999 {
Geoff Langbfdea662014-07-23 14:16:32 -04001000 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001001 }
Geoff Langbfdea662014-07-23 14:16:32 -04001002
1003 gl::Context *context = gl::getNonLostContext();
1004
1005 if (context)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001006 {
Geoff Langbfdea662014-07-23 14:16:32 -04001007 for (int i = 0; i < n; i++)
1008 {
1009 context->deleteFenceNV(fences[i]);
1010 }
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001011 }
1012}
1013
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001014void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1015{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001016 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001017
Geoff Langbfdea662014-07-23 14:16:32 -04001018 if (n < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001019 {
Geoff Langbfdea662014-07-23 14:16:32 -04001020 return gl::error(GL_INVALID_VALUE);
1021 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001022
Geoff Langbfdea662014-07-23 14:16:32 -04001023 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001024
Geoff Langbfdea662014-07-23 14:16:32 -04001025 if (context)
1026 {
1027 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001028 {
Geoff Langbfdea662014-07-23 14:16:32 -04001029 if (framebuffers[i] != 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001030 {
Geoff Langbfdea662014-07-23 14:16:32 -04001031 context->deleteFramebuffer(framebuffers[i]);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001032 }
1033 }
1034 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001035}
1036
1037void __stdcall glDeleteProgram(GLuint program)
1038{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001039 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001040
Geoff Langbfdea662014-07-23 14:16:32 -04001041 if (program == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001042 {
Geoff Langbfdea662014-07-23 14:16:32 -04001043 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001044 }
Geoff Langbfdea662014-07-23 14:16:32 -04001045
1046 gl::Context *context = gl::getNonLostContext();
1047
1048 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001049 {
Geoff Langbfdea662014-07-23 14:16:32 -04001050 if (!context->getProgram(program))
1051 {
1052 if(context->getShader(program))
1053 {
1054 return gl::error(GL_INVALID_OPERATION);
1055 }
1056 else
1057 {
1058 return gl::error(GL_INVALID_VALUE);
1059 }
1060 }
1061
1062 context->deleteProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001063 }
1064}
1065
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001066void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1067{
1068 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1069
Geoff Langbfdea662014-07-23 14:16:32 -04001070 if (n < 0)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001071 {
Geoff Langbfdea662014-07-23 14:16:32 -04001072 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001073 }
Geoff Langbfdea662014-07-23 14:16:32 -04001074
1075 gl::Context *context = gl::getNonLostContext();
1076
1077 if (context)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001078 {
Geoff Langbfdea662014-07-23 14:16:32 -04001079 for (int i = 0; i < n; i++)
1080 {
1081 context->deleteQuery(ids[i]);
1082 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001083 }
1084}
1085
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001086void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1087{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001088 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001089
Geoff Langbfdea662014-07-23 14:16:32 -04001090 if (n < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001091 {
Geoff Langbfdea662014-07-23 14:16:32 -04001092 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001093 }
Geoff Langbfdea662014-07-23 14:16:32 -04001094
1095 gl::Context *context = gl::getNonLostContext();
1096
1097 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001098 {
Geoff Langbfdea662014-07-23 14:16:32 -04001099 for (int i = 0; i < n; i++)
1100 {
1101 context->deleteRenderbuffer(renderbuffers[i]);
1102 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001103 }
1104}
1105
1106void __stdcall glDeleteShader(GLuint shader)
1107{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001108 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001109
Geoff Langbfdea662014-07-23 14:16:32 -04001110 if (shader == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001111 {
Geoff Langbfdea662014-07-23 14:16:32 -04001112 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001113 }
Geoff Langbfdea662014-07-23 14:16:32 -04001114
1115 gl::Context *context = gl::getNonLostContext();
1116
1117 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001118 {
Geoff Langbfdea662014-07-23 14:16:32 -04001119 if (!context->getShader(shader))
1120 {
1121 if(context->getProgram(shader))
1122 {
1123 return gl::error(GL_INVALID_OPERATION);
1124 }
1125 else
1126 {
1127 return gl::error(GL_INVALID_VALUE);
1128 }
1129 }
1130
1131 context->deleteShader(shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001132 }
1133}
1134
1135void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1136{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001137 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001138
Geoff Langbfdea662014-07-23 14:16:32 -04001139 if (n < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001140 {
Geoff Langbfdea662014-07-23 14:16:32 -04001141 return gl::error(GL_INVALID_VALUE);
1142 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001143
Geoff Langbfdea662014-07-23 14:16:32 -04001144 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001145
Geoff Langbfdea662014-07-23 14:16:32 -04001146 if (context)
1147 {
1148 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001149 {
Geoff Langbfdea662014-07-23 14:16:32 -04001150 if (textures[i] != 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001151 {
Geoff Langbfdea662014-07-23 14:16:32 -04001152 context->deleteTexture(textures[i]);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001153 }
1154 }
1155 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001156}
1157
1158void __stdcall glDepthFunc(GLenum func)
1159{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001160 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001161
Geoff Langbfdea662014-07-23 14:16:32 -04001162 switch (func)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001163 {
Geoff Langbfdea662014-07-23 14:16:32 -04001164 case GL_NEVER:
1165 case GL_ALWAYS:
1166 case GL_LESS:
1167 case GL_LEQUAL:
1168 case GL_EQUAL:
1169 case GL_GREATER:
1170 case GL_GEQUAL:
1171 case GL_NOTEQUAL:
1172 break;
1173 default:
1174 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001175 }
Geoff Langbfdea662014-07-23 14:16:32 -04001176
1177 gl::Context *context = gl::getNonLostContext();
1178
1179 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001180 {
Geoff Langbfdea662014-07-23 14:16:32 -04001181 context->getState().setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001182 }
1183}
1184
1185void __stdcall glDepthMask(GLboolean flag)
1186{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001187 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001188
Geoff Langbfdea662014-07-23 14:16:32 -04001189 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001190
Geoff Langbfdea662014-07-23 14:16:32 -04001191 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001192 {
Geoff Langbfdea662014-07-23 14:16:32 -04001193 context->getState().setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001194 }
1195}
1196
1197void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1198{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001199 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001200
Geoff Langbfdea662014-07-23 14:16:32 -04001201 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001202
Geoff Langbfdea662014-07-23 14:16:32 -04001203 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001204 {
Geoff Langbfdea662014-07-23 14:16:32 -04001205 context->getState().setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001206 }
1207}
1208
1209void __stdcall glDetachShader(GLuint program, GLuint shader)
1210{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001211 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001212
Geoff Langbfdea662014-07-23 14:16:32 -04001213 gl::Context *context = gl::getNonLostContext();
1214
1215 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001216 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001217
Geoff Langbfdea662014-07-23 14:16:32 -04001218 gl::Program *programObject = context->getProgram(program);
1219 gl::Shader *shaderObject = context->getShader(shader);
1220
1221 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001222 {
Geoff Langbfdea662014-07-23 14:16:32 -04001223 gl::Shader *shaderByProgramHandle;
1224 shaderByProgramHandle = context->getShader(program);
1225 if (!shaderByProgramHandle)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001226 {
Geoff Langbfdea662014-07-23 14:16:32 -04001227 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001228 }
Geoff Langbfdea662014-07-23 14:16:32 -04001229 else
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001231 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001232 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001233 }
Geoff Langbfdea662014-07-23 14:16:32 -04001234
1235 if (!shaderObject)
1236 {
1237 gl::Program *programByShaderHandle = context->getProgram(shader);
1238 if (!programByShaderHandle)
1239 {
1240 return gl::error(GL_INVALID_VALUE);
1241 }
1242 else
1243 {
1244 return gl::error(GL_INVALID_OPERATION);
1245 }
1246 }
1247
1248 if (!programObject->detachShader(shaderObject))
1249 {
1250 return gl::error(GL_INVALID_OPERATION);
1251 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001252 }
1253}
1254
1255void __stdcall glDisable(GLenum cap)
1256{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001257 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001258
Geoff Langbfdea662014-07-23 14:16:32 -04001259 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001260
Geoff Langbfdea662014-07-23 14:16:32 -04001261 if (context)
1262 {
1263 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001264 {
Geoff Langbfdea662014-07-23 14:16:32 -04001265 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001266 }
Geoff Langbfdea662014-07-23 14:16:32 -04001267
1268 context->getState().setEnableFeature(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001269 }
1270}
1271
1272void __stdcall glDisableVertexAttribArray(GLuint index)
1273{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001274 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001275
Geoff Langbfdea662014-07-23 14:16:32 -04001276 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001277 {
Geoff Langbfdea662014-07-23 14:16:32 -04001278 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001279 }
Geoff Langbfdea662014-07-23 14:16:32 -04001280
1281 gl::Context *context = gl::getNonLostContext();
1282
1283 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001284 {
Geoff Langbfdea662014-07-23 14:16:32 -04001285 context->getState().setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001286 }
1287}
1288
1289void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1290{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001291 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001292
Geoff Langbfdea662014-07-23 14:16:32 -04001293 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001294
Geoff Langbfdea662014-07-23 14:16:32 -04001295 if (context)
1296 {
Jamie Madill2b976812014-08-25 15:47:49 -04001297 if (!ValidateDrawArrays(context, mode, first, count, 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001298 {
Geoff Langbfdea662014-07-23 14:16:32 -04001299 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001300 }
Geoff Langbfdea662014-07-23 14:16:32 -04001301
1302 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001303 }
1304}
1305
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001306void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1307{
1308 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1309
Geoff Langbfdea662014-07-23 14:16:32 -04001310 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001311
Geoff Langbfdea662014-07-23 14:16:32 -04001312 if (context)
1313 {
1314 if (!ValidateDrawArraysInstanced(context, mode, first, count, primcount))
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001315 {
Geoff Langbfdea662014-07-23 14:16:32 -04001316 return;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001317 }
Geoff Langbfdea662014-07-23 14:16:32 -04001318
1319 context->drawArrays(mode, first, count, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001320 }
1321}
1322
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001323void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001324{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001325 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 +00001326 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001327
Geoff Langbfdea662014-07-23 14:16:32 -04001328 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001329
Geoff Langbfdea662014-07-23 14:16:32 -04001330 if (context)
1331 {
Jamie Madill2b976812014-08-25 15:47:49 -04001332 rx::RangeUI indexRange;
1333 if (!ValidateDrawElements(context, mode, count, type, indices, 0, &indexRange))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001334 {
Geoff Langbfdea662014-07-23 14:16:32 -04001335 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001336 }
Geoff Langbfdea662014-07-23 14:16:32 -04001337
Jamie Madill2b976812014-08-25 15:47:49 -04001338 context->drawElements(mode, count, type, indices, 0, indexRange);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001339 }
1340}
1341
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001342void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1343{
1344 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1345 mode, count, type, indices, primcount);
1346
Geoff Langbfdea662014-07-23 14:16:32 -04001347 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001348
Geoff Langbfdea662014-07-23 14:16:32 -04001349 if (context)
1350 {
Jamie Madill2b976812014-08-25 15:47:49 -04001351 rx::RangeUI indexRange;
1352 if (!ValidateDrawElementsInstanced(context, mode, count, type, indices, primcount, &indexRange))
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001353 {
Geoff Langbfdea662014-07-23 14:16:32 -04001354 return;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001355 }
Geoff Langbfdea662014-07-23 14:16:32 -04001356
Jamie Madill2b976812014-08-25 15:47:49 -04001357 context->drawElements(mode, count, type, indices, primcount, indexRange);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001358 }
1359}
1360
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001361void __stdcall glEnable(GLenum cap)
1362{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001363 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001364
Geoff Langbfdea662014-07-23 14:16:32 -04001365 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001366
Geoff Langbfdea662014-07-23 14:16:32 -04001367 if (context)
1368 {
1369 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001370 {
Geoff Langbfdea662014-07-23 14:16:32 -04001371 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001372 }
Geoff Langbfdea662014-07-23 14:16:32 -04001373
1374 context->getState().setEnableFeature(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001375 }
1376}
1377
1378void __stdcall glEnableVertexAttribArray(GLuint index)
1379{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001380 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001381
Geoff Langbfdea662014-07-23 14:16:32 -04001382 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001383 {
Geoff Langbfdea662014-07-23 14:16:32 -04001384 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001385 }
Geoff Langbfdea662014-07-23 14:16:32 -04001386
1387 gl::Context *context = gl::getNonLostContext();
1388
1389 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001390 {
Geoff Langbfdea662014-07-23 14:16:32 -04001391 context->getState().setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001392 }
1393}
1394
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001395void __stdcall glEndQueryEXT(GLenum target)
1396{
1397 EVENT("GLenum target = 0x%X)", target);
1398
Geoff Langbfdea662014-07-23 14:16:32 -04001399 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001400
Geoff Langbfdea662014-07-23 14:16:32 -04001401 if (context)
1402 {
1403 if (!ValidateEndQuery(context, target))
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001404 {
Geoff Langbfdea662014-07-23 14:16:32 -04001405 return;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001406 }
Geoff Langbfdea662014-07-23 14:16:32 -04001407
1408 context->endQuery(target);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001409 }
1410}
1411
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001412void __stdcall glFinishFenceNV(GLuint fence)
1413{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001414 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001415
Geoff Langbfdea662014-07-23 14:16:32 -04001416 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001417
Geoff Langbfdea662014-07-23 14:16:32 -04001418 if (context)
1419 {
1420 gl::FenceNV *fenceObject = context->getFenceNV(fence);
1421
1422 if (fenceObject == NULL)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001423 {
Geoff Langbfdea662014-07-23 14:16:32 -04001424 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001425 }
Geoff Langbfdea662014-07-23 14:16:32 -04001426
1427 if (fenceObject->isFence() != GL_TRUE)
1428 {
1429 return gl::error(GL_INVALID_OPERATION);
1430 }
1431
1432 fenceObject->finishFence();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001433 }
1434}
1435
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001436void __stdcall glFinish(void)
1437{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001438 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001439
Geoff Langbfdea662014-07-23 14:16:32 -04001440 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001441
Geoff Langbfdea662014-07-23 14:16:32 -04001442 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001443 {
Geoff Langbfdea662014-07-23 14:16:32 -04001444 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001445 }
1446}
1447
1448void __stdcall glFlush(void)
1449{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001450 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001451
Geoff Langbfdea662014-07-23 14:16:32 -04001452 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001453
Geoff Langbfdea662014-07-23 14:16:32 -04001454 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001455 {
Geoff Langbfdea662014-07-23 14:16:32 -04001456 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001457 }
1458}
1459
1460void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1461{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001462 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001463 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001464
Geoff Langbfdea662014-07-23 14:16:32 -04001465 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001466 {
Geoff Langbfdea662014-07-23 14:16:32 -04001467 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001468 }
Geoff Langbfdea662014-07-23 14:16:32 -04001469
1470 gl::Context *context = gl::getNonLostContext();
1471
1472 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001473 {
Geoff Langbfdea662014-07-23 14:16:32 -04001474 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
1475 {
1476 return;
1477 }
1478
1479 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
1480 ASSERT(framebuffer);
1481
1482 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
1483 {
1484 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
1485 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
1486 }
1487 else
1488 {
1489 switch (attachment)
1490 {
1491 case GL_DEPTH_ATTACHMENT:
1492 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1493 break;
1494 case GL_STENCIL_ATTACHMENT:
1495 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1496 break;
1497 case GL_DEPTH_STENCIL_ATTACHMENT:
1498 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1499 break;
1500 default:
1501 UNREACHABLE();
1502 break;
1503 }
1504 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001505 }
1506}
1507
1508void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1509{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001510 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001511 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001512
Geoff Langbfdea662014-07-23 14:16:32 -04001513 gl::Context *context = gl::getNonLostContext();
1514 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001515 {
Geoff Langbfdea662014-07-23 14:16:32 -04001516 if (!ValidateFramebufferTexture2D(context, target, attachment, textarget, texture, level))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001517 {
Geoff Langbfdea662014-07-23 14:16:32 -04001518 return;
1519 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001520
Geoff Langbfdea662014-07-23 14:16:32 -04001521 if (texture == 0)
1522 {
1523 textarget = GL_NONE;
1524 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001525
Geoff Langbfdea662014-07-23 14:16:32 -04001526 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001527
Geoff Langbfdea662014-07-23 14:16:32 -04001528 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
1529 {
1530 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
1531 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
1532 }
1533 else
1534 {
1535 switch (attachment)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001536 {
Geoff Langbfdea662014-07-23 14:16:32 -04001537 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
1538 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
1539 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001540 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001541 }
1542 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001543}
1544
1545void __stdcall glFrontFace(GLenum mode)
1546{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001547 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001548
Geoff Langbfdea662014-07-23 14:16:32 -04001549 switch (mode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001550 {
Geoff Langbfdea662014-07-23 14:16:32 -04001551 case GL_CW:
1552 case GL_CCW:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001553 {
Geoff Langbfdea662014-07-23 14:16:32 -04001554 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001555
Geoff Langbfdea662014-07-23 14:16:32 -04001556 if (context)
1557 {
1558 context->getState().setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001559 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001560 }
Geoff Langbfdea662014-07-23 14:16:32 -04001561 break;
1562 default:
1563 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001564 }
1565}
1566
1567void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
1568{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001569 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001570
Geoff Langbfdea662014-07-23 14:16:32 -04001571 if (n < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001572 {
Geoff Langbfdea662014-07-23 14:16:32 -04001573 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001574 }
Geoff Langbfdea662014-07-23 14:16:32 -04001575
1576 gl::Context *context = gl::getNonLostContext();
1577
1578 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001579 {
Geoff Langbfdea662014-07-23 14:16:32 -04001580 for (int i = 0; i < n; i++)
1581 {
1582 buffers[i] = context->createBuffer();
1583 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001584 }
1585}
1586
1587void __stdcall glGenerateMipmap(GLenum target)
1588{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001589 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001590
Geoff Langbfdea662014-07-23 14:16:32 -04001591 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001592
Geoff Langbfdea662014-07-23 14:16:32 -04001593 if (context)
1594 {
1595 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001596 {
Geoff Langbfdea662014-07-23 14:16:32 -04001597 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001598 }
Geoff Langbfdea662014-07-23 14:16:32 -04001599
1600 gl::Texture *texture = context->getTargetTexture(target);
1601
1602 if (texture == NULL)
1603 {
1604 return gl::error(GL_INVALID_OPERATION);
1605 }
1606
1607 GLenum internalFormat = texture->getBaseLevelInternalFormat();
1608 const gl::TextureCaps &formatCaps = context->getTextureCaps().get(internalFormat);
Geoff Lang5d601382014-07-22 15:14:06 -04001609 const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalFormat);
Geoff Langbfdea662014-07-23 14:16:32 -04001610
1611 // GenerateMipmap should not generate an INVALID_OPERATION for textures created with
1612 // unsized formats or that are color renderable and filterable. Since we do not track if
1613 // the texture was created with sized or unsized format (only sized formats are stored),
1614 // it is not possible to make sure the the LUMA formats can generate mipmaps (they should
1615 // be able to) because they aren't color renderable. Simply do a special case for LUMA
1616 // textures since they're the only texture format that can be created with unsized formats
1617 // that is not color renderable. New unsized formats are unlikely to be added, since ES2
1618 // was the last version to use add them.
1619 bool isLUMA = internalFormat == GL_LUMINANCE8_EXT ||
1620 internalFormat == GL_LUMINANCE8_ALPHA8_EXT ||
1621 internalFormat == GL_ALPHA8_EXT;
1622
Geoff Lang5d601382014-07-22 15:14:06 -04001623 if (formatInfo.depthBits > 0 || formatInfo.stencilBits > 0 || !formatCaps.filterable ||
1624 (!formatCaps.renderable && !isLUMA) || formatInfo.compressed)
Geoff Langbfdea662014-07-23 14:16:32 -04001625 {
1626 return gl::error(GL_INVALID_OPERATION);
1627 }
1628
1629 // GL_EXT_sRGB does not support mipmap generation on sRGB textures
Geoff Lang5d601382014-07-22 15:14:06 -04001630 if (context->getClientVersion() == 2 && formatInfo.colorEncoding == GL_SRGB)
Geoff Langbfdea662014-07-23 14:16:32 -04001631 {
1632 return gl::error(GL_INVALID_OPERATION);
1633 }
1634
1635 // Non-power of 2 ES2 check
1636 if (!context->getExtensions().textureNPOT && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
1637 {
1638 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
1639 return gl::error(GL_INVALID_OPERATION);
1640 }
1641
1642 // Cube completeness check
1643 if (target == GL_TEXTURE_CUBE_MAP)
1644 {
1645 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
1646 if (!textureCube->isCubeComplete())
1647 {
1648 return gl::error(GL_INVALID_OPERATION);
1649 }
1650 }
1651
1652 texture->generateMipmaps();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001653 }
1654}
1655
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001656void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
1657{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001658 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001659
Geoff Langbfdea662014-07-23 14:16:32 -04001660 if (n < 0)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001661 {
Geoff Langbfdea662014-07-23 14:16:32 -04001662 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001663 }
Geoff Langbfdea662014-07-23 14:16:32 -04001664
1665 gl::Context *context = gl::getNonLostContext();
1666
1667 if (context)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001668 {
Geoff Langbfdea662014-07-23 14:16:32 -04001669 for (int i = 0; i < n; i++)
1670 {
1671 fences[i] = context->createFenceNV();
1672 }
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001673 }
1674}
1675
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001676void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
1677{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001678 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001679
Geoff Langbfdea662014-07-23 14:16:32 -04001680 if (n < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001681 {
Geoff Langbfdea662014-07-23 14:16:32 -04001682 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001683 }
Geoff Langbfdea662014-07-23 14:16:32 -04001684
1685 gl::Context *context = gl::getNonLostContext();
1686
1687 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001688 {
Geoff Langbfdea662014-07-23 14:16:32 -04001689 for (int i = 0; i < n; i++)
1690 {
1691 framebuffers[i] = context->createFramebuffer();
1692 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001693 }
1694}
1695
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001696void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
1697{
1698 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
1699
Geoff Langbfdea662014-07-23 14:16:32 -04001700 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001701
Geoff Langbfdea662014-07-23 14:16:32 -04001702 if (context)
1703 {
1704 if (n < 0)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001705 {
Geoff Langbfdea662014-07-23 14:16:32 -04001706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001707 }
Geoff Langbfdea662014-07-23 14:16:32 -04001708
1709 for (GLsizei i = 0; i < n; i++)
1710 {
1711 ids[i] = context->createQuery();
1712 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001713 }
1714}
1715
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001716void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
1717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001718 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001719
Geoff Langbfdea662014-07-23 14:16:32 -04001720 if (n < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001721 {
Geoff Langbfdea662014-07-23 14:16:32 -04001722 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001723 }
Geoff Langbfdea662014-07-23 14:16:32 -04001724
1725 gl::Context *context = gl::getNonLostContext();
1726
1727 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001728 {
Geoff Langbfdea662014-07-23 14:16:32 -04001729 for (int i = 0; i < n; i++)
1730 {
1731 renderbuffers[i] = context->createRenderbuffer();
1732 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001733 }
1734}
1735
1736void __stdcall glGenTextures(GLsizei n, GLuint* textures)
1737{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001738 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001739
Geoff Langbfdea662014-07-23 14:16:32 -04001740 if (n < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001741 {
Geoff Langbfdea662014-07-23 14:16:32 -04001742 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001743 }
Geoff Langbfdea662014-07-23 14:16:32 -04001744
1745 gl::Context *context = gl::getNonLostContext();
1746
1747 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001748 {
Geoff Langbfdea662014-07-23 14:16:32 -04001749 for (int i = 0; i < n; i++)
1750 {
1751 textures[i] = context->createTexture();
1752 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001753 }
1754}
1755
daniel@transgaming.com85423182010-04-22 13:35:27 +00001756void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001757{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001758 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00001759 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001760 program, index, bufsize, length, size, type, name);
1761
Geoff Langbfdea662014-07-23 14:16:32 -04001762 if (bufsize < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001763 {
Geoff Langbfdea662014-07-23 14:16:32 -04001764 return gl::error(GL_INVALID_VALUE);
1765 }
1766
1767 gl::Context *context = gl::getNonLostContext();
1768
1769 if (context)
1770 {
1771 gl::Program *programObject = context->getProgram(program);
1772
1773 if (!programObject)
1774 {
1775 if (context->getShader(program))
1776 {
1777 return gl::error(GL_INVALID_OPERATION);
1778 }
1779 else
1780 {
1781 return gl::error(GL_INVALID_VALUE);
1782 }
1783 }
1784
1785 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001787 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001788 }
1789
Geoff Langbfdea662014-07-23 14:16:32 -04001790 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001791 }
1792}
1793
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001794void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001795{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001796 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001797 "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 +00001798 program, index, bufsize, length, size, type, name);
1799
Geoff Langbfdea662014-07-23 14:16:32 -04001800 if (bufsize < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001801 {
Geoff Langbfdea662014-07-23 14:16:32 -04001802 return gl::error(GL_INVALID_VALUE);
1803 }
1804
1805 gl::Context *context = gl::getNonLostContext();
1806
1807 if (context)
1808 {
1809 gl::Program *programObject = context->getProgram(program);
1810
1811 if (!programObject)
1812 {
1813 if (context->getShader(program))
1814 {
1815 return gl::error(GL_INVALID_OPERATION);
1816 }
1817 else
1818 {
1819 return gl::error(GL_INVALID_VALUE);
1820 }
1821 }
1822
1823 if (index >= (GLuint)programObject->getActiveUniformCount())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001825 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001826 }
1827
Geoff Langbfdea662014-07-23 14:16:32 -04001828 programObject->getActiveUniform(index, bufsize, length, size, type, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001829 }
1830}
1831
1832void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
1833{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001834 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 +00001835 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001836
Geoff Langbfdea662014-07-23 14:16:32 -04001837 if (maxcount < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001838 {
Geoff Langbfdea662014-07-23 14:16:32 -04001839 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001840 }
Geoff Langbfdea662014-07-23 14:16:32 -04001841
1842 gl::Context *context = gl::getNonLostContext();
1843
1844 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001845 {
Geoff Langbfdea662014-07-23 14:16:32 -04001846 gl::Program *programObject = context->getProgram(program);
1847
1848 if (!programObject)
1849 {
1850 if (context->getShader(program))
1851 {
1852 return gl::error(GL_INVALID_OPERATION);
1853 }
1854 else
1855 {
1856 return gl::error(GL_INVALID_VALUE);
1857 }
1858 }
1859
1860 return programObject->getAttachedShaders(maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001861 }
1862}
1863
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001864int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001865{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001866 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001867
Geoff Langbfdea662014-07-23 14:16:32 -04001868 gl::Context *context = gl::getNonLostContext();
1869
1870 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001871 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001872
Geoff Langbfdea662014-07-23 14:16:32 -04001873 gl::Program *programObject = context->getProgram(program);
1874
1875 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001876 {
Geoff Langbfdea662014-07-23 14:16:32 -04001877 if (context->getShader(program))
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00001878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001879 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00001880 }
Geoff Langbfdea662014-07-23 14:16:32 -04001881 else
1882 {
1883 return gl::error(GL_INVALID_VALUE, -1);
1884 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001885 }
Geoff Langbfdea662014-07-23 14:16:32 -04001886
1887 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
1888 if (!programObject->isLinked() || !programBinary)
1889 {
1890 return gl::error(GL_INVALID_OPERATION, -1);
1891 }
1892
1893 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001894 }
1895
1896 return -1;
1897}
1898
1899void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
1900{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001901 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001902
Geoff Langbfdea662014-07-23 14:16:32 -04001903 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001904
Geoff Langbfdea662014-07-23 14:16:32 -04001905 if (context)
1906 {
1907 GLenum nativeType;
1908 unsigned int numParams = 0;
1909 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001910 {
Geoff Langbfdea662014-07-23 14:16:32 -04001911 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001912 }
Geoff Langbfdea662014-07-23 14:16:32 -04001913
1914 if (nativeType == GL_BOOL)
1915 {
1916 context->getBooleanv(pname, params);
1917 }
1918 else
1919 {
1920 CastStateValues(context, nativeType, pname, numParams, params);
1921 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001922 }
1923}
1924
1925void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
1926{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001927 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 +00001928
Geoff Langbfdea662014-07-23 14:16:32 -04001929 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00001930
Geoff Langbfdea662014-07-23 14:16:32 -04001931 if (context)
1932 {
1933 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00001934 {
Geoff Langbfdea662014-07-23 14:16:32 -04001935 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00001936 }
Geoff Langbfdea662014-07-23 14:16:32 -04001937
1938 if (!gl::ValidBufferParameter(context, pname))
1939 {
1940 return gl::error(GL_INVALID_ENUM);
1941 }
1942
1943 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
1944
1945 if (!buffer)
1946 {
1947 // A null buffer means that "0" is bound to the requested buffer target
1948 return gl::error(GL_INVALID_OPERATION);
1949 }
1950
1951 switch (pname)
1952 {
1953 case GL_BUFFER_USAGE:
1954 *params = static_cast<GLint>(buffer->getUsage());
1955 break;
1956 case GL_BUFFER_SIZE:
1957 *params = gl::clampCast<GLint>(buffer->getSize());
1958 break;
1959 case GL_BUFFER_ACCESS_FLAGS:
1960 *params = buffer->getAccessFlags();
1961 break;
1962 case GL_BUFFER_MAPPED:
1963 *params = static_cast<GLint>(buffer->isMapped());
1964 break;
1965 case GL_BUFFER_MAP_OFFSET:
1966 *params = gl::clampCast<GLint>(buffer->getMapOffset());
1967 break;
1968 case GL_BUFFER_MAP_LENGTH:
1969 *params = gl::clampCast<GLint>(buffer->getMapLength());
1970 break;
1971 default: UNREACHABLE(); break;
1972 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001973 }
1974}
1975
1976GLenum __stdcall glGetError(void)
1977{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001978 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001979
1980 gl::Context *context = gl::getContext();
1981
1982 if (context)
1983 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00001984 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001985 }
1986
1987 return GL_NO_ERROR;
1988}
1989
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001990void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
1991{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001992 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001993
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001994
Geoff Langbfdea662014-07-23 14:16:32 -04001995 gl::Context *context = gl::getNonLostContext();
1996
1997 if (context)
1998 {
1999 gl::FenceNV *fenceObject = context->getFenceNV(fence);
2000
2001 if (fenceObject == NULL)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002002 {
Geoff Langbfdea662014-07-23 14:16:32 -04002003 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002004 }
Geoff Langbfdea662014-07-23 14:16:32 -04002005
2006 if (fenceObject->isFence() != GL_TRUE)
2007 {
2008 return gl::error(GL_INVALID_OPERATION);
2009 }
2010
2011 switch (pname)
2012 {
2013 case GL_FENCE_STATUS_NV:
2014 case GL_FENCE_CONDITION_NV:
2015 break;
2016
2017 default: return gl::error(GL_INVALID_ENUM);
2018 }
2019
2020 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002021 }
2022}
2023
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002024void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2025{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002026 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002027
Geoff Langbfdea662014-07-23 14:16:32 -04002028 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002029
Geoff Langbfdea662014-07-23 14:16:32 -04002030 if (context)
2031 {
2032 GLenum nativeType;
2033 unsigned int numParams = 0;
2034 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002035 {
Geoff Langbfdea662014-07-23 14:16:32 -04002036 return;
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002037 }
Geoff Langbfdea662014-07-23 14:16:32 -04002038
2039 if (nativeType == GL_FLOAT)
2040 {
2041 context->getFloatv(pname, params);
2042 }
2043 else
2044 {
2045 CastStateValues(context, nativeType, pname, numParams, params);
2046 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002047 }
2048}
2049
2050void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2051{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002052 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 +00002053 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002054
Geoff Langbfdea662014-07-23 14:16:32 -04002055 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002056
Geoff Langbfdea662014-07-23 14:16:32 -04002057 if (context)
2058 {
2059 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002060 {
Geoff Langbfdea662014-07-23 14:16:32 -04002061 return gl::error(GL_INVALID_ENUM);
2062 }
2063
2064 int clientVersion = context->getClientVersion();
2065
2066 switch (pname)
2067 {
2068 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2069 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2070 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2071 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2072 break;
2073 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2074 if (clientVersion < 3 && !context->getExtensions().sRGB)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002076 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002077 }
Geoff Langbfdea662014-07-23 14:16:32 -04002078 break;
2079 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2080 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2081 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2082 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2083 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2084 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2085 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2086 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2087 if (clientVersion < 3)
2088 {
2089 return gl::error(GL_INVALID_ENUM);
2090 }
2091 break;
2092 default:
2093 return gl::error(GL_INVALID_ENUM);
2094 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002095
Geoff Langbfdea662014-07-23 14:16:32 -04002096 // Determine if the attachment is a valid enum
2097 switch (attachment)
2098 {
2099 case GL_BACK:
2100 case GL_FRONT:
2101 case GL_DEPTH:
2102 case GL_STENCIL:
2103 case GL_DEPTH_STENCIL_ATTACHMENT:
2104 if (clientVersion < 3)
2105 {
2106 return gl::error(GL_INVALID_ENUM);
2107 }
2108 break;
2109
2110 case GL_DEPTH_ATTACHMENT:
2111 case GL_STENCIL_ATTACHMENT:
2112 break;
2113
2114 default:
2115 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2116 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getCaps().maxColorAttachments)
2117 {
2118 return gl::error(GL_INVALID_ENUM);
2119 }
2120 break;
2121 }
2122
2123 GLuint framebufferHandle = context->getState().getTargetFramebuffer(target)->id();
2124 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2125
2126 if (framebufferHandle == 0)
2127 {
2128 if (clientVersion < 3)
2129 {
2130 return gl::error(GL_INVALID_OPERATION);
2131 }
2132
2133 switch (attachment)
2134 {
2135 case GL_BACK:
2136 case GL_DEPTH:
2137 case GL_STENCIL:
2138 break;
2139 default:
2140 return gl::error(GL_INVALID_OPERATION);
2141 }
2142 }
2143 else
2144 {
2145 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2146 {
2147 // Valid attachment query
2148 }
2149 else
2150 {
2151 switch (attachment)
2152 {
2153 case GL_DEPTH_ATTACHMENT:
2154 case GL_STENCIL_ATTACHMENT:
2155 break;
2156 case GL_DEPTH_STENCIL_ATTACHMENT:
2157 if (framebuffer->hasValidDepthStencil())
2158 {
2159 return gl::error(GL_INVALID_OPERATION);
2160 }
2161 break;
2162 default:
2163 return gl::error(GL_INVALID_OPERATION);
2164 }
2165 }
2166 }
2167
2168 GLenum attachmentType = GL_NONE;
2169 GLuint attachmentHandle = 0;
2170 GLuint attachmentLevel = 0;
2171 GLuint attachmentLayer = 0;
2172
2173 const gl::FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
2174
2175 if (attachmentObject)
2176 {
2177 attachmentType = attachmentObject->type();
2178 attachmentHandle = attachmentObject->id();
2179 attachmentLevel = attachmentObject->mipLevel();
2180 attachmentLayer = attachmentObject->layer();
2181 }
2182
2183 GLenum attachmentObjectType; // Type category
2184 if (framebufferHandle == 0)
2185 {
2186 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2187 }
2188 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
2189 {
2190 attachmentObjectType = attachmentType;
2191 }
2192 else if (gl::ValidTexture2DDestinationTarget(context, attachmentType))
2193 {
2194 attachmentObjectType = GL_TEXTURE;
2195 }
2196 else
2197 {
2198 UNREACHABLE();
2199 return;
2200 }
2201
2202 if (attachmentObjectType == GL_NONE)
2203 {
2204 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2205 // is NONE, then querying any other pname will generate INVALID_ENUM.
2206
2207 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2208 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2209 // INVALID_OPERATION for all other pnames
Jamie Madill1e3fa742014-06-16 10:34:00 -04002210
Geoff Lang646559f2013-08-15 11:08:15 -04002211 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002212 {
Geoff Lang646559f2013-08-15 11:08:15 -04002213 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
Geoff Langbfdea662014-07-23 14:16:32 -04002214 *params = attachmentObjectType;
2215 break;
2216
Geoff Lang646559f2013-08-15 11:08:15 -04002217 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
Geoff Lang05b05022014-06-11 15:31:45 -04002218 if (clientVersion < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002219 {
Geoff Lang05b05022014-06-11 15:31:45 -04002220 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002221 }
Geoff Langbfdea662014-07-23 14:16:32 -04002222 *params = 0;
Geoff Lang646559f2013-08-15 11:08:15 -04002223 break;
2224
2225 default:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002226 if (clientVersion < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002227 {
Geoff Langbfdea662014-07-23 14:16:32 -04002228 return gl::error(GL_INVALID_ENUM);
Geoff Lang646559f2013-08-15 11:08:15 -04002229 }
2230 else
2231 {
Geoff Langbfdea662014-07-23 14:16:32 -04002232 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002233 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002234 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002235 }
Geoff Langbfdea662014-07-23 14:16:32 -04002236 else
2237 {
2238 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2239 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2240 ASSERT(attachmentObject != NULL);
2241
2242 switch (pname)
2243 {
2244 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2245 *params = attachmentObjectType;
2246 break;
2247
2248 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2249 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2250 {
2251 return gl::error(GL_INVALID_ENUM);
2252 }
2253 *params = attachmentHandle;
2254 break;
2255
2256 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2257 if (attachmentObjectType != GL_TEXTURE)
2258 {
2259 return gl::error(GL_INVALID_ENUM);
2260 }
2261 *params = attachmentLevel;
2262 break;
2263
2264 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2265 if (attachmentObjectType != GL_TEXTURE)
2266 {
2267 return gl::error(GL_INVALID_ENUM);
2268 }
2269 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2270 break;
2271
2272 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2273 *params = attachmentObject->getRedSize();
2274 break;
2275
2276 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2277 *params = attachmentObject->getGreenSize();
2278 break;
2279
2280 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2281 *params = attachmentObject->getBlueSize();
2282 break;
2283
2284 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2285 *params = attachmentObject->getAlphaSize();
2286 break;
2287
2288 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2289 *params = attachmentObject->getDepthSize();
2290 break;
2291
2292 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2293 *params = attachmentObject->getStencilSize();
2294 break;
2295
2296 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2297 if (attachment == GL_DEPTH_STENCIL)
2298 {
2299 gl::error(GL_INVALID_OPERATION);
2300 }
2301 *params = attachmentObject->getComponentType();
2302 break;
2303
2304 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2305 *params = attachmentObject->getColorEncoding();
2306 break;
2307
2308 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2309 if (attachmentObjectType != GL_TEXTURE)
2310 {
2311 return gl::error(GL_INVALID_ENUM);
2312 }
2313 *params = attachmentLayer;
2314 break;
2315
2316 default:
2317 UNREACHABLE();
2318 break;
2319 }
2320 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002321 }
2322}
2323
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002324GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2325{
2326 EVENT("()");
2327
Geoff Langbfdea662014-07-23 14:16:32 -04002328 gl::Context *context = gl::getContext();
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002329
Geoff Langbfdea662014-07-23 14:16:32 -04002330 if (context)
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002331 {
Geoff Langbfdea662014-07-23 14:16:32 -04002332 return context->getResetStatus();
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002333 }
Geoff Langbfdea662014-07-23 14:16:32 -04002334
2335 return GL_NO_ERROR;
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002336}
2337
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002338void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2339{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002340 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002341
Geoff Langbfdea662014-07-23 14:16:32 -04002342 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002343
Geoff Langbfdea662014-07-23 14:16:32 -04002344 if (context)
2345 {
2346 GLenum nativeType;
2347 unsigned int numParams = 0;
2348
2349 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002350 {
Geoff Langbfdea662014-07-23 14:16:32 -04002351 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002352 }
Geoff Langbfdea662014-07-23 14:16:32 -04002353
2354 if (nativeType == GL_INT)
2355 {
2356 context->getIntegerv(pname, params);
2357 }
2358 else
2359 {
2360 CastStateValues(context, nativeType, pname, numParams, params);
2361 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002362 }
2363}
2364
2365void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002367 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002368
Geoff Langbfdea662014-07-23 14:16:32 -04002369 gl::Context *context = gl::getNonLostContext();
2370
2371 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002372 {
Geoff Langbfdea662014-07-23 14:16:32 -04002373 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002374
Geoff Langbfdea662014-07-23 14:16:32 -04002375 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002376 {
Geoff Langbfdea662014-07-23 14:16:32 -04002377 return gl::error(GL_INVALID_VALUE);
2378 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002379
Geoff Langbfdea662014-07-23 14:16:32 -04002380 if (context->getClientVersion() < 3)
2381 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002382 switch (pname)
2383 {
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002384 case GL_ACTIVE_UNIFORM_BLOCKS:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002385 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002386 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002387 case GL_TRANSFORM_FEEDBACK_VARYINGS:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002388 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002389 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002390 }
2391 }
Geoff Langbfdea662014-07-23 14:16:32 -04002392
2393 switch (pname)
2394 {
2395 case GL_DELETE_STATUS:
2396 *params = programObject->isFlaggedForDeletion();
2397 return;
2398 case GL_LINK_STATUS:
2399 *params = programObject->isLinked();
2400 return;
2401 case GL_VALIDATE_STATUS:
2402 *params = programObject->isValidated();
2403 return;
2404 case GL_INFO_LOG_LENGTH:
2405 *params = programObject->getInfoLogLength();
2406 return;
2407 case GL_ATTACHED_SHADERS:
2408 *params = programObject->getAttachedShadersCount();
2409 return;
2410 case GL_ACTIVE_ATTRIBUTES:
2411 *params = programObject->getActiveAttributeCount();
2412 return;
2413 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
2414 *params = programObject->getActiveAttributeMaxLength();
2415 return;
2416 case GL_ACTIVE_UNIFORMS:
2417 *params = programObject->getActiveUniformCount();
2418 return;
2419 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
2420 *params = programObject->getActiveUniformMaxLength();
2421 return;
2422 case GL_PROGRAM_BINARY_LENGTH_OES:
2423 *params = programObject->getProgramBinaryLength();
2424 return;
2425 case GL_ACTIVE_UNIFORM_BLOCKS:
2426 *params = programObject->getActiveUniformBlockCount();
2427 return;
2428 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
2429 *params = programObject->getActiveUniformBlockMaxLength();
2430 break;
2431 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2432 *params = programObject->getTransformFeedbackBufferMode();
2433 break;
2434 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2435 *params = programObject->getTransformFeedbackVaryingCount();
2436 break;
2437 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
2438 *params = programObject->getTransformFeedbackVaryingMaxLength();
2439 break;
2440 default:
2441 return gl::error(GL_INVALID_ENUM);
2442 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443 }
2444}
2445
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002446void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002447{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002448 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 +00002449 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002450
Geoff Langbfdea662014-07-23 14:16:32 -04002451 if (bufsize < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002452 {
Geoff Langbfdea662014-07-23 14:16:32 -04002453 return gl::error(GL_INVALID_VALUE);
2454 }
2455
2456 gl::Context *context = gl::getNonLostContext();
2457
2458 if (context)
2459 {
2460 gl::Program *programObject = context->getProgram(program);
2461
2462 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002464 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002465 }
2466
Geoff Langbfdea662014-07-23 14:16:32 -04002467 programObject->getInfoLog(bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002468 }
2469}
2470
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002471void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
2472{
2473 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
2474
Geoff Langbfdea662014-07-23 14:16:32 -04002475 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002476
Geoff Langbfdea662014-07-23 14:16:32 -04002477 if (context)
2478 {
2479 if (!ValidQueryType(context, target))
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002480 {
Geoff Langbfdea662014-07-23 14:16:32 -04002481 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002482 }
Geoff Langbfdea662014-07-23 14:16:32 -04002483
2484 switch (pname)
2485 {
2486 case GL_CURRENT_QUERY_EXT:
2487 params[0] = context->getState().getActiveQueryId(target);
2488 break;
2489
2490 default:
2491 return gl::error(GL_INVALID_ENUM);
2492 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002493 }
2494}
2495
2496void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
2497{
2498 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
2499
Geoff Langbfdea662014-07-23 14:16:32 -04002500 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002501
Geoff Langbfdea662014-07-23 14:16:32 -04002502 if (context)
2503 {
2504 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
2505
2506 if (!queryObject)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002507 {
Geoff Langbfdea662014-07-23 14:16:32 -04002508 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002509 }
Geoff Langbfdea662014-07-23 14:16:32 -04002510
2511 if (context->getState().getActiveQueryId(queryObject->getType()) == id)
2512 {
2513 return gl::error(GL_INVALID_OPERATION);
2514 }
2515
2516 switch(pname)
2517 {
2518 case GL_QUERY_RESULT_EXT:
2519 params[0] = queryObject->getResult();
2520 break;
2521 case GL_QUERY_RESULT_AVAILABLE_EXT:
2522 params[0] = queryObject->isResultAvailable();
2523 break;
2524 default:
2525 return gl::error(GL_INVALID_ENUM);
2526 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002527 }
2528}
2529
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002530void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
2531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002532 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 +00002533
Geoff Langbfdea662014-07-23 14:16:32 -04002534 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00002535
Geoff Langbfdea662014-07-23 14:16:32 -04002536 if (context)
2537 {
2538 if (target != GL_RENDERBUFFER)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00002539 {
Geoff Langbfdea662014-07-23 14:16:32 -04002540 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00002541 }
Geoff Langbfdea662014-07-23 14:16:32 -04002542
2543 if (context->getState().getRenderbufferId() == 0)
2544 {
2545 return gl::error(GL_INVALID_OPERATION);
2546 }
2547
2548 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getState().getRenderbufferId());
2549
2550 switch (pname)
2551 {
2552 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
2553 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
2554 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
2555 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
2556 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
2557 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
2558 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
2559 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
2560 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
2561 case GL_RENDERBUFFER_SAMPLES_ANGLE:
2562 if (!context->getExtensions().framebufferMultisample)
2563 {
2564 return gl::error(GL_INVALID_ENUM);
2565 }
2566 *params = renderbuffer->getSamples();
2567 break;
2568 default:
2569 return gl::error(GL_INVALID_ENUM);
2570 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002571 }
2572}
2573
2574void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
2575{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002576 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002577
Geoff Langbfdea662014-07-23 14:16:32 -04002578 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002579
Geoff Langbfdea662014-07-23 14:16:32 -04002580 if (context)
2581 {
2582 gl::Shader *shaderObject = context->getShader(shader);
2583
2584 if (!shaderObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002585 {
Geoff Langbfdea662014-07-23 14:16:32 -04002586 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002587 }
Geoff Langbfdea662014-07-23 14:16:32 -04002588
2589 switch (pname)
2590 {
2591 case GL_SHADER_TYPE:
2592 *params = shaderObject->getType();
2593 return;
2594 case GL_DELETE_STATUS:
2595 *params = shaderObject->isFlaggedForDeletion();
2596 return;
2597 case GL_COMPILE_STATUS:
2598 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
2599 return;
2600 case GL_INFO_LOG_LENGTH:
2601 *params = shaderObject->getInfoLogLength();
2602 return;
2603 case GL_SHADER_SOURCE_LENGTH:
2604 *params = shaderObject->getSourceLength();
2605 return;
2606 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
2607 *params = shaderObject->getTranslatedSourceLength();
2608 return;
2609 default:
2610 return gl::error(GL_INVALID_ENUM);
2611 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002612 }
2613}
2614
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002615void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002616{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002617 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 +00002618 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002619
Geoff Langbfdea662014-07-23 14:16:32 -04002620 if (bufsize < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002621 {
Geoff Langbfdea662014-07-23 14:16:32 -04002622 return gl::error(GL_INVALID_VALUE);
2623 }
2624
2625 gl::Context *context = gl::getNonLostContext();
2626
2627 if (context)
2628 {
2629 gl::Shader *shaderObject = context->getShader(shader);
2630
2631 if (!shaderObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002633 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002634 }
2635
Geoff Langbfdea662014-07-23 14:16:32 -04002636 shaderObject->getInfoLog(bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002637 }
2638}
2639
2640void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
2641{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002642 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 +00002643 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002644
Geoff Langbfdea662014-07-23 14:16:32 -04002645 switch (shadertype)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002646 {
Geoff Langbfdea662014-07-23 14:16:32 -04002647 case GL_VERTEX_SHADER:
2648 case GL_FRAGMENT_SHADER:
2649 break;
2650 default:
2651 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002652 }
Geoff Langbfdea662014-07-23 14:16:32 -04002653
2654 switch (precisiontype)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002655 {
Geoff Langbfdea662014-07-23 14:16:32 -04002656 case GL_LOW_FLOAT:
2657 case GL_MEDIUM_FLOAT:
2658 case GL_HIGH_FLOAT:
2659 // Assume IEEE 754 precision
2660 range[0] = 127;
2661 range[1] = 127;
2662 *precision = 23;
2663 break;
2664 case GL_LOW_INT:
2665 case GL_MEDIUM_INT:
2666 case GL_HIGH_INT:
2667 // Some (most) hardware only supports single-precision floating-point numbers,
2668 // which can accurately represent integers up to +/-16777216
2669 range[0] = 24;
2670 range[1] = 24;
2671 *precision = 0;
2672 break;
2673 default:
2674 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002675 }
2676}
2677
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002678void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002679{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002680 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 +00002681 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002682
Geoff Langbfdea662014-07-23 14:16:32 -04002683 if (bufsize < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002684 {
Geoff Langbfdea662014-07-23 14:16:32 -04002685 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002686 }
Geoff Langbfdea662014-07-23 14:16:32 -04002687
2688 gl::Context *context = gl::getNonLostContext();
2689
2690 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002691 {
Geoff Langbfdea662014-07-23 14:16:32 -04002692 gl::Shader *shaderObject = context->getShader(shader);
2693
2694 if (!shaderObject)
2695 {
2696 return gl::error(GL_INVALID_OPERATION);
2697 }
2698
2699 shaderObject->getSource(bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002700 }
2701}
2702
zmo@google.coma574f782011-10-03 21:45:23 +00002703void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
2704{
2705 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
2706 shader, bufsize, length, source);
2707
Geoff Langbfdea662014-07-23 14:16:32 -04002708 if (bufsize < 0)
zmo@google.coma574f782011-10-03 21:45:23 +00002709 {
Geoff Langbfdea662014-07-23 14:16:32 -04002710 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00002711 }
Geoff Langbfdea662014-07-23 14:16:32 -04002712
2713 gl::Context *context = gl::getNonLostContext();
2714
2715 if (context)
zmo@google.coma574f782011-10-03 21:45:23 +00002716 {
Geoff Langbfdea662014-07-23 14:16:32 -04002717 gl::Shader *shaderObject = context->getShader(shader);
2718
2719 if (!shaderObject)
2720 {
2721 return gl::error(GL_INVALID_OPERATION);
2722 }
2723
2724 shaderObject->getTranslatedSource(bufsize, length, source);
zmo@google.coma574f782011-10-03 21:45:23 +00002725 }
2726}
2727
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002728const GLubyte* __stdcall glGetString(GLenum name)
2729{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002730 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002731
Geoff Langbfdea662014-07-23 14:16:32 -04002732 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00002733
Geoff Langbfdea662014-07-23 14:16:32 -04002734 switch (name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002735 {
Geoff Langbfdea662014-07-23 14:16:32 -04002736 case GL_VENDOR:
2737 return (GLubyte*)"Google Inc.";
2738 case GL_RENDERER:
2739 return (GLubyte*)((context != NULL) ? context->getRendererString().c_str() : "ANGLE");
2740 case GL_VERSION:
2741 if (context->getClientVersion() == 2)
2742 {
2743 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
2744 }
2745 else
2746 {
2747 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
2748 }
2749 case GL_SHADING_LANGUAGE_VERSION:
2750 if (context->getClientVersion() == 2)
2751 {
2752 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
2753 }
2754 else
2755 {
2756 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
2757 }
2758 case GL_EXTENSIONS:
2759 return (GLubyte*)((context != NULL) ? context->getExtensionString().c_str() : "");
2760 default:
2761 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002762 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002763}
2764
2765void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
2766{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002767 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 +00002768
Geoff Langbfdea662014-07-23 14:16:32 -04002769 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00002770
Geoff Langbfdea662014-07-23 14:16:32 -04002771 if (context)
2772 {
2773 gl::Texture *texture = context->getTargetTexture(target);
2774
2775 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00002776 {
Geoff Langbfdea662014-07-23 14:16:32 -04002777 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00002778 }
Geoff Langbfdea662014-07-23 14:16:32 -04002779
2780 switch (pname)
2781 {
2782 case GL_TEXTURE_MAG_FILTER:
2783 *params = (GLfloat)texture->getSamplerState().magFilter;
2784 break;
2785 case GL_TEXTURE_MIN_FILTER:
2786 *params = (GLfloat)texture->getSamplerState().minFilter;
2787 break;
2788 case GL_TEXTURE_WRAP_S:
2789 *params = (GLfloat)texture->getSamplerState().wrapS;
2790 break;
2791 case GL_TEXTURE_WRAP_T:
2792 *params = (GLfloat)texture->getSamplerState().wrapT;
2793 break;
2794 case GL_TEXTURE_WRAP_R:
2795 if (context->getClientVersion() < 3)
2796 {
2797 return gl::error(GL_INVALID_ENUM);
2798 }
2799 *params = (GLfloat)texture->getSamplerState().wrapR;
2800 break;
2801 case GL_TEXTURE_IMMUTABLE_FORMAT:
2802 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
2803 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
2804 break;
2805 case GL_TEXTURE_IMMUTABLE_LEVELS:
2806 if (context->getClientVersion() < 3)
2807 {
2808 return gl::error(GL_INVALID_ENUM);
2809 }
2810 *params = (GLfloat)texture->immutableLevelCount();
2811 break;
2812 case GL_TEXTURE_USAGE_ANGLE:
2813 *params = (GLfloat)texture->getUsage();
2814 break;
2815 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
2816 if (!context->getExtensions().textureFilterAnisotropic)
2817 {
2818 return gl::error(GL_INVALID_ENUM);
2819 }
2820 *params = (GLfloat)texture->getSamplerState().maxAnisotropy;
2821 break;
2822 case GL_TEXTURE_SWIZZLE_R:
2823 if (context->getClientVersion() < 3)
2824 {
2825 return gl::error(GL_INVALID_ENUM);
2826 }
2827 *params = (GLfloat)texture->getSamplerState().swizzleRed;
2828 break;
2829 case GL_TEXTURE_SWIZZLE_G:
2830 if (context->getClientVersion() < 3)
2831 {
2832 return gl::error(GL_INVALID_ENUM);
2833 }
2834 *params = (GLfloat)texture->getSamplerState().swizzleGreen;
2835 break;
2836 case GL_TEXTURE_SWIZZLE_B:
2837 if (context->getClientVersion() < 3)
2838 {
2839 return gl::error(GL_INVALID_ENUM);
2840 }
2841 *params = (GLfloat)texture->getSamplerState().swizzleBlue;
2842 break;
2843 case GL_TEXTURE_SWIZZLE_A:
2844 if (context->getClientVersion() < 3)
2845 {
2846 return gl::error(GL_INVALID_ENUM);
2847 }
2848 *params = (GLfloat)texture->getSamplerState().swizzleAlpha;
2849 break;
2850 case GL_TEXTURE_BASE_LEVEL:
2851 if (context->getClientVersion() < 3)
2852 {
2853 return gl::error(GL_INVALID_ENUM);
2854 }
2855 *params = (GLfloat)texture->getSamplerState().baseLevel;
2856 break;
2857 case GL_TEXTURE_MAX_LEVEL:
2858 if (context->getClientVersion() < 3)
2859 {
2860 return gl::error(GL_INVALID_ENUM);
2861 }
2862 *params = (GLfloat)texture->getSamplerState().maxLevel;
2863 break;
2864 case GL_TEXTURE_MIN_LOD:
2865 if (context->getClientVersion() < 3)
2866 {
2867 return gl::error(GL_INVALID_ENUM);
2868 }
2869 *params = texture->getSamplerState().minLod;
2870 break;
2871 case GL_TEXTURE_MAX_LOD:
2872 if (context->getClientVersion() < 3)
2873 {
2874 return gl::error(GL_INVALID_ENUM);
2875 }
2876 *params = texture->getSamplerState().maxLod;
2877 break;
2878 default:
2879 return gl::error(GL_INVALID_ENUM);
2880 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002881 }
2882}
2883
2884void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
2885{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002886 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 +00002887
Geoff Langbfdea662014-07-23 14:16:32 -04002888 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00002889
Geoff Langbfdea662014-07-23 14:16:32 -04002890 if (context)
2891 {
2892 gl::Texture *texture = context->getTargetTexture(target);
2893
2894 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00002895 {
Geoff Langbfdea662014-07-23 14:16:32 -04002896 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00002897 }
Geoff Langbfdea662014-07-23 14:16:32 -04002898
2899 switch (pname)
2900 {
2901 case GL_TEXTURE_MAG_FILTER:
2902 *params = texture->getSamplerState().magFilter;
2903 break;
2904 case GL_TEXTURE_MIN_FILTER:
2905 *params = texture->getSamplerState().minFilter;
2906 break;
2907 case GL_TEXTURE_WRAP_S:
2908 *params = texture->getSamplerState().wrapS;
2909 break;
2910 case GL_TEXTURE_WRAP_T:
2911 *params = texture->getSamplerState().wrapT;
2912 break;
2913 case GL_TEXTURE_WRAP_R:
2914 if (context->getClientVersion() < 3)
2915 {
2916 return gl::error(GL_INVALID_ENUM);
2917 }
2918 *params = texture->getSamplerState().wrapR;
2919 break;
2920 case GL_TEXTURE_IMMUTABLE_FORMAT:
2921 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
2922 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
2923 break;
2924 case GL_TEXTURE_IMMUTABLE_LEVELS:
2925 if (context->getClientVersion() < 3)
2926 {
2927 return gl::error(GL_INVALID_ENUM);
2928 }
2929 *params = texture->immutableLevelCount();
2930 break;
2931 case GL_TEXTURE_USAGE_ANGLE:
2932 *params = texture->getUsage();
2933 break;
2934 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
2935 if (!context->getExtensions().textureFilterAnisotropic)
2936 {
2937 return gl::error(GL_INVALID_ENUM);
2938 }
2939 *params = (GLint)texture->getSamplerState().maxAnisotropy;
2940 break;
2941 case GL_TEXTURE_SWIZZLE_R:
2942 if (context->getClientVersion() < 3)
2943 {
2944 return gl::error(GL_INVALID_ENUM);
2945 }
2946 *params = texture->getSamplerState().swizzleRed;
2947 break;
2948 case GL_TEXTURE_SWIZZLE_G:
2949 if (context->getClientVersion() < 3)
2950 {
2951 return gl::error(GL_INVALID_ENUM);
2952 }
2953 *params = texture->getSamplerState().swizzleGreen;
2954 break;
2955 case GL_TEXTURE_SWIZZLE_B:
2956 if (context->getClientVersion() < 3)
2957 {
2958 return gl::error(GL_INVALID_ENUM);
2959 }
2960 *params = texture->getSamplerState().swizzleBlue;
2961 break;
2962 case GL_TEXTURE_SWIZZLE_A:
2963 if (context->getClientVersion() < 3)
2964 {
2965 return gl::error(GL_INVALID_ENUM);
2966 }
2967 *params = texture->getSamplerState().swizzleAlpha;
2968 break;
2969 case GL_TEXTURE_BASE_LEVEL:
2970 if (context->getClientVersion() < 3)
2971 {
2972 return gl::error(GL_INVALID_ENUM);
2973 }
2974 *params = texture->getSamplerState().baseLevel;
2975 break;
2976 case GL_TEXTURE_MAX_LEVEL:
2977 if (context->getClientVersion() < 3)
2978 {
2979 return gl::error(GL_INVALID_ENUM);
2980 }
2981 *params = texture->getSamplerState().maxLevel;
2982 break;
2983 case GL_TEXTURE_MIN_LOD:
2984 if (context->getClientVersion() < 3)
2985 {
2986 return gl::error(GL_INVALID_ENUM);
2987 }
2988 *params = (GLint)texture->getSamplerState().minLod;
2989 break;
2990 case GL_TEXTURE_MAX_LOD:
2991 if (context->getClientVersion() < 3)
2992 {
2993 return gl::error(GL_INVALID_ENUM);
2994 }
2995 *params = (GLint)texture->getSamplerState().maxLod;
2996 break;
2997 default:
2998 return gl::error(GL_INVALID_ENUM);
2999 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003000 }
3001}
3002
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003003void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3004{
3005 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3006 program, location, bufSize, params);
3007
Geoff Langbfdea662014-07-23 14:16:32 -04003008 if (bufSize < 0)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003009 {
Geoff Langbfdea662014-07-23 14:16:32 -04003010 return gl::error(GL_INVALID_VALUE);
3011 }
3012
3013 gl::Context *context = gl::getNonLostContext();
3014
3015 if (context)
3016 {
Jamie Madill0063c512014-08-25 15:47:53 -04003017 if (!ValidateGetnUniformfvEXT(context, program, location, bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003018 {
Jamie Madill0063c512014-08-25 15:47:53 -04003019 return;
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003020 }
3021
Jamie Madill0063c512014-08-25 15:47:53 -04003022 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
3023 ASSERT(programBinary);
Geoff Langbfdea662014-07-23 14:16:32 -04003024
3025 if (!programBinary->getUniformfv(location, &bufSize, params))
3026 {
3027 return gl::error(GL_INVALID_OPERATION);
3028 }
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003029 }
3030}
3031
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003032void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3033{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003034 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003035
Geoff Langbfdea662014-07-23 14:16:32 -04003036 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003037
Geoff Langbfdea662014-07-23 14:16:32 -04003038 if (context)
3039 {
Jamie Madill0063c512014-08-25 15:47:53 -04003040 if (!ValidateGetUniformfv(context, program, location, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003041 {
Jamie Madill0063c512014-08-25 15:47:53 -04003042 return;
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003043 }
Geoff Langbfdea662014-07-23 14:16:32 -04003044
Jamie Madill0063c512014-08-25 15:47:53 -04003045 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
3046 ASSERT(programBinary);
Geoff Langbfdea662014-07-23 14:16:32 -04003047
3048 if (!programBinary->getUniformfv(location, NULL, params))
3049 {
3050 return gl::error(GL_INVALID_OPERATION);
3051 }
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003052 }
3053}
3054
3055void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3056{
Geoff Langbfdea662014-07-23 14:16:32 -04003057 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003058 program, location, bufSize, params);
3059
Geoff Langbfdea662014-07-23 14:16:32 -04003060 if (bufSize < 0)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003061 {
Geoff Langbfdea662014-07-23 14:16:32 -04003062 return gl::error(GL_INVALID_VALUE);
3063 }
3064
3065 gl::Context *context = gl::getNonLostContext();
3066
3067 if (context)
3068 {
Jamie Madill0063c512014-08-25 15:47:53 -04003069 if (!ValidateGetnUniformivEXT(context, program, location, bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003070 {
Jamie Madill0063c512014-08-25 15:47:53 -04003071 return;
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003072 }
3073
Jamie Madill0063c512014-08-25 15:47:53 -04003074 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
3075 ASSERT(programBinary);
Geoff Langbfdea662014-07-23 14:16:32 -04003076
3077 if (!programBinary->getUniformiv(location, &bufSize, params))
3078 {
3079 return gl::error(GL_INVALID_OPERATION);
3080 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003081 }
3082}
3083
3084void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3085{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003086 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003087
Geoff Langbfdea662014-07-23 14:16:32 -04003088 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003089
Geoff Langbfdea662014-07-23 14:16:32 -04003090 if (context)
3091 {
Jamie Madill0063c512014-08-25 15:47:53 -04003092 if (!ValidateGetUniformiv(context, program, location, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003093 {
Jamie Madill0063c512014-08-25 15:47:53 -04003094 return;
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003095 }
Geoff Langbfdea662014-07-23 14:16:32 -04003096
Jamie Madill0063c512014-08-25 15:47:53 -04003097 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
3098 ASSERT(programBinary);
Geoff Langbfdea662014-07-23 14:16:32 -04003099
3100 if (!programBinary->getUniformiv(location, NULL, params))
3101 {
3102 return gl::error(GL_INVALID_OPERATION);
3103 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003104 }
3105}
3106
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003107int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003108{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003109 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003110
Geoff Langbfdea662014-07-23 14:16:32 -04003111 gl::Context *context = gl::getNonLostContext();
3112
3113 if (strstr(name, "gl_") == name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003114 {
Geoff Langbfdea662014-07-23 14:16:32 -04003115 return -1;
3116 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003117
Geoff Langbfdea662014-07-23 14:16:32 -04003118 if (context)
3119 {
3120 gl::Program *programObject = context->getProgram(program);
3121
3122 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003123 {
Geoff Langbfdea662014-07-23 14:16:32 -04003124 if (context->getShader(program))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003126 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003127 }
Geoff Langbfdea662014-07-23 14:16:32 -04003128 else
3129 {
3130 return gl::error(GL_INVALID_VALUE, -1);
3131 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003132 }
Geoff Langbfdea662014-07-23 14:16:32 -04003133
3134 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3135 if (!programObject->isLinked() || !programBinary)
3136 {
3137 return gl::error(GL_INVALID_OPERATION, -1);
3138 }
3139
3140 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003141 }
3142
3143 return -1;
3144}
3145
3146void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3147{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003148 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003149
Geoff Langbfdea662014-07-23 14:16:32 -04003150 gl::Context *context = gl::getNonLostContext();
3151
3152 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003153 {
Geoff Langbfdea662014-07-23 14:16:32 -04003154 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003155 {
Geoff Langbfdea662014-07-23 14:16:32 -04003156 return gl::error(GL_INVALID_VALUE);
3157 }
daniel@transgaming.come0078962010-04-15 20:45:08 +00003158
Geoff Langbfdea662014-07-23 14:16:32 -04003159 const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index);
3160 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
3161 {
3162 return;
3163 }
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003164
Geoff Langbfdea662014-07-23 14:16:32 -04003165 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3166 {
3167 const gl::VertexAttribCurrentValueData &currentValueData = context->getState().getVertexAttribCurrentValue(index);
3168 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003169 {
Geoff Langbfdea662014-07-23 14:16:32 -04003170 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003171 }
3172 }
Geoff Langbfdea662014-07-23 14:16:32 -04003173 else
3174 {
3175 *params = gl::QuerySingleVertexAttributeParameter<GLfloat>(attribState, pname);
3176 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003177 }
3178}
3179
3180void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3181{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003182 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003183
Geoff Langbfdea662014-07-23 14:16:32 -04003184 gl::Context *context = gl::getNonLostContext();
3185
3186 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003187 {
Geoff Langbfdea662014-07-23 14:16:32 -04003188 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003189 {
Geoff Langbfdea662014-07-23 14:16:32 -04003190 return gl::error(GL_INVALID_VALUE);
3191 }
daniel@transgaming.come0078962010-04-15 20:45:08 +00003192
Geoff Langbfdea662014-07-23 14:16:32 -04003193 const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003194
Geoff Langbfdea662014-07-23 14:16:32 -04003195 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
3196 {
3197 return;
3198 }
Jamie Madillaff71502013-07-02 11:57:05 -04003199
Geoff Langbfdea662014-07-23 14:16:32 -04003200 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3201 {
3202 const gl::VertexAttribCurrentValueData &currentValueData = context->getState().getVertexAttribCurrentValue(index);
3203 for (int i = 0; i < 4; ++i)
Jamie Madillaff71502013-07-02 11:57:05 -04003204 {
Geoff Langbfdea662014-07-23 14:16:32 -04003205 float currentValue = currentValueData.FloatValues[i];
3206 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003207 }
3208 }
Geoff Langbfdea662014-07-23 14:16:32 -04003209 else
3210 {
3211 *params = gl::QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
3212 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003213 }
3214}
3215
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003216void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003217{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003218 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003219
Geoff Langbfdea662014-07-23 14:16:32 -04003220 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003221
Geoff Langbfdea662014-07-23 14:16:32 -04003222 if (context)
3223 {
3224 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003225 {
Geoff Langbfdea662014-07-23 14:16:32 -04003226 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003227 }
Geoff Langbfdea662014-07-23 14:16:32 -04003228
3229 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3230 {
3231 return gl::error(GL_INVALID_ENUM);
3232 }
3233
3234 *pointer = const_cast<GLvoid*>(context->getState().getVertexAttribPointer(index));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003235 }
3236}
3237
3238void __stdcall glHint(GLenum target, GLenum mode)
3239{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003240 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003241
Geoff Langbfdea662014-07-23 14:16:32 -04003242 switch (mode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003243 {
Geoff Langbfdea662014-07-23 14:16:32 -04003244 case GL_FASTEST:
3245 case GL_NICEST:
3246 case GL_DONT_CARE:
3247 break;
3248 default:
3249 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003250 }
Geoff Langbfdea662014-07-23 14:16:32 -04003251
3252 gl::Context *context = gl::getNonLostContext();
3253 switch (target)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003254 {
Geoff Langbfdea662014-07-23 14:16:32 -04003255 case GL_GENERATE_MIPMAP_HINT:
3256 if (context) context->getState().setGenerateMipmapHint(mode);
3257 break;
3258 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
3259 if (context) context->getState().setFragmentShaderDerivativeHint(mode);
3260 break;
3261 default:
3262 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003263 }
3264}
3265
3266GLboolean __stdcall glIsBuffer(GLuint buffer)
3267{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003268 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003269
Geoff Langbfdea662014-07-23 14:16:32 -04003270 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003271
Geoff Langbfdea662014-07-23 14:16:32 -04003272 if (context && buffer)
3273 {
3274 gl::Buffer *bufferObject = context->getBuffer(buffer);
3275
3276 if (bufferObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003277 {
Geoff Langbfdea662014-07-23 14:16:32 -04003278 return GL_TRUE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003279 }
3280 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003281
3282 return GL_FALSE;
3283}
3284
3285GLboolean __stdcall glIsEnabled(GLenum cap)
3286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003287 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003288
Geoff Langbfdea662014-07-23 14:16:32 -04003289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003290
Geoff Langbfdea662014-07-23 14:16:32 -04003291 if (context)
3292 {
3293 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003294 {
Geoff Langbfdea662014-07-23 14:16:32 -04003295 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003296 }
Geoff Langbfdea662014-07-23 14:16:32 -04003297
3298 return context->getState().getEnableFeature(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003299 }
3300
3301 return false;
3302}
3303
daniel@transgaming.comfe208882010-09-01 15:47:57 +00003304GLboolean __stdcall glIsFenceNV(GLuint fence)
3305{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003306 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003307
Geoff Langbfdea662014-07-23 14:16:32 -04003308 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003309
Geoff Langbfdea662014-07-23 14:16:32 -04003310 if (context)
3311 {
3312 gl::FenceNV *fenceObject = context->getFenceNV(fence);
3313
3314 if (fenceObject == NULL)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003315 {
Geoff Langbfdea662014-07-23 14:16:32 -04003316 return GL_FALSE;
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003317 }
Geoff Langbfdea662014-07-23 14:16:32 -04003318
3319 return fenceObject->isFence();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003320 }
3321
3322 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00003323}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003324
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003325GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
3326{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003327 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003328
Geoff Langbfdea662014-07-23 14:16:32 -04003329 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003330
Geoff Langbfdea662014-07-23 14:16:32 -04003331 if (context && framebuffer)
3332 {
3333 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
3334
3335 if (framebufferObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003336 {
Geoff Langbfdea662014-07-23 14:16:32 -04003337 return GL_TRUE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003338 }
3339 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003340
3341 return GL_FALSE;
3342}
3343
3344GLboolean __stdcall glIsProgram(GLuint program)
3345{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003346 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003347
Geoff Langbfdea662014-07-23 14:16:32 -04003348 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003349
Geoff Langbfdea662014-07-23 14:16:32 -04003350 if (context && program)
3351 {
3352 gl::Program *programObject = context->getProgram(program);
3353
3354 if (programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003355 {
Geoff Langbfdea662014-07-23 14:16:32 -04003356 return GL_TRUE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003357 }
3358 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003359
3360 return GL_FALSE;
3361}
3362
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003363GLboolean __stdcall glIsQueryEXT(GLuint id)
3364{
3365 EVENT("(GLuint id = %d)", id);
3366
Geoff Langbfdea662014-07-23 14:16:32 -04003367 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003368
Geoff Langbfdea662014-07-23 14:16:32 -04003369 if (context)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003370 {
Geoff Langbfdea662014-07-23 14:16:32 -04003371 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003372 }
3373
3374 return GL_FALSE;
3375}
3376
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003377GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
3378{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003379 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003380
Geoff Langbfdea662014-07-23 14:16:32 -04003381 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003382
Geoff Langbfdea662014-07-23 14:16:32 -04003383 if (context && renderbuffer)
3384 {
3385 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
3386
3387 if (renderbufferObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003388 {
Geoff Langbfdea662014-07-23 14:16:32 -04003389 return GL_TRUE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003390 }
3391 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003392
3393 return GL_FALSE;
3394}
3395
3396GLboolean __stdcall glIsShader(GLuint shader)
3397{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003398 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003399
Geoff Langbfdea662014-07-23 14:16:32 -04003400 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003401
Geoff Langbfdea662014-07-23 14:16:32 -04003402 if (context && shader)
3403 {
3404 gl::Shader *shaderObject = context->getShader(shader);
3405
3406 if (shaderObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003407 {
Geoff Langbfdea662014-07-23 14:16:32 -04003408 return GL_TRUE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003409 }
3410 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003411
3412 return GL_FALSE;
3413}
3414
3415GLboolean __stdcall glIsTexture(GLuint texture)
3416{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003417 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003418
Geoff Langbfdea662014-07-23 14:16:32 -04003419 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003420
Geoff Langbfdea662014-07-23 14:16:32 -04003421 if (context && texture)
3422 {
3423 gl::Texture *textureObject = context->getTexture(texture);
3424
3425 if (textureObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003426 {
Geoff Langbfdea662014-07-23 14:16:32 -04003427 return GL_TRUE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003428 }
3429 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003430
3431 return GL_FALSE;
3432}
3433
3434void __stdcall glLineWidth(GLfloat width)
3435{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003436 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003437
Geoff Langbfdea662014-07-23 14:16:32 -04003438 if (width <= 0.0f)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003439 {
Geoff Langbfdea662014-07-23 14:16:32 -04003440 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003441 }
Geoff Langbfdea662014-07-23 14:16:32 -04003442
3443 gl::Context *context = gl::getNonLostContext();
3444
3445 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003446 {
Geoff Langbfdea662014-07-23 14:16:32 -04003447 context->getState().setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003448 }
3449}
3450
3451void __stdcall glLinkProgram(GLuint program)
3452{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003453 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003454
Geoff Langbfdea662014-07-23 14:16:32 -04003455 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003456
Geoff Langbfdea662014-07-23 14:16:32 -04003457 if (context)
3458 {
3459 gl::Program *programObject = context->getProgram(program);
3460
3461 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003462 {
Geoff Langbfdea662014-07-23 14:16:32 -04003463 if (context->getShader(program))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003464 {
Geoff Langbfdea662014-07-23 14:16:32 -04003465 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003466 }
Geoff Langbfdea662014-07-23 14:16:32 -04003467 else
3468 {
3469 return gl::error(GL_INVALID_VALUE);
3470 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003471 }
Geoff Langbfdea662014-07-23 14:16:32 -04003472
3473 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003474 }
3475}
3476
3477void __stdcall glPixelStorei(GLenum pname, GLint param)
3478{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003479 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003480
Geoff Langbfdea662014-07-23 14:16:32 -04003481 gl::Context *context = gl::getNonLostContext();
3482
3483 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003484 {
Geoff Langbfdea662014-07-23 14:16:32 -04003485 switch (pname)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003486 {
Geoff Langbfdea662014-07-23 14:16:32 -04003487 case GL_UNPACK_ALIGNMENT:
3488 if (param != 1 && param != 2 && param != 4 && param != 8)
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003489 {
Geoff Langbfdea662014-07-23 14:16:32 -04003490 return gl::error(GL_INVALID_VALUE);
3491 }
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003492
Geoff Langbfdea662014-07-23 14:16:32 -04003493 context->getState().setUnpackAlignment(param);
3494 break;
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003495
Geoff Langbfdea662014-07-23 14:16:32 -04003496 case GL_PACK_ALIGNMENT:
3497 if (param != 1 && param != 2 && param != 4 && param != 8)
3498 {
3499 return gl::error(GL_INVALID_VALUE);
3500 }
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003501
Geoff Langbfdea662014-07-23 14:16:32 -04003502 context->getState().setPackAlignment(param);
3503 break;
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003504
Geoff Langbfdea662014-07-23 14:16:32 -04003505 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
3506 context->getState().setPackReverseRowOrder(param != 0);
3507 break;
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00003508
Geoff Langbfdea662014-07-23 14:16:32 -04003509 case GL_UNPACK_IMAGE_HEIGHT:
3510 case GL_UNPACK_SKIP_IMAGES:
3511 case GL_UNPACK_ROW_LENGTH:
3512 case GL_UNPACK_SKIP_ROWS:
3513 case GL_UNPACK_SKIP_PIXELS:
3514 case GL_PACK_ROW_LENGTH:
3515 case GL_PACK_SKIP_ROWS:
3516 case GL_PACK_SKIP_PIXELS:
3517 if (context->getClientVersion() < 3)
3518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003519 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003520 }
Geoff Langbfdea662014-07-23 14:16:32 -04003521 UNIMPLEMENTED();
3522 break;
3523
3524 default:
3525 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003526 }
3527 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003528}
3529
3530void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
3531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003532 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003533
Geoff Langbfdea662014-07-23 14:16:32 -04003534 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00003535
Geoff Langbfdea662014-07-23 14:16:32 -04003536 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003537 {
Geoff Langbfdea662014-07-23 14:16:32 -04003538 context->getState().setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003539 }
3540}
3541
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00003542void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
3543 GLenum format, GLenum type, GLsizei bufSize,
3544 GLvoid *data)
3545{
3546 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
3547 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
3548 x, y, width, height, format, type, bufSize, data);
3549
Geoff Langbfdea662014-07-23 14:16:32 -04003550 if (width < 0 || height < 0 || bufSize < 0)
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00003551 {
Geoff Langbfdea662014-07-23 14:16:32 -04003552 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00003553 }
Geoff Langbfdea662014-07-23 14:16:32 -04003554
3555 gl::Context *context = gl::getNonLostContext();
3556
3557 if (context)
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00003558 {
Geoff Langbfdea662014-07-23 14:16:32 -04003559 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
3560 format, type, &bufSize, data))
3561 {
3562 return;
3563 }
3564
3565 context->readPixels(x, y, width, height, format, type, &bufSize, data);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00003566 }
3567}
3568
3569void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
3570 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003571{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003572 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003573 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003574 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003575
Geoff Langbfdea662014-07-23 14:16:32 -04003576 if (width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003577 {
Geoff Langbfdea662014-07-23 14:16:32 -04003578 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003579 }
Geoff Langbfdea662014-07-23 14:16:32 -04003580
3581 gl::Context *context = gl::getNonLostContext();
3582
3583 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003584 {
Geoff Langbfdea662014-07-23 14:16:32 -04003585 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
3586 format, type, NULL, pixels))
3587 {
3588 return;
3589 }
3590
3591 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003592 }
3593}
3594
3595void __stdcall glReleaseShaderCompiler(void)
3596{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003597 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003598
Geoff Langbfdea662014-07-23 14:16:32 -04003599 gl::Shader::releaseCompiler();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003600}
3601
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003602void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003603{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003604 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 +00003605 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003606
Geoff Langbfdea662014-07-23 14:16:32 -04003607 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003608
Geoff Langbfdea662014-07-23 14:16:32 -04003609 if (context)
3610 {
3611 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
3612 width, height, true))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003613 {
Geoff Langbfdea662014-07-23 14:16:32 -04003614 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003615 }
Geoff Langbfdea662014-07-23 14:16:32 -04003616
3617 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003618 }
3619}
3620
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003621void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
3622{
3623 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
3624}
3625
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003626void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
3627{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00003628 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003629
Geoff Langbfdea662014-07-23 14:16:32 -04003630 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003631
Geoff Langbfdea662014-07-23 14:16:32 -04003632 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003633 {
Geoff Langbfdea662014-07-23 14:16:32 -04003634 context->getState().setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003635 }
3636}
3637
daniel@transgaming.comfe208882010-09-01 15:47:57 +00003638void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
3639{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003640 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003641
Geoff Langbfdea662014-07-23 14:16:32 -04003642 if (condition != GL_ALL_COMPLETED_NV)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003643 {
Geoff Langbfdea662014-07-23 14:16:32 -04003644 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003645 }
Geoff Langbfdea662014-07-23 14:16:32 -04003646
3647 gl::Context *context = gl::getNonLostContext();
3648
3649 if (context)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003650 {
Geoff Langbfdea662014-07-23 14:16:32 -04003651 gl::FenceNV *fenceObject = context->getFenceNV(fence);
3652
3653 if (fenceObject == NULL)
3654 {
3655 return gl::error(GL_INVALID_OPERATION);
3656 }
3657
3658 fenceObject->setFence(condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003659 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00003660}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003661
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003662void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
3663{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003664 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 +00003665
Geoff Langbfdea662014-07-23 14:16:32 -04003666 if (width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003667 {
Geoff Langbfdea662014-07-23 14:16:32 -04003668 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003669 }
Geoff Langbfdea662014-07-23 14:16:32 -04003670
3671 gl::Context* context = gl::getNonLostContext();
3672
3673 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003674 {
Geoff Langbfdea662014-07-23 14:16:32 -04003675 context->getState().setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003676 }
3677}
3678
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003679void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003680{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003681 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003682 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003683 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003684
Geoff Lang900013c2014-07-07 11:32:19 -04003685 gl::Context* context = gl::getNonLostContext();
3686 if (context)
3687 {
3688 const std::vector<GLenum> &shaderBinaryFormats = context->getCaps().shaderBinaryFormats;
3689 if (std::find(shaderBinaryFormats.begin(), shaderBinaryFormats.end(), binaryformat) == shaderBinaryFormats.end())
3690 {
3691 return gl::error(GL_INVALID_ENUM);
3692 }
3693
3694 // No binary shader formats are supported.
3695 UNIMPLEMENTED();
3696 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003697}
3698
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00003699void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003700{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003701 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 +00003702 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003703
Geoff Langbfdea662014-07-23 14:16:32 -04003704 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003705 {
Geoff Langbfdea662014-07-23 14:16:32 -04003706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003707 }
Geoff Langbfdea662014-07-23 14:16:32 -04003708
3709 gl::Context *context = gl::getNonLostContext();
3710
3711 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003712 {
Geoff Langbfdea662014-07-23 14:16:32 -04003713 gl::Shader *shaderObject = context->getShader(shader);
3714
3715 if (!shaderObject)
3716 {
3717 if (context->getProgram(shader))
3718 {
3719 return gl::error(GL_INVALID_OPERATION);
3720 }
3721 else
3722 {
3723 return gl::error(GL_INVALID_VALUE);
3724 }
3725 }
3726
3727 shaderObject->setSource(count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003728 }
3729}
3730
3731void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
3732{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003733 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003734}
3735
3736void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3737{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003738 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 +00003739
Geoff Langbfdea662014-07-23 14:16:32 -04003740 switch (face)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003741 {
Geoff Langbfdea662014-07-23 14:16:32 -04003742 case GL_FRONT:
3743 case GL_BACK:
3744 case GL_FRONT_AND_BACK:
3745 break;
3746 default:
3747 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003748 }
Geoff Langbfdea662014-07-23 14:16:32 -04003749
3750 switch (func)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003751 {
Geoff Langbfdea662014-07-23 14:16:32 -04003752 case GL_NEVER:
3753 case GL_ALWAYS:
3754 case GL_LESS:
3755 case GL_LEQUAL:
3756 case GL_EQUAL:
3757 case GL_GEQUAL:
3758 case GL_GREATER:
3759 case GL_NOTEQUAL:
3760 break;
3761 default:
3762 return gl::error(GL_INVALID_ENUM);
3763 }
3764
3765 gl::Context *context = gl::getNonLostContext();
3766
3767 if (context)
3768 {
3769 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3770 {
3771 context->getState().setStencilParams(func, ref, mask);
3772 }
3773
3774 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3775 {
3776 context->getState().setStencilBackParams(func, ref, mask);
3777 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003778 }
3779}
3780
3781void __stdcall glStencilMask(GLuint mask)
3782{
3783 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
3784}
3785
3786void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
3787{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003788 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003789
Geoff Langbfdea662014-07-23 14:16:32 -04003790 switch (face)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003791 {
Geoff Langbfdea662014-07-23 14:16:32 -04003792 case GL_FRONT:
3793 case GL_BACK:
3794 case GL_FRONT_AND_BACK:
3795 break;
3796 default:
3797 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003798 }
Geoff Langbfdea662014-07-23 14:16:32 -04003799
3800 gl::Context *context = gl::getNonLostContext();
3801
3802 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003803 {
Geoff Langbfdea662014-07-23 14:16:32 -04003804 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3805 {
3806 context->getState().setStencilWritemask(mask);
3807 }
3808
3809 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3810 {
3811 context->getState().setStencilBackWritemask(mask);
3812 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003813 }
3814}
3815
3816void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
3817{
3818 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
3819}
3820
3821void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3822{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003823 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 +00003824 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003825
Geoff Langbfdea662014-07-23 14:16:32 -04003826 switch (face)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003827 {
Geoff Langbfdea662014-07-23 14:16:32 -04003828 case GL_FRONT:
3829 case GL_BACK:
3830 case GL_FRONT_AND_BACK:
3831 break;
3832 default:
3833 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003834 }
Geoff Langbfdea662014-07-23 14:16:32 -04003835
3836 switch (fail)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003837 {
Geoff Langbfdea662014-07-23 14:16:32 -04003838 case GL_ZERO:
3839 case GL_KEEP:
3840 case GL_REPLACE:
3841 case GL_INCR:
3842 case GL_DECR:
3843 case GL_INVERT:
3844 case GL_INCR_WRAP:
3845 case GL_DECR_WRAP:
3846 break;
3847 default:
3848 return gl::error(GL_INVALID_ENUM);
3849 }
3850
3851 switch (zfail)
3852 {
3853 case GL_ZERO:
3854 case GL_KEEP:
3855 case GL_REPLACE:
3856 case GL_INCR:
3857 case GL_DECR:
3858 case GL_INVERT:
3859 case GL_INCR_WRAP:
3860 case GL_DECR_WRAP:
3861 break;
3862 default:
3863 return gl::error(GL_INVALID_ENUM);
3864 }
3865
3866 switch (zpass)
3867 {
3868 case GL_ZERO:
3869 case GL_KEEP:
3870 case GL_REPLACE:
3871 case GL_INCR:
3872 case GL_DECR:
3873 case GL_INVERT:
3874 case GL_INCR_WRAP:
3875 case GL_DECR_WRAP:
3876 break;
3877 default:
3878 return gl::error(GL_INVALID_ENUM);
3879 }
3880
3881 gl::Context *context = gl::getNonLostContext();
3882
3883 if (context)
3884 {
3885 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3886 {
3887 context->getState().setStencilOperations(fail, zfail, zpass);
3888 }
3889
3890 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3891 {
3892 context->getState().setStencilBackOperations(fail, zfail, zpass);
3893 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003894 }
3895}
3896
daniel@transgaming.comfe208882010-09-01 15:47:57 +00003897GLboolean __stdcall glTestFenceNV(GLuint fence)
3898{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003899 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003900
Geoff Langbfdea662014-07-23 14:16:32 -04003901 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003902
Geoff Langbfdea662014-07-23 14:16:32 -04003903 if (context)
3904 {
3905 gl::FenceNV *fenceObject = context->getFenceNV(fence);
3906
3907 if (fenceObject == NULL)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003908 {
Geoff Langbfdea662014-07-23 14:16:32 -04003909 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003910 }
Geoff Langbfdea662014-07-23 14:16:32 -04003911
3912 if (fenceObject->isFence() != GL_TRUE)
3913 {
3914 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
3915 }
3916
3917 return fenceObject->testFence();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003918 }
Geoff Langbfdea662014-07-23 14:16:32 -04003919
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003920 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00003921}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003922
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003923void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
3924 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003925{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003926 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003927 "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 +00003928 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003929
Geoff Langbfdea662014-07-23 14:16:32 -04003930 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003931
Geoff Langbfdea662014-07-23 14:16:32 -04003932 if (context)
3933 {
3934 if (context->getClientVersion() < 3 &&
3935 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
3936 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003937 {
Geoff Langbfdea662014-07-23 14:16:32 -04003938 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003939 }
Geoff Langbfdea662014-07-23 14:16:32 -04003940
3941 if (context->getClientVersion() >= 3 &&
3942 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
3943 0, 0, 0, width, height, 1, border, format, type, pixels))
3944 {
3945 return;
3946 }
3947
3948 switch (target)
3949 {
3950 case GL_TEXTURE_2D:
3951 {
3952 gl::Texture2D *texture = context->getTexture2D();
3953 texture->setImage(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
3954 }
3955 break;
3956 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
3957 {
3958 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3959 texture->setImagePosX(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
3960 }
3961 break;
3962 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
3963 {
3964 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3965 texture->setImageNegX(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
3966 }
3967 break;
3968 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
3969 {
3970 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3971 texture->setImagePosY(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
3972 }
3973 break;
3974 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
3975 {
3976 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3977 texture->setImageNegY(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
3978 }
3979 break;
3980 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
3981 {
3982 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3983 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
3984 }
3985 break;
3986 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
3987 {
3988 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3989 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
3990 }
3991 break;
3992 default: UNREACHABLE();
3993 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994 }
3995}
3996
3997void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
3998{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003999 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4000
Geoff Langbfdea662014-07-23 14:16:32 -04004001 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004002
Geoff Langbfdea662014-07-23 14:16:32 -04004003 if (context)
4004 {
4005 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004006 {
Geoff Langbfdea662014-07-23 14:16:32 -04004007 return;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004008 }
Geoff Langbfdea662014-07-23 14:16:32 -04004009
4010 gl::Texture *texture = context->getTargetTexture(target);
4011
4012 if (!texture)
4013 {
4014 return gl::error(GL_INVALID_ENUM);
4015 }
4016
4017 switch (pname)
4018 {
4019 case GL_TEXTURE_WRAP_S: texture->getSamplerState().wrapS = gl::uiround<GLenum>(param); break;
4020 case GL_TEXTURE_WRAP_T: texture->getSamplerState().wrapT = gl::uiround<GLenum>(param); break;
4021 case GL_TEXTURE_WRAP_R: texture->getSamplerState().wrapR = gl::uiround<GLenum>(param); break;
4022 case GL_TEXTURE_MIN_FILTER: texture->getSamplerState().minFilter = gl::uiround<GLenum>(param); break;
4023 case GL_TEXTURE_MAG_FILTER: texture->getSamplerState().magFilter = gl::uiround<GLenum>(param); break;
4024 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
4025 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->getSamplerState().maxAnisotropy = std::min(param, context->getExtensions().maxTextureAnisotropy); break;
4026 case GL_TEXTURE_COMPARE_MODE: texture->getSamplerState().compareMode = gl::uiround<GLenum>(param); break;
4027 case GL_TEXTURE_COMPARE_FUNC: texture->getSamplerState().compareFunc = gl::uiround<GLenum>(param); break;
4028 case GL_TEXTURE_SWIZZLE_R: texture->getSamplerState().swizzleRed = gl::uiround<GLenum>(param); break;
4029 case GL_TEXTURE_SWIZZLE_G: texture->getSamplerState().swizzleGreen = gl::uiround<GLenum>(param); break;
4030 case GL_TEXTURE_SWIZZLE_B: texture->getSamplerState().swizzleBlue = gl::uiround<GLenum>(param); break;
4031 case GL_TEXTURE_SWIZZLE_A: texture->getSamplerState().swizzleAlpha = gl::uiround<GLenum>(param); break;
4032 case GL_TEXTURE_BASE_LEVEL: texture->getSamplerState().baseLevel = gl::iround<GLint>(param); break;
4033 case GL_TEXTURE_MAX_LEVEL: texture->getSamplerState().maxLevel = gl::iround<GLint>(param); break;
4034 case GL_TEXTURE_MIN_LOD: texture->getSamplerState().minLod = param; break;
4035 case GL_TEXTURE_MAX_LOD: texture->getSamplerState().maxLod = param; break;
4036 default: UNREACHABLE(); break;
4037 }
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004038 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004039}
4040
4041void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4042{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004043 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004044}
4045
4046void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4047{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004048 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004049
Geoff Langbfdea662014-07-23 14:16:32 -04004050 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004051
Geoff Langbfdea662014-07-23 14:16:32 -04004052 if (context)
4053 {
4054 if (!ValidateTexParamParameters(context, pname, param))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004055 {
Geoff Langbfdea662014-07-23 14:16:32 -04004056 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004057 }
Geoff Langbfdea662014-07-23 14:16:32 -04004058
4059 gl::Texture *texture = context->getTargetTexture(target);
4060
4061 if (!texture)
4062 {
4063 return gl::error(GL_INVALID_ENUM);
4064 }
4065
4066 switch (pname)
4067 {
4068 case GL_TEXTURE_WRAP_S: texture->getSamplerState().wrapS = (GLenum)param; break;
4069 case GL_TEXTURE_WRAP_T: texture->getSamplerState().wrapT = (GLenum)param; break;
4070 case GL_TEXTURE_WRAP_R: texture->getSamplerState().wrapR = (GLenum)param; break;
4071 case GL_TEXTURE_MIN_FILTER: texture->getSamplerState().minFilter = (GLenum)param; break;
4072 case GL_TEXTURE_MAG_FILTER: texture->getSamplerState().magFilter = (GLenum)param; break;
4073 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
4074 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->getSamplerState().maxAnisotropy = std::min((float)param, context->getExtensions().maxTextureAnisotropy); break;
4075 case GL_TEXTURE_COMPARE_MODE: texture->getSamplerState().compareMode = (GLenum)param; break;
4076 case GL_TEXTURE_COMPARE_FUNC: texture->getSamplerState().compareFunc = (GLenum)param; break;
4077 case GL_TEXTURE_SWIZZLE_R: texture->getSamplerState().swizzleRed = (GLenum)param; break;
4078 case GL_TEXTURE_SWIZZLE_G: texture->getSamplerState().swizzleGreen = (GLenum)param; break;
4079 case GL_TEXTURE_SWIZZLE_B: texture->getSamplerState().swizzleBlue = (GLenum)param; break;
4080 case GL_TEXTURE_SWIZZLE_A: texture->getSamplerState().swizzleAlpha = (GLenum)param; break;
4081 case GL_TEXTURE_BASE_LEVEL: texture->getSamplerState().baseLevel = param; break;
4082 case GL_TEXTURE_MAX_LEVEL: texture->getSamplerState().maxLevel = param; break;
4083 case GL_TEXTURE_MIN_LOD: texture->getSamplerState().minLod = (GLfloat)param; break;
4084 case GL_TEXTURE_MAX_LOD: texture->getSamplerState().maxLod = (GLfloat)param; break;
4085 default: UNREACHABLE(); break;
4086 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004087 }
4088}
4089
4090void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
4091{
4092 glTexParameteri(target, pname, *params);
4093}
4094
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00004095void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
4096{
4097 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
4098 target, levels, internalformat, width, height);
4099
Geoff Langbfdea662014-07-23 14:16:32 -04004100 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00004101
Geoff Langbfdea662014-07-23 14:16:32 -04004102 if (context)
4103 {
4104 if (!context->getExtensions().textureStorage)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00004105 {
Geoff Langbfdea662014-07-23 14:16:32 -04004106 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00004107 }
Geoff Langbfdea662014-07-23 14:16:32 -04004108
4109 if (context->getClientVersion() < 3 &&
4110 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
4111 {
4112 return;
4113 }
4114
4115 if (context->getClientVersion() >= 3 &&
4116 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
4117 {
4118 return;
4119 }
4120
4121 switch (target)
4122 {
4123 case GL_TEXTURE_2D:
4124 {
4125 gl::Texture2D *texture2d = context->getTexture2D();
4126 texture2d->storage(levels, internalformat, width, height);
4127 }
4128 break;
4129
4130 case GL_TEXTURE_CUBE_MAP:
4131 {
4132 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
4133 textureCube->storage(levels, internalformat, width);
4134 }
4135 break;
4136
4137 default:
4138 return gl::error(GL_INVALID_ENUM);
4139 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00004140 }
4141}
4142
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004143void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
4144 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004145{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004146 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004147 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004148 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004149 target, level, xoffset, yoffset, width, height, format, type, pixels);
4150
Geoff Langbfdea662014-07-23 14:16:32 -04004151 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00004152
Geoff Langbfdea662014-07-23 14:16:32 -04004153 if (context)
4154 {
4155 if (context->getClientVersion() < 3 &&
4156 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
4157 xoffset, yoffset, width, height, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00004158 {
Geoff Langbfdea662014-07-23 14:16:32 -04004159 return;
daniel@transgaming.com00c75962010-03-11 20:36:15 +00004160 }
Geoff Langbfdea662014-07-23 14:16:32 -04004161
4162 if (context->getClientVersion() >= 3 &&
4163 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
4164 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
4165 {
4166 return;
4167 }
4168
4169 // Zero sized uploads are valid but no-ops
4170 if (width == 0 || height == 0)
4171 {
4172 return;
4173 }
4174
4175 switch (target)
4176 {
4177 case GL_TEXTURE_2D:
4178 {
4179 gl::Texture2D *texture = context->getTexture2D();
4180 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getState().getUnpackState(), pixels);
4181 }
4182 break;
4183
4184 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
4185 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4186 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4187 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4188 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4189 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4190 {
4191 gl::TextureCubeMap *texture = context->getTextureCubeMap();
4192 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getState().getUnpackState(), pixels);
4193 }
4194 break;
4195
4196 default:
4197 UNREACHABLE();
4198 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004199 }
4200}
4201
4202void __stdcall glUniform1f(GLint location, GLfloat x)
4203{
4204 glUniform1fv(location, 1, &x);
4205}
4206
4207void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
4208{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004209 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004210
Geoff Langbfdea662014-07-23 14:16:32 -04004211 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004212
Geoff Langbfdea662014-07-23 14:16:32 -04004213 if (context)
4214 {
4215 if (!ValidateUniform(context, GL_FLOAT, location, count))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004216 {
Geoff Langbfdea662014-07-23 14:16:32 -04004217 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004218 }
Geoff Langbfdea662014-07-23 14:16:32 -04004219
4220 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4221 programBinary->setUniform1fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004222 }
4223}
4224
4225void __stdcall glUniform1i(GLint location, GLint x)
4226{
4227 glUniform1iv(location, 1, &x);
4228}
4229
4230void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
4231{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004232 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004233
Geoff Langbfdea662014-07-23 14:16:32 -04004234 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004235
Geoff Langbfdea662014-07-23 14:16:32 -04004236 if (context)
4237 {
4238 if (!ValidateUniform(context, GL_INT, location, count))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004239 {
Geoff Langbfdea662014-07-23 14:16:32 -04004240 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004241 }
Geoff Langbfdea662014-07-23 14:16:32 -04004242
4243 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4244 programBinary->setUniform1iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004245 }
4246}
4247
4248void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
4249{
4250 GLfloat xy[2] = {x, y};
4251
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004252 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004253}
4254
4255void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
4256{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004257 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004258
Geoff Langbfdea662014-07-23 14:16:32 -04004259 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004260
Geoff Langbfdea662014-07-23 14:16:32 -04004261 if (context)
4262 {
4263 if (!ValidateUniform(context, GL_FLOAT_VEC2, location, count))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004264 {
Geoff Langbfdea662014-07-23 14:16:32 -04004265 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004266 }
Geoff Langbfdea662014-07-23 14:16:32 -04004267
4268 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4269 programBinary->setUniform2fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004270 }
4271}
4272
4273void __stdcall glUniform2i(GLint location, GLint x, GLint y)
4274{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004275 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004276
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004277 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004278}
4279
4280void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
4281{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004282 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004283
Geoff Langbfdea662014-07-23 14:16:32 -04004284 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004285
Geoff Langbfdea662014-07-23 14:16:32 -04004286 if (context)
4287 {
4288 if (!ValidateUniform(context, GL_INT_VEC2, location, count))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004289 {
Geoff Langbfdea662014-07-23 14:16:32 -04004290 return;
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004291 }
Geoff Langbfdea662014-07-23 14:16:32 -04004292
4293 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4294 programBinary->setUniform2iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004295 }
4296}
4297
4298void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
4299{
4300 GLfloat xyz[3] = {x, y, z};
4301
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004302 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004303}
4304
4305void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
4306{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004307 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004308
Geoff Langbfdea662014-07-23 14:16:32 -04004309 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004310
Geoff Langbfdea662014-07-23 14:16:32 -04004311 if (context)
4312 {
4313 if (!ValidateUniform(context, GL_FLOAT_VEC3, location, count))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004314 {
Geoff Langbfdea662014-07-23 14:16:32 -04004315 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004316 }
Geoff Langbfdea662014-07-23 14:16:32 -04004317
4318 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4319 programBinary->setUniform3fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004320 }
4321}
4322
4323void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
4324{
4325 GLint xyz[3] = {x, y, z};
4326
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004327 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004328}
4329
4330void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
4331{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004332 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004333
Geoff Langbfdea662014-07-23 14:16:32 -04004334 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004335
Geoff Langbfdea662014-07-23 14:16:32 -04004336 if (context)
4337 {
4338 if (!ValidateUniform(context, GL_INT_VEC3, location, count))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004339 {
Geoff Langbfdea662014-07-23 14:16:32 -04004340 return;
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004341 }
Geoff Langbfdea662014-07-23 14:16:32 -04004342
4343 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4344 programBinary->setUniform3iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004345 }
4346}
4347
4348void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4349{
4350 GLfloat xyzw[4] = {x, y, z, w};
4351
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004352 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004353}
4354
4355void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
4356{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004357 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004358
Geoff Langbfdea662014-07-23 14:16:32 -04004359 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004360
Geoff Langbfdea662014-07-23 14:16:32 -04004361 if (context)
4362 {
4363 if (!ValidateUniform(context, GL_FLOAT_VEC4, location, count))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004364 {
Geoff Langbfdea662014-07-23 14:16:32 -04004365 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004366 }
Geoff Langbfdea662014-07-23 14:16:32 -04004367
4368 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4369 programBinary->setUniform4fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004370 }
4371}
4372
4373void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
4374{
4375 GLint xyzw[4] = {x, y, z, w};
4376
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004377 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004378}
4379
4380void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
4381{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004382 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004383
Geoff Langbfdea662014-07-23 14:16:32 -04004384 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004385
Geoff Langbfdea662014-07-23 14:16:32 -04004386 if (context)
4387 {
4388 if (!ValidateUniform(context, GL_INT_VEC4, location, count))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004389 {
Geoff Langbfdea662014-07-23 14:16:32 -04004390 return;
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004391 }
Geoff Langbfdea662014-07-23 14:16:32 -04004392
4393 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4394 programBinary->setUniform4iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004395 }
4396}
4397
4398void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
4399{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004400 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004401 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004402
Geoff Langbfdea662014-07-23 14:16:32 -04004403 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004404
Geoff Langbfdea662014-07-23 14:16:32 -04004405 if (context)
4406 {
4407 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004408 {
Geoff Langbfdea662014-07-23 14:16:32 -04004409 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004410 }
Geoff Langbfdea662014-07-23 14:16:32 -04004411
4412 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4413 programBinary->setUniformMatrix2fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004414 }
4415}
4416
4417void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
4418{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004419 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004420 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004421
Geoff Langbfdea662014-07-23 14:16:32 -04004422 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004423
Geoff Langbfdea662014-07-23 14:16:32 -04004424 if (context)
4425 {
4426 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004427 {
Geoff Langbfdea662014-07-23 14:16:32 -04004428 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004429 }
Geoff Langbfdea662014-07-23 14:16:32 -04004430
4431 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4432 programBinary->setUniformMatrix3fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004433 }
4434}
4435
4436void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
4437{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004438 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004439 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004440
Geoff Langbfdea662014-07-23 14:16:32 -04004441 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004442
Geoff Langbfdea662014-07-23 14:16:32 -04004443 if (context)
4444 {
4445 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004446 {
Geoff Langbfdea662014-07-23 14:16:32 -04004447 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004448 }
Geoff Langbfdea662014-07-23 14:16:32 -04004449
4450 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4451 programBinary->setUniformMatrix4fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004452 }
4453}
4454
4455void __stdcall glUseProgram(GLuint program)
4456{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004457 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004458
Geoff Langbfdea662014-07-23 14:16:32 -04004459 gl::Context *context = gl::getNonLostContext();
4460
4461 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004462 {
Geoff Langbfdea662014-07-23 14:16:32 -04004463 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004464
Geoff Langbfdea662014-07-23 14:16:32 -04004465 if (!programObject && program != 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004466 {
Geoff Langbfdea662014-07-23 14:16:32 -04004467 if (context->getShader(program))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004469 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004470 }
Geoff Langbfdea662014-07-23 14:16:32 -04004471 else
4472 {
4473 return gl::error(GL_INVALID_VALUE);
4474 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004475 }
Geoff Langbfdea662014-07-23 14:16:32 -04004476
4477 if (program != 0 && !programObject->isLinked())
4478 {
4479 return gl::error(GL_INVALID_OPERATION);
4480 }
4481
4482 context->useProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004483 }
4484}
4485
4486void __stdcall glValidateProgram(GLuint program)
4487{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004488 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489
Geoff Langbfdea662014-07-23 14:16:32 -04004490 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004491
Geoff Langbfdea662014-07-23 14:16:32 -04004492 if (context)
4493 {
4494 gl::Program *programObject = context->getProgram(program);
4495
4496 if (!programObject)
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004497 {
Geoff Langbfdea662014-07-23 14:16:32 -04004498 if (context->getShader(program))
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004499 {
Geoff Langbfdea662014-07-23 14:16:32 -04004500 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004501 }
Geoff Langbfdea662014-07-23 14:16:32 -04004502 else
4503 {
4504 return gl::error(GL_INVALID_VALUE);
4505 }
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004506 }
Geoff Langbfdea662014-07-23 14:16:32 -04004507
4508 programObject->validate();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004509 }
4510}
4511
4512void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
4513{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004514 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004515
Geoff Langbfdea662014-07-23 14:16:32 -04004516 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004517 {
Geoff Langbfdea662014-07-23 14:16:32 -04004518 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004519 }
Geoff Langbfdea662014-07-23 14:16:32 -04004520
4521 gl::Context *context = gl::getNonLostContext();
4522
4523 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004524 {
Geoff Langbfdea662014-07-23 14:16:32 -04004525 GLfloat vals[4] = { x, 0, 0, 1 };
4526 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004527 }
4528}
4529
4530void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
4531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004532 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004533
Geoff Langbfdea662014-07-23 14:16:32 -04004534 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004535 {
Geoff Langbfdea662014-07-23 14:16:32 -04004536 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004537 }
Geoff Langbfdea662014-07-23 14:16:32 -04004538
4539 gl::Context *context = gl::getNonLostContext();
4540
4541 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004542 {
Geoff Langbfdea662014-07-23 14:16:32 -04004543 GLfloat vals[4] = { values[0], 0, 0, 1 };
4544 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545 }
4546}
4547
4548void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4549{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004550 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004551
Geoff Langbfdea662014-07-23 14:16:32 -04004552 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004553 {
Geoff Langbfdea662014-07-23 14:16:32 -04004554 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004555 }
Geoff Langbfdea662014-07-23 14:16:32 -04004556
4557 gl::Context *context = gl::getNonLostContext();
4558
4559 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004560 {
Geoff Langbfdea662014-07-23 14:16:32 -04004561 GLfloat vals[4] = { x, y, 0, 1 };
4562 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004563 }
4564}
4565
4566void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
4567{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004568 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004569
Geoff Langbfdea662014-07-23 14:16:32 -04004570 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004571 {
Geoff Langbfdea662014-07-23 14:16:32 -04004572 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004573 }
Geoff Langbfdea662014-07-23 14:16:32 -04004574
4575 gl::Context *context = gl::getNonLostContext();
4576
4577 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004578 {
Geoff Langbfdea662014-07-23 14:16:32 -04004579 GLfloat vals[4] = { values[0], values[1], 0, 1 };
4580 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004581 }
4582}
4583
4584void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4585{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004586 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 +00004587
Geoff Langbfdea662014-07-23 14:16:32 -04004588 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004589 {
Geoff Langbfdea662014-07-23 14:16:32 -04004590 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004591 }
Geoff Langbfdea662014-07-23 14:16:32 -04004592
4593 gl::Context *context = gl::getNonLostContext();
4594
4595 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004596 {
Geoff Langbfdea662014-07-23 14:16:32 -04004597 GLfloat vals[4] = { x, y, z, 1 };
4598 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004599 }
4600}
4601
4602void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
4603{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004604 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004605
Geoff Langbfdea662014-07-23 14:16:32 -04004606 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004607 {
Geoff Langbfdea662014-07-23 14:16:32 -04004608 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004609 }
Geoff Langbfdea662014-07-23 14:16:32 -04004610
4611 gl::Context *context = gl::getNonLostContext();
4612
4613 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004614 {
Geoff Langbfdea662014-07-23 14:16:32 -04004615 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
4616 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004617 }
4618}
4619
4620void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4621{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004622 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 +00004623
Geoff Langbfdea662014-07-23 14:16:32 -04004624 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004625 {
Geoff Langbfdea662014-07-23 14:16:32 -04004626 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004627 }
Geoff Langbfdea662014-07-23 14:16:32 -04004628
4629 gl::Context *context = gl::getNonLostContext();
4630
4631 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004632 {
Geoff Langbfdea662014-07-23 14:16:32 -04004633 GLfloat vals[4] = { x, y, z, w };
4634 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004635 }
4636}
4637
4638void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
4639{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004640 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004641
Geoff Langbfdea662014-07-23 14:16:32 -04004642 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004643 {
Geoff Langbfdea662014-07-23 14:16:32 -04004644 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004645 }
Geoff Langbfdea662014-07-23 14:16:32 -04004646
4647 gl::Context *context = gl::getNonLostContext();
4648
4649 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004650 {
Geoff Langbfdea662014-07-23 14:16:32 -04004651 context->getState().setVertexAttribf(index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004652 }
4653}
4654
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004655void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
4656{
4657 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
4658
Geoff Langbfdea662014-07-23 14:16:32 -04004659 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004660 {
Geoff Langbfdea662014-07-23 14:16:32 -04004661 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004662 }
Geoff Langbfdea662014-07-23 14:16:32 -04004663
4664 gl::Context *context = gl::getNonLostContext();
4665
4666 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004667 {
Geoff Langbfdea662014-07-23 14:16:32 -04004668 context->setVertexAttribDivisor(index, divisor);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004669 }
4670}
4671
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004672void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004673{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004674 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004675 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004676 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004677
Geoff Langbfdea662014-07-23 14:16:32 -04004678 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004679 {
Geoff Langbfdea662014-07-23 14:16:32 -04004680 return gl::error(GL_INVALID_VALUE);
4681 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004682
Geoff Langbfdea662014-07-23 14:16:32 -04004683 if (size < 1 || size > 4)
4684 {
4685 return gl::error(GL_INVALID_VALUE);
4686 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004687
Geoff Langbfdea662014-07-23 14:16:32 -04004688 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00004689
Geoff Langbfdea662014-07-23 14:16:32 -04004690 switch (type)
4691 {
4692 case GL_BYTE:
4693 case GL_UNSIGNED_BYTE:
4694 case GL_SHORT:
4695 case GL_UNSIGNED_SHORT:
4696 case GL_FIXED:
4697 case GL_FLOAT:
4698 break;
4699 case GL_HALF_FLOAT:
4700 case GL_INT:
4701 case GL_UNSIGNED_INT:
4702 case GL_INT_2_10_10_10_REV:
4703 case GL_UNSIGNED_INT_2_10_10_10_REV:
4704 if (context && context->getClientVersion() < 3)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004706 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004707 }
Geoff Langbfdea662014-07-23 14:16:32 -04004708 else
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004709 {
Geoff Langbfdea662014-07-23 14:16:32 -04004710 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004711 }
Geoff Langbfdea662014-07-23 14:16:32 -04004712 default:
4713 return gl::error(GL_INVALID_ENUM);
4714 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004715
Geoff Langbfdea662014-07-23 14:16:32 -04004716 if (stride < 0)
4717 {
4718 return gl::error(GL_INVALID_VALUE);
4719 }
4720
4721 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
4722 {
4723 return gl::error(GL_INVALID_OPERATION);
4724 }
4725
4726 if (context)
4727 {
4728 // [OpenGL ES 3.0.2] Section 2.8 page 24:
4729 // An INVALID_OPERATION error is generated when a non-zero vertex array object
4730 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
4731 // and the pointer argument is not NULL.
4732 if (context->getState().getVertexArray()->id() != 0 && context->getState().getArrayBufferId() == 0 && ptr != NULL)
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00004733 {
4734 return gl::error(GL_INVALID_OPERATION);
4735 }
4736
Geoff Langbfdea662014-07-23 14:16:32 -04004737 context->getState().setVertexAttribState(index, context->getState().getTargetBuffer(GL_ARRAY_BUFFER), size, type,
4738 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004739 }
4740}
4741
4742void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
4743{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004744 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 +00004745
Geoff Langbfdea662014-07-23 14:16:32 -04004746 if (width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004747 {
Geoff Langbfdea662014-07-23 14:16:32 -04004748 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004749 }
Geoff Langbfdea662014-07-23 14:16:32 -04004750
4751 gl::Context *context = gl::getNonLostContext();
4752
4753 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004754 {
Geoff Langbfdea662014-07-23 14:16:32 -04004755 context->getState().setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004756 }
4757}
4758
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004759// OpenGL ES 3.0 functions
4760
4761void __stdcall glReadBuffer(GLenum mode)
4762{
4763 EVENT("(GLenum mode = 0x%X)", mode);
4764
Geoff Langbfdea662014-07-23 14:16:32 -04004765 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004766
Geoff Langbfdea662014-07-23 14:16:32 -04004767 if (context)
4768 {
4769 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004770 {
Geoff Langbfdea662014-07-23 14:16:32 -04004771 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00004772 }
Geoff Langbfdea662014-07-23 14:16:32 -04004773
4774 // glReadBuffer
4775 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004776 }
4777}
4778
4779void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
4780{
4781 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
4782 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
4783
Geoff Langbfdea662014-07-23 14:16:32 -04004784 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004785
Geoff Langbfdea662014-07-23 14:16:32 -04004786 if (context)
4787 {
4788 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004789 {
Geoff Langbfdea662014-07-23 14:16:32 -04004790 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00004791 }
Geoff Langbfdea662014-07-23 14:16:32 -04004792
4793 // glDrawRangeElements
4794 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004795 }
4796}
4797
4798void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
4799{
4800 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
4801 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
4802 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
4803 target, level, internalformat, width, height, depth, border, format, type, pixels);
4804
Geoff Langbfdea662014-07-23 14:16:32 -04004805 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004806
Geoff Langbfdea662014-07-23 14:16:32 -04004807 if (context)
4808 {
4809 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004810 {
Geoff Langbfdea662014-07-23 14:16:32 -04004811 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00004812 }
Geoff Langbfdea662014-07-23 14:16:32 -04004813
4814 // validateES3TexImageFormat sets the error code if there is an error
4815 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
4816 0, 0, 0, width, height, depth, border, format, type, pixels))
4817 {
4818 return;
4819 }
4820
4821 switch(target)
4822 {
4823 case GL_TEXTURE_3D:
4824 {
4825 gl::Texture3D *texture = context->getTexture3D();
4826 texture->setImage(level, width, height, depth, internalformat, format, type, context->getState().getUnpackState(), pixels);
4827 }
4828 break;
4829
4830 case GL_TEXTURE_2D_ARRAY:
4831 {
4832 gl::Texture2DArray *texture = context->getTexture2DArray();
4833 texture->setImage(level, width, height, depth, internalformat, format, type, context->getState().getUnpackState(), pixels);
4834 }
4835 break;
4836
4837 default:
4838 return gl::error(GL_INVALID_ENUM);
4839 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004840 }
4841}
4842
4843void __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)
4844{
4845 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
4846 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
4847 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
4848 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
4849
Geoff Langbfdea662014-07-23 14:16:32 -04004850 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004851
Geoff Langbfdea662014-07-23 14:16:32 -04004852 if (context)
4853 {
4854 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004855 {
Geoff Langbfdea662014-07-23 14:16:32 -04004856 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00004857 }
Geoff Langbfdea662014-07-23 14:16:32 -04004858
4859 // validateES3TexImageFormat sets the error code if there is an error
4860 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
4861 xoffset, yoffset, zoffset, width, height, depth, 0,
4862 format, type, pixels))
4863 {
4864 return;
4865 }
4866
4867 // Zero sized uploads are valid but no-ops
4868 if (width == 0 || height == 0 || depth == 0)
4869 {
4870 return;
4871 }
4872
4873 switch(target)
4874 {
4875 case GL_TEXTURE_3D:
4876 {
4877 gl::Texture3D *texture = context->getTexture3D();
4878 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getState().getUnpackState(), pixels);
4879 }
4880 break;
4881
4882 case GL_TEXTURE_2D_ARRAY:
4883 {
4884 gl::Texture2DArray *texture = context->getTexture2DArray();
4885 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getState().getUnpackState(), pixels);
4886 }
4887 break;
4888
4889 default:
4890 return gl::error(GL_INVALID_ENUM);
4891 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004892 }
4893}
4894
4895void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
4896{
4897 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
4898 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
4899 target, level, xoffset, yoffset, zoffset, x, y, width, height);
4900
Geoff Langbfdea662014-07-23 14:16:32 -04004901 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004902
Geoff Langbfdea662014-07-23 14:16:32 -04004903 if (context)
4904 {
4905 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004906 {
Geoff Langbfdea662014-07-23 14:16:32 -04004907 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00004908 }
Geoff Langbfdea662014-07-23 14:16:32 -04004909
4910 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset, yoffset, zoffset,
4911 x, y, width, height, 0))
4912 {
4913 return;
4914 }
4915
4916 gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
4917 gl::Texture *texture = NULL;
4918 switch (target)
4919 {
4920 case GL_TEXTURE_3D:
4921 texture = context->getTexture3D();
4922 break;
4923
4924 case GL_TEXTURE_2D_ARRAY:
4925 texture = context->getTexture2DArray();
4926 break;
4927
4928 default:
4929 return gl::error(GL_INVALID_ENUM);
4930 }
4931
4932 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004933 }
4934}
4935
4936void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
4937{
Geoff Langeef52cc2013-10-16 15:07:39 -04004938 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 +00004939 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
4940 "const GLvoid* data = 0x%0.8p)",
4941 target, level, internalformat, width, height, depth, border, imageSize, data);
4942
Geoff Langbfdea662014-07-23 14:16:32 -04004943 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004944
Geoff Langbfdea662014-07-23 14:16:32 -04004945 if (context)
4946 {
4947 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004948 {
Geoff Langbfdea662014-07-23 14:16:32 -04004949 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00004950 }
Geoff Langbfdea662014-07-23 14:16:32 -04004951
Geoff Lang5d601382014-07-22 15:14:06 -04004952 const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalformat);
4953 if (imageSize < 0 || static_cast<GLuint>(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
Geoff Langbfdea662014-07-23 14:16:32 -04004954 {
4955 return gl::error(GL_INVALID_VALUE);
4956 }
4957
4958 // validateES3TexImageFormat sets the error code if there is an error
4959 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
4960 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
4961 {
4962 return;
4963 }
4964
4965 switch(target)
4966 {
4967 case GL_TEXTURE_3D:
4968 {
4969 gl::Texture3D *texture = context->getTexture3D();
4970 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
4971 }
4972 break;
4973
4974 case GL_TEXTURE_2D_ARRAY:
4975 {
4976 gl::Texture2DArray *texture = context->getTexture2DArray();
4977 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
4978 }
4979 break;
4980
4981 default:
4982 return gl::error(GL_INVALID_ENUM);
4983 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004984 }
4985}
4986
4987void __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)
4988{
4989 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
4990 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
4991 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
4992 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
4993
Geoff Langbfdea662014-07-23 14:16:32 -04004994 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004995
Geoff Langbfdea662014-07-23 14:16:32 -04004996 if (context)
4997 {
4998 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004999 {
Geoff Langbfdea662014-07-23 14:16:32 -04005000 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005001 }
Geoff Langbfdea662014-07-23 14:16:32 -04005002
Geoff Lang5d601382014-07-22 15:14:06 -04005003 const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(format);
5004 if (imageSize < 0 || static_cast<GLuint>(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
Geoff Langbfdea662014-07-23 14:16:32 -04005005 {
5006 return gl::error(GL_INVALID_VALUE);
5007 }
5008
5009 if (!data)
5010 {
5011 return gl::error(GL_INVALID_VALUE);
5012 }
5013
5014 // validateES3TexImageFormat sets the error code if there is an error
5015 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
5016 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
5017 {
5018 return;
5019 }
5020
5021 // Zero sized uploads are valid but no-ops
5022 if (width == 0 || height == 0)
5023 {
5024 return;
5025 }
5026
5027 switch(target)
5028 {
5029 case GL_TEXTURE_3D:
5030 {
5031 gl::Texture3D *texture = context->getTexture3D();
5032 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
5033 format, imageSize, data);
5034 }
5035 break;
5036
5037 case GL_TEXTURE_2D_ARRAY:
5038 {
5039 gl::Texture2DArray *texture = context->getTexture2DArray();
5040 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
5041 format, imageSize, data);
5042 }
5043 break;
5044
5045 default:
5046 return gl::error(GL_INVALID_ENUM);
5047 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005048 }
5049}
5050
5051void __stdcall glGenQueries(GLsizei n, GLuint* ids)
5052{
5053 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
5054
Geoff Langbfdea662014-07-23 14:16:32 -04005055 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005056
Geoff Langbfdea662014-07-23 14:16:32 -04005057 if (context)
5058 {
5059 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005060 {
Geoff Langbfdea662014-07-23 14:16:32 -04005061 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005062 }
Geoff Langbfdea662014-07-23 14:16:32 -04005063
5064 if (n < 0)
5065 {
5066 return gl::error(GL_INVALID_VALUE);
5067 }
5068
5069 for (GLsizei i = 0; i < n; i++)
5070 {
5071 ids[i] = context->createQuery();
5072 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005073 }
5074}
5075
5076void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
5077{
5078 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
5079
Geoff Langbfdea662014-07-23 14:16:32 -04005080 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005081
Geoff Langbfdea662014-07-23 14:16:32 -04005082 if (context)
5083 {
5084 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005085 {
Geoff Langbfdea662014-07-23 14:16:32 -04005086 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005087 }
Geoff Langbfdea662014-07-23 14:16:32 -04005088
5089 if (n < 0)
5090 {
5091 return gl::error(GL_INVALID_VALUE);
5092 }
5093
5094 for (GLsizei i = 0; i < n; i++)
5095 {
5096 context->deleteQuery(ids[i]);
5097 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005098 }
5099}
5100
5101GLboolean __stdcall glIsQuery(GLuint id)
5102{
5103 EVENT("(GLuint id = %u)", id);
5104
Geoff Langbfdea662014-07-23 14:16:32 -04005105 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005106
Geoff Langbfdea662014-07-23 14:16:32 -04005107 if (context)
5108 {
5109 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005110 {
Geoff Langbfdea662014-07-23 14:16:32 -04005111 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005112 }
Geoff Langbfdea662014-07-23 14:16:32 -04005113
5114 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005115 }
5116
5117 return GL_FALSE;
5118}
5119
5120void __stdcall glBeginQuery(GLenum target, GLuint id)
5121{
5122 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
5123
Geoff Langbfdea662014-07-23 14:16:32 -04005124 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005125
Geoff Langbfdea662014-07-23 14:16:32 -04005126 if (context)
5127 {
5128 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005129 {
Geoff Langbfdea662014-07-23 14:16:32 -04005130 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005131 }
Geoff Langbfdea662014-07-23 14:16:32 -04005132
5133 if (!ValidateBeginQuery(context, target, id))
5134 {
5135 return;
5136 }
5137 context->beginQuery(target, id);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005138 }
5139}
5140
5141void __stdcall glEndQuery(GLenum target)
5142{
5143 EVENT("(GLenum target = 0x%X)", target);
5144
Geoff Langbfdea662014-07-23 14:16:32 -04005145 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005146
Geoff Langbfdea662014-07-23 14:16:32 -04005147 if (context)
5148 {
5149 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005150 {
Geoff Langbfdea662014-07-23 14:16:32 -04005151 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005152 }
Geoff Langbfdea662014-07-23 14:16:32 -04005153
5154 if (!ValidateEndQuery(context, target))
5155 {
5156 return;
5157 }
5158
5159 context->endQuery(target);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005160 }
5161}
5162
5163void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
5164{
5165 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
5166
Geoff Langbfdea662014-07-23 14:16:32 -04005167 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005168
Geoff Langbfdea662014-07-23 14:16:32 -04005169 if (context)
5170 {
5171 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005172 {
Geoff Langbfdea662014-07-23 14:16:32 -04005173 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005174 }
Geoff Langbfdea662014-07-23 14:16:32 -04005175
5176 if (!ValidQueryType(context, target))
5177 {
5178 return gl::error(GL_INVALID_ENUM);
5179 }
5180
5181 switch (pname)
5182 {
5183 case GL_CURRENT_QUERY:
5184 params[0] = static_cast<GLint>(context->getState().getActiveQueryId(target));
5185 break;
5186
5187 default:
5188 return gl::error(GL_INVALID_ENUM);
5189 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005190 }
5191}
5192
5193void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
5194{
5195 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
5196
Geoff Langbfdea662014-07-23 14:16:32 -04005197 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005198
Geoff Langbfdea662014-07-23 14:16:32 -04005199 if (context)
5200 {
5201 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005202 {
Geoff Langbfdea662014-07-23 14:16:32 -04005203 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005204 }
Geoff Langbfdea662014-07-23 14:16:32 -04005205
5206 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
5207
5208 if (!queryObject)
5209 {
5210 return gl::error(GL_INVALID_OPERATION);
5211 }
5212
5213 if (context->getState().getActiveQueryId(queryObject->getType()) == id)
5214 {
5215 return gl::error(GL_INVALID_OPERATION);
5216 }
5217
5218 switch(pname)
5219 {
5220 case GL_QUERY_RESULT:
5221 params[0] = queryObject->getResult();
5222 break;
5223 case GL_QUERY_RESULT_AVAILABLE:
5224 params[0] = queryObject->isResultAvailable();
5225 break;
5226 default:
5227 return gl::error(GL_INVALID_ENUM);
5228 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005229 }
5230}
5231
5232GLboolean __stdcall glUnmapBuffer(GLenum target)
5233{
5234 EVENT("(GLenum target = 0x%X)", target);
5235
Geoff Langbfdea662014-07-23 14:16:32 -04005236 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005237
Geoff Langbfdea662014-07-23 14:16:32 -04005238 if (context)
5239 {
5240 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005241 {
Geoff Langbfdea662014-07-23 14:16:32 -04005242 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005243 }
Geoff Langbfdea662014-07-23 14:16:32 -04005244
5245 return glUnmapBufferOES(target);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005246 }
5247
5248 return GL_FALSE;
5249}
5250
5251void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
5252{
5253 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
5254
Geoff Langbfdea662014-07-23 14:16:32 -04005255 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005256
Geoff Langbfdea662014-07-23 14:16:32 -04005257 if (context)
5258 {
5259 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005260 {
Geoff Langbfdea662014-07-23 14:16:32 -04005261 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005262 }
Geoff Langbfdea662014-07-23 14:16:32 -04005263
5264 glGetBufferPointervOES(target, pname, params);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005265 }
5266}
5267
5268void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
5269{
Geoff Langbfdea662014-07-23 14:16:32 -04005270 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005271
Geoff Langbfdea662014-07-23 14:16:32 -04005272 if (context)
5273 {
5274 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005275 {
Geoff Langbfdea662014-07-23 14:16:32 -04005276 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00005277 }
Geoff Langbfdea662014-07-23 14:16:32 -04005278
5279 glDrawBuffersEXT(n, bufs);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005280 }
5281}
5282
5283void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5284{
5285 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5286 location, count, transpose, value);
5287
Geoff Langbfdea662014-07-23 14:16:32 -04005288 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005289
Geoff Langbfdea662014-07-23 14:16:32 -04005290 if (context)
5291 {
5292 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005293 {
Geoff Langbfdea662014-07-23 14:16:32 -04005294 return;
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00005295 }
Geoff Langbfdea662014-07-23 14:16:32 -04005296
5297 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
5298 programBinary->setUniformMatrix2x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005299 }
5300}
5301
5302void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5303{
5304 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5305 location, count, transpose, value);
5306
Geoff Langbfdea662014-07-23 14:16:32 -04005307 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005308
Geoff Langbfdea662014-07-23 14:16:32 -04005309 if (context)
5310 {
5311 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005312 {
Geoff Langbfdea662014-07-23 14:16:32 -04005313 return;
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00005314 }
Geoff Langbfdea662014-07-23 14:16:32 -04005315
5316 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
5317 programBinary->setUniformMatrix3x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005318 }
5319}
5320
5321void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5322{
5323 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5324 location, count, transpose, value);
5325
Geoff Langbfdea662014-07-23 14:16:32 -04005326 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005327
Geoff Langbfdea662014-07-23 14:16:32 -04005328 if (context)
5329 {
5330 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005331 {
Geoff Langbfdea662014-07-23 14:16:32 -04005332 return;
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00005333 }
Geoff Langbfdea662014-07-23 14:16:32 -04005334
5335 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
5336 programBinary->setUniformMatrix2x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005337 }
5338}
5339
5340void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5341{
5342 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5343 location, count, transpose, value);
5344
Geoff Langbfdea662014-07-23 14:16:32 -04005345 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005346
Geoff Langbfdea662014-07-23 14:16:32 -04005347 if (context)
5348 {
5349 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005350 {
Geoff Langbfdea662014-07-23 14:16:32 -04005351 return;
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00005352 }
Geoff Langbfdea662014-07-23 14:16:32 -04005353
5354 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
5355 programBinary->setUniformMatrix4x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005356 }
5357}
5358
5359void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5360{
5361 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5362 location, count, transpose, value);
5363
Geoff Langbfdea662014-07-23 14:16:32 -04005364 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005365
Geoff Langbfdea662014-07-23 14:16:32 -04005366 if (context)
5367 {
5368 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005369 {
Geoff Langbfdea662014-07-23 14:16:32 -04005370 return;
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00005371 }
Geoff Langbfdea662014-07-23 14:16:32 -04005372
5373 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
5374 programBinary->setUniformMatrix3x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005375 }
5376}
5377
5378void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5379{
5380 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5381 location, count, transpose, value);
5382
Geoff Langbfdea662014-07-23 14:16:32 -04005383 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005384
Geoff Langbfdea662014-07-23 14:16:32 -04005385 if (context)
5386 {
5387 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005388 {
Geoff Langbfdea662014-07-23 14:16:32 -04005389 return;
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00005390 }
Geoff Langbfdea662014-07-23 14:16:32 -04005391
5392 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
5393 programBinary->setUniformMatrix4x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005394 }
5395}
5396
5397void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
5398{
5399 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
5400 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
5401 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
5402
Geoff Langbfdea662014-07-23 14:16:32 -04005403 gl::Context *context = gl::getNonLostContext();
5404 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005405 {
Geoff Langbfdea662014-07-23 14:16:32 -04005406 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005407 {
Geoff Langbfdea662014-07-23 14:16:32 -04005408 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005409 }
Geoff Langbfdea662014-07-23 14:16:32 -04005410
5411 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
5412 dstX0, dstY0, dstX1, dstY1, mask, filter,
5413 false))
5414 {
5415 return;
5416 }
5417
5418 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
5419 mask, filter);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005420 }
5421}
5422
5423void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
5424{
5425 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5426 target, samples, internalformat, width, height);
5427
Geoff Langbfdea662014-07-23 14:16:32 -04005428 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005429
Geoff Langbfdea662014-07-23 14:16:32 -04005430 if (context)
5431 {
5432 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005433 {
Geoff Langbfdea662014-07-23 14:16:32 -04005434 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005435 }
Geoff Langbfdea662014-07-23 14:16:32 -04005436
5437 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
5438 width, height, false))
5439 {
5440 return;
5441 }
5442
5443 context->setRenderbufferStorage(width, height, internalformat, samples);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005444 }
5445}
5446
5447void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
5448{
5449 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
5450 target, attachment, texture, level, layer);
5451
Geoff Langbfdea662014-07-23 14:16:32 -04005452 gl::Context *context = gl::getNonLostContext();
5453
5454 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005455 {
Geoff Langbfdea662014-07-23 14:16:32 -04005456 if (!ValidateFramebufferTextureLayer(context, target, attachment, texture,
5457 level, layer))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005458 {
Geoff Langbfdea662014-07-23 14:16:32 -04005459 return;
5460 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04005461
Geoff Langbfdea662014-07-23 14:16:32 -04005462 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
5463 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04005464
Geoff Langbfdea662014-07-23 14:16:32 -04005465 gl::Texture *textureObject = context->getTexture(texture);
5466 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
Geoff Lang3ed0c482013-07-25 17:03:18 -04005467
Geoff Langbfdea662014-07-23 14:16:32 -04005468 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
5469 {
5470 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
5471 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
5472 }
5473 else
5474 {
5475 switch (attachment)
Geoff Lang3ed0c482013-07-25 17:03:18 -04005476 {
Geoff Langbfdea662014-07-23 14:16:32 -04005477 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
5478 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
5479 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
Geoff Lang3ed0c482013-07-25 17:03:18 -04005480 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005481 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005482 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005483}
5484
5485GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
5486{
5487 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
5488 target, offset, length, access);
5489
Geoff Langbfdea662014-07-23 14:16:32 -04005490 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005491
Geoff Langbfdea662014-07-23 14:16:32 -04005492 if (context)
5493 {
5494 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005495 {
Geoff Langbfdea662014-07-23 14:16:32 -04005496 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005497 }
Geoff Langbfdea662014-07-23 14:16:32 -04005498
5499 return glMapBufferRangeEXT(target, offset, length, access);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005500 }
5501
5502 return NULL;
5503}
5504
5505void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
5506{
5507 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
5508
Geoff Langbfdea662014-07-23 14:16:32 -04005509 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005510
Geoff Langbfdea662014-07-23 14:16:32 -04005511 if (context)
5512 {
5513 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005514 {
Geoff Langbfdea662014-07-23 14:16:32 -04005515 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005516 }
Geoff Langbfdea662014-07-23 14:16:32 -04005517
5518 glFlushMappedBufferRangeEXT(target, offset, length);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005519 }
5520}
5521
5522void __stdcall glBindVertexArray(GLuint array)
5523{
5524 EVENT("(GLuint array = %u)", array);
5525
Geoff Langbfdea662014-07-23 14:16:32 -04005526 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005527
Geoff Langbfdea662014-07-23 14:16:32 -04005528 if (context)
5529 {
5530 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005531 {
Geoff Langbfdea662014-07-23 14:16:32 -04005532 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005533 }
Geoff Langbfdea662014-07-23 14:16:32 -04005534
5535 gl::VertexArray *vao = context->getVertexArray(array);
5536
5537 if (!vao)
5538 {
5539 // The default VAO should always exist
5540 ASSERT(array != 0);
5541 return gl::error(GL_INVALID_OPERATION);
5542 }
5543
5544 context->bindVertexArray(array);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005545 }
5546}
5547
5548void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
5549{
5550 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
5551
Geoff Langbfdea662014-07-23 14:16:32 -04005552 gl::Context *context = gl::getNonLostContext();
5553
5554 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005555 {
Geoff Langbfdea662014-07-23 14:16:32 -04005556 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005557 {
Geoff Langbfdea662014-07-23 14:16:32 -04005558 return gl::error(GL_INVALID_OPERATION);
5559 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005560
Geoff Langbfdea662014-07-23 14:16:32 -04005561 if (n < 0)
5562 {
5563 return gl::error(GL_INVALID_VALUE);
5564 }
Jamie Madilld1028542013-07-02 11:57:04 -04005565
Geoff Langbfdea662014-07-23 14:16:32 -04005566 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5567 {
5568 if (arrays[arrayIndex] != 0)
Jamie Madilld1028542013-07-02 11:57:04 -04005569 {
Geoff Langbfdea662014-07-23 14:16:32 -04005570 context->deleteVertexArray(arrays[arrayIndex]);
Jamie Madilld1028542013-07-02 11:57:04 -04005571 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005572 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005573 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005574}
5575
5576void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
5577{
5578 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
5579
Geoff Langbfdea662014-07-23 14:16:32 -04005580 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005581
Geoff Langbfdea662014-07-23 14:16:32 -04005582 if (context)
5583 {
5584 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005585 {
Geoff Langbfdea662014-07-23 14:16:32 -04005586 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005587 }
Geoff Langbfdea662014-07-23 14:16:32 -04005588
5589 if (n < 0)
5590 {
5591 return gl::error(GL_INVALID_VALUE);
5592 }
5593
5594 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5595 {
5596 arrays[arrayIndex] = context->createVertexArray();
5597 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005598 }
5599}
5600
5601GLboolean __stdcall glIsVertexArray(GLuint array)
5602{
5603 EVENT("(GLuint array = %u)", array);
5604
Geoff Langbfdea662014-07-23 14:16:32 -04005605 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005606
Geoff Langbfdea662014-07-23 14:16:32 -04005607 if (context)
5608 {
5609 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005610 {
Geoff Langbfdea662014-07-23 14:16:32 -04005611 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005612 }
Geoff Langbfdea662014-07-23 14:16:32 -04005613
5614 if (array == 0)
5615 {
5616 return GL_FALSE;
5617 }
5618
5619 gl::VertexArray *vao = context->getVertexArray(array);
5620
5621 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005622 }
5623
5624 return GL_FALSE;
5625}
5626
5627void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
5628{
5629 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
5630 target, index, data);
5631
Geoff Langbfdea662014-07-23 14:16:32 -04005632 gl::Context *context = gl::getNonLostContext();
5633
5634 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005635 {
Geoff Langbfdea662014-07-23 14:16:32 -04005636 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005637 {
Geoff Langbfdea662014-07-23 14:16:32 -04005638 return gl::error(GL_INVALID_OPERATION);
5639 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005640
Geoff Langbfdea662014-07-23 14:16:32 -04005641 switch (target)
5642 {
5643 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
5644 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
5645 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
5646 if (index >= context->getMaxTransformFeedbackBufferBindings())
5647 return gl::error(GL_INVALID_VALUE);
5648 break;
5649 case GL_UNIFORM_BUFFER_START:
5650 case GL_UNIFORM_BUFFER_SIZE:
5651 case GL_UNIFORM_BUFFER_BINDING:
5652 if (index >= context->getMaximumCombinedUniformBufferBindings())
5653 return gl::error(GL_INVALID_VALUE);
5654 break;
5655 default:
5656 return gl::error(GL_INVALID_ENUM);
5657 }
5658
5659 if (!(context->getIndexedIntegerv(target, index, data)))
5660 {
5661 GLenum nativeType;
5662 unsigned int numParams = 0;
5663 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
Shannon Woods15934d52013-08-19 14:28:49 -04005664 return gl::error(GL_INVALID_ENUM);
Shannon Woods15934d52013-08-19 14:28:49 -04005665
Geoff Langbfdea662014-07-23 14:16:32 -04005666 if (numParams == 0)
5667 return; // it is known that pname is valid, but there are no parameters to return
5668
5669 if (nativeType == GL_INT_64_ANGLEX)
Shannon Woods15934d52013-08-19 14:28:49 -04005670 {
Geoff Langbfdea662014-07-23 14:16:32 -04005671 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
5672 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
5673 GLint64 *int64Params = new GLint64[numParams];
Shannon Woods15934d52013-08-19 14:28:49 -04005674
Geoff Langbfdea662014-07-23 14:16:32 -04005675 context->getIndexedInteger64v(target, index, int64Params);
Shannon Woods15934d52013-08-19 14:28:49 -04005676
Geoff Langbfdea662014-07-23 14:16:32 -04005677 for (unsigned int i = 0; i < numParams; ++i)
Shannon Woods15934d52013-08-19 14:28:49 -04005678 {
Geoff Langbfdea662014-07-23 14:16:32 -04005679 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
5680 data[i] = static_cast<GLint>(clampedValue);
Shannon Woods15934d52013-08-19 14:28:49 -04005681 }
Geoff Langbfdea662014-07-23 14:16:32 -04005682
5683 delete [] int64Params;
5684 }
5685 else
5686 {
5687 UNREACHABLE();
Shannon Woods15934d52013-08-19 14:28:49 -04005688 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005689 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005690 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005691}
5692
5693void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
5694{
5695 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
5696
Geoff Langbfdea662014-07-23 14:16:32 -04005697 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005698
Geoff Langbfdea662014-07-23 14:16:32 -04005699 if (context)
5700 {
5701 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005702 {
Geoff Langbfdea662014-07-23 14:16:32 -04005703 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005704 }
Geoff Langbfdea662014-07-23 14:16:32 -04005705
5706 switch (primitiveMode)
5707 {
5708 case GL_TRIANGLES:
5709 case GL_LINES:
5710 case GL_POINTS:
5711 break;
5712 default:
5713 return gl::error(GL_INVALID_ENUM);
5714 }
5715
5716 gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
5717 ASSERT(transformFeedback != NULL);
5718
5719 if (transformFeedback->isStarted())
5720 {
5721 return gl::error(GL_INVALID_OPERATION);
5722 }
5723
5724 if (transformFeedback->isPaused())
5725 {
5726 transformFeedback->resume();
5727 }
5728 else
5729 {
5730 transformFeedback->start(primitiveMode);
5731 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005732 }
5733}
5734
5735void __stdcall glEndTransformFeedback(void)
5736{
5737 EVENT("(void)");
5738
Geoff Langbfdea662014-07-23 14:16:32 -04005739 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005740
Geoff Langbfdea662014-07-23 14:16:32 -04005741 if (context)
5742 {
5743 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005744 {
Geoff Langbfdea662014-07-23 14:16:32 -04005745 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005746 }
Geoff Langbfdea662014-07-23 14:16:32 -04005747
5748 gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
5749 ASSERT(transformFeedback != NULL);
5750
5751 if (!transformFeedback->isStarted())
5752 {
5753 return gl::error(GL_INVALID_OPERATION);
5754 }
5755
5756 transformFeedback->stop();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005757 }
5758}
5759
5760void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
5761{
5762 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
5763 target, index, buffer, offset, size);
5764
Geoff Langbfdea662014-07-23 14:16:32 -04005765 gl::Context *context = gl::getNonLostContext();
5766
5767 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005768 {
Geoff Langbfdea662014-07-23 14:16:32 -04005769 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005770 {
Geoff Langbfdea662014-07-23 14:16:32 -04005771 return gl::error(GL_INVALID_OPERATION);
5772 }
5773
5774 switch (target)
5775 {
5776 case GL_TRANSFORM_FEEDBACK_BUFFER:
5777 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005778 {
Geoff Langbfdea662014-07-23 14:16:32 -04005779 return gl::error(GL_INVALID_VALUE);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005780 }
Geoff Langbfdea662014-07-23 14:16:32 -04005781 break;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005782
Geoff Langbfdea662014-07-23 14:16:32 -04005783 case GL_UNIFORM_BUFFER:
5784 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00005785 {
Geoff Langbfdea662014-07-23 14:16:32 -04005786 return gl::error(GL_INVALID_VALUE);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00005787 }
Geoff Langbfdea662014-07-23 14:16:32 -04005788 break;
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00005789
Geoff Langbfdea662014-07-23 14:16:32 -04005790 default:
5791 return gl::error(GL_INVALID_ENUM);
5792 }
5793
5794 if (buffer != 0 && size <= 0)
5795 {
5796 return gl::error(GL_INVALID_VALUE);
5797 }
5798
5799 switch (target)
5800 {
5801 case GL_TRANSFORM_FEEDBACK_BUFFER:
5802
5803 // size and offset must be a multiple of 4
5804 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00005805 {
5806 return gl::error(GL_INVALID_VALUE);
5807 }
5808
Geoff Langbfdea662014-07-23 14:16:32 -04005809 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
5810 context->bindGenericTransformFeedbackBuffer(buffer);
5811 break;
5812
5813 case GL_UNIFORM_BUFFER:
5814
5815 // it is an error to bind an offset not a multiple of the alignment
5816 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00005817 {
Geoff Langbfdea662014-07-23 14:16:32 -04005818 return gl::error(GL_INVALID_VALUE);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00005819 }
Geoff Langbfdea662014-07-23 14:16:32 -04005820
5821 context->bindIndexedUniformBuffer(buffer, index, offset, size);
5822 context->bindGenericUniformBuffer(buffer);
5823 break;
5824
5825 default:
5826 UNREACHABLE();
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00005827 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005828 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005829}
5830
5831void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
5832{
5833 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
5834 target, index, buffer);
5835
Geoff Langbfdea662014-07-23 14:16:32 -04005836 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005837
Geoff Langbfdea662014-07-23 14:16:32 -04005838 if (context)
5839 {
5840 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005841 {
Geoff Langbfdea662014-07-23 14:16:32 -04005842 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00005843 }
Geoff Langbfdea662014-07-23 14:16:32 -04005844
5845 switch (target)
5846 {
5847 case GL_TRANSFORM_FEEDBACK_BUFFER:
5848 if (index >= context->getMaxTransformFeedbackBufferBindings())
5849 {
5850 return gl::error(GL_INVALID_VALUE);
5851 }
5852 break;
5853
5854 case GL_UNIFORM_BUFFER:
5855 if (index >= context->getMaximumCombinedUniformBufferBindings())
5856 {
5857 return gl::error(GL_INVALID_VALUE);
5858 }
5859 break;
5860
5861 default:
5862 return gl::error(GL_INVALID_ENUM);
5863 }
5864
5865 switch (target)
5866 {
5867 case GL_TRANSFORM_FEEDBACK_BUFFER:
5868 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
5869 context->bindGenericTransformFeedbackBuffer(buffer);
5870 break;
5871
5872 case GL_UNIFORM_BUFFER:
5873 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
5874 context->bindGenericUniformBuffer(buffer);
5875 break;
5876
5877 default:
5878 UNREACHABLE();
5879 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005880 }
5881}
5882
5883void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
5884{
5885 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
5886 program, count, varyings, bufferMode);
5887
Geoff Langbfdea662014-07-23 14:16:32 -04005888 gl::Context *context = gl::getNonLostContext();
5889
5890 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005891 {
Geoff Langbfdea662014-07-23 14:16:32 -04005892 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005893 {
Geoff Langbfdea662014-07-23 14:16:32 -04005894 return gl::error(GL_INVALID_OPERATION);
5895 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005896
Geoff Langbfdea662014-07-23 14:16:32 -04005897 if (count < 0)
5898 {
5899 return gl::error(GL_INVALID_VALUE);
5900 }
5901
5902 switch (bufferMode)
5903 {
5904 case GL_INTERLEAVED_ATTRIBS:
5905 break;
5906 case GL_SEPARATE_ATTRIBS:
5907 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
Geoff Lang48dcae72014-02-05 16:28:24 -05005908 {
5909 return gl::error(GL_INVALID_VALUE);
5910 }
Geoff Langbfdea662014-07-23 14:16:32 -04005911 break;
5912 default:
5913 return gl::error(GL_INVALID_ENUM);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005914 }
Geoff Langbfdea662014-07-23 14:16:32 -04005915
5916 if (!gl::ValidProgram(context, program))
5917 {
5918 return;
5919 }
5920
5921 gl::Program *programObject = context->getProgram(program);
5922 ASSERT(programObject);
5923
5924 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005925 }
5926}
5927
5928void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
5929{
5930 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
5931 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
5932 program, index, bufSize, length, size, type, name);
5933
Geoff Langbfdea662014-07-23 14:16:32 -04005934 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005935
Geoff Langbfdea662014-07-23 14:16:32 -04005936 if (context)
5937 {
5938 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005939 {
Geoff Langbfdea662014-07-23 14:16:32 -04005940 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005941 }
Geoff Langbfdea662014-07-23 14:16:32 -04005942
5943 if (bufSize < 0)
5944 {
5945 return gl::error(GL_INVALID_VALUE);
5946 }
5947
5948 if (!gl::ValidProgram(context, program))
5949 {
5950 return;
5951 }
5952
5953 gl::Program *programObject = context->getProgram(program);
5954 ASSERT(programObject);
5955
5956 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
5957 {
5958 return gl::error(GL_INVALID_VALUE);
5959 }
5960
5961 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005962 }
5963}
5964
5965void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
5966{
5967 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
5968 index, size, type, stride, pointer);
5969
Geoff Langbfdea662014-07-23 14:16:32 -04005970 gl::Context *context = gl::getNonLostContext();
5971
5972 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005973 {
Geoff Langbfdea662014-07-23 14:16:32 -04005974 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005975 {
Geoff Langbfdea662014-07-23 14:16:32 -04005976 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005977 }
Geoff Langbfdea662014-07-23 14:16:32 -04005978 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005979
Geoff Langbfdea662014-07-23 14:16:32 -04005980 if (index >= gl::MAX_VERTEX_ATTRIBS)
5981 {
5982 return gl::error(GL_INVALID_VALUE);
5983 }
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005984
Geoff Langbfdea662014-07-23 14:16:32 -04005985 if (size < 1 || size > 4)
5986 {
5987 return gl::error(GL_INVALID_VALUE);
5988 }
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005989
Geoff Langbfdea662014-07-23 14:16:32 -04005990 switch (type)
5991 {
5992 case GL_BYTE:
5993 case GL_UNSIGNED_BYTE:
5994 case GL_SHORT:
5995 case GL_UNSIGNED_SHORT:
5996 case GL_INT:
5997 case GL_UNSIGNED_INT:
5998 case GL_INT_2_10_10_10_REV:
5999 case GL_UNSIGNED_INT_2_10_10_10_REV:
6000 break;
6001 default:
6002 return gl::error(GL_INVALID_ENUM);
6003 }
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006004
Geoff Langbfdea662014-07-23 14:16:32 -04006005 if (stride < 0)
6006 {
6007 return gl::error(GL_INVALID_VALUE);
6008 }
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006009
Geoff Langbfdea662014-07-23 14:16:32 -04006010 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6011 {
6012 return gl::error(GL_INVALID_OPERATION);
6013 }
6014
6015 if (context)
6016 {
6017 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6018 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6019 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6020 // and the pointer argument is not NULL.
6021 if (context->getState().getVertexArray()->id() != 0 && context->getState().getArrayBufferId() == 0 && pointer != NULL)
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006022 {
6023 return gl::error(GL_INVALID_OPERATION);
6024 }
6025
Geoff Langbfdea662014-07-23 14:16:32 -04006026 context->getState().setVertexAttribState(index, context->getState().getTargetBuffer(GL_ARRAY_BUFFER), size, type, false, true,
6027 stride, pointer);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006028 }
6029}
6030
6031void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
6032{
6033 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
6034 index, pname, params);
6035
Geoff Langbfdea662014-07-23 14:16:32 -04006036 gl::Context *context = gl::getNonLostContext();
6037
6038 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006039 {
Geoff Langbfdea662014-07-23 14:16:32 -04006040 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006041 {
Geoff Langbfdea662014-07-23 14:16:32 -04006042 return gl::error(GL_INVALID_OPERATION);
6043 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006044
Geoff Langbfdea662014-07-23 14:16:32 -04006045 if (index >= gl::MAX_VERTEX_ATTRIBS)
6046 {
6047 return gl::error(GL_INVALID_VALUE);
6048 }
Jamie Madilla7d05862013-07-02 11:57:06 -04006049
Geoff Langbfdea662014-07-23 14:16:32 -04006050 const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index);
Jamie Madilla7d05862013-07-02 11:57:06 -04006051
Geoff Langbfdea662014-07-23 14:16:32 -04006052 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
6053 {
6054 return;
6055 }
Jamie Madilla7d05862013-07-02 11:57:06 -04006056
Geoff Langbfdea662014-07-23 14:16:32 -04006057 if (pname == GL_CURRENT_VERTEX_ATTRIB)
6058 {
6059 const gl::VertexAttribCurrentValueData &currentValueData = context->getState().getVertexAttribCurrentValue(index);
6060 for (int i = 0; i < 4; ++i)
Jamie Madilla7d05862013-07-02 11:57:06 -04006061 {
Geoff Langbfdea662014-07-23 14:16:32 -04006062 params[i] = currentValueData.IntValues[i];
Jamie Madilla7d05862013-07-02 11:57:06 -04006063 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006064 }
Geoff Langbfdea662014-07-23 14:16:32 -04006065 else
6066 {
6067 *params = gl::QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
6068 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006069 }
6070}
6071
6072void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
6073{
6074 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
6075 index, pname, params);
6076
Geoff Langbfdea662014-07-23 14:16:32 -04006077 gl::Context *context = gl::getNonLostContext();
6078
6079 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006080 {
Geoff Langbfdea662014-07-23 14:16:32 -04006081 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006082 {
Geoff Langbfdea662014-07-23 14:16:32 -04006083 return gl::error(GL_INVALID_OPERATION);
6084 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006085
Geoff Langbfdea662014-07-23 14:16:32 -04006086 if (index >= gl::MAX_VERTEX_ATTRIBS)
6087 {
6088 return gl::error(GL_INVALID_VALUE);
6089 }
Jamie Madilla7d05862013-07-02 11:57:06 -04006090
Geoff Langbfdea662014-07-23 14:16:32 -04006091 const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index);
Jamie Madilla7d05862013-07-02 11:57:06 -04006092
Geoff Langbfdea662014-07-23 14:16:32 -04006093 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
6094 {
6095 return;
6096 }
Jamie Madilla7d05862013-07-02 11:57:06 -04006097
Geoff Langbfdea662014-07-23 14:16:32 -04006098 if (pname == GL_CURRENT_VERTEX_ATTRIB)
6099 {
6100 const gl::VertexAttribCurrentValueData &currentValueData = context->getState().getVertexAttribCurrentValue(index);
6101 for (int i = 0; i < 4; ++i)
Jamie Madilla7d05862013-07-02 11:57:06 -04006102 {
Geoff Langbfdea662014-07-23 14:16:32 -04006103 params[i] = currentValueData.UnsignedIntValues[i];
Jamie Madilla7d05862013-07-02 11:57:06 -04006104 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006105 }
Geoff Langbfdea662014-07-23 14:16:32 -04006106 else
6107 {
6108 *params = gl::QuerySingleVertexAttributeParameter<GLuint>(attribState, pname);
6109 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006110 }
6111}
6112
6113void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
6114{
6115 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
6116 index, x, y, z, w);
6117
Geoff Langbfdea662014-07-23 14:16:32 -04006118 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006119
Geoff Langbfdea662014-07-23 14:16:32 -04006120 if (context)
6121 {
6122 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006123 {
Geoff Langbfdea662014-07-23 14:16:32 -04006124 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006125 }
Geoff Langbfdea662014-07-23 14:16:32 -04006126
6127 if (index >= gl::MAX_VERTEX_ATTRIBS)
6128 {
6129 return gl::error(GL_INVALID_VALUE);
6130 }
6131
6132 GLint vals[4] = { x, y, z, w };
6133 context->getState().setVertexAttribi(index, vals);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006134 }
6135}
6136
6137void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
6138{
6139 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
6140 index, x, y, z, w);
6141
Geoff Langbfdea662014-07-23 14:16:32 -04006142 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006143
Geoff Langbfdea662014-07-23 14:16:32 -04006144 if (context)
6145 {
6146 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006147 {
Geoff Langbfdea662014-07-23 14:16:32 -04006148 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006149 }
Geoff Langbfdea662014-07-23 14:16:32 -04006150
6151 if (index >= gl::MAX_VERTEX_ATTRIBS)
6152 {
6153 return gl::error(GL_INVALID_VALUE);
6154 }
6155
6156 GLuint vals[4] = { x, y, z, w };
6157 context->getState().setVertexAttribu(index, vals);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006158 }
6159}
6160
6161void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
6162{
6163 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
6164
Geoff Langbfdea662014-07-23 14:16:32 -04006165 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006166
Geoff Langbfdea662014-07-23 14:16:32 -04006167 if (context)
6168 {
6169 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006170 {
Geoff Langbfdea662014-07-23 14:16:32 -04006171 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006172 }
Geoff Langbfdea662014-07-23 14:16:32 -04006173
6174 if (index >= gl::MAX_VERTEX_ATTRIBS)
6175 {
6176 return gl::error(GL_INVALID_VALUE);
6177 }
6178
6179 context->getState().setVertexAttribi(index, v);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006180 }
6181}
6182
6183void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
6184{
6185 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
6186
Geoff Langbfdea662014-07-23 14:16:32 -04006187 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006188
Geoff Langbfdea662014-07-23 14:16:32 -04006189 if (context)
6190 {
6191 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006192 {
Geoff Langbfdea662014-07-23 14:16:32 -04006193 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006194 }
Geoff Langbfdea662014-07-23 14:16:32 -04006195
6196 if (index >= gl::MAX_VERTEX_ATTRIBS)
6197 {
6198 return gl::error(GL_INVALID_VALUE);
6199 }
6200
6201 context->getState().setVertexAttribu(index, v);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006202 }
6203}
6204
6205void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
6206{
6207 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
6208 program, location, params);
6209
Geoff Langbfdea662014-07-23 14:16:32 -04006210 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006211
Geoff Langbfdea662014-07-23 14:16:32 -04006212 if (context)
6213 {
Jamie Madill0063c512014-08-25 15:47:53 -04006214 if (!ValidateGetUniformuiv(context, program, location, params))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006215 {
Jamie Madill0063c512014-08-25 15:47:53 -04006216 return;
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00006217 }
Geoff Langbfdea662014-07-23 14:16:32 -04006218
Jamie Madill0063c512014-08-25 15:47:53 -04006219 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
6220 ASSERT(programBinary);
Geoff Langbfdea662014-07-23 14:16:32 -04006221
6222 if (!programBinary->getUniformuiv(location, NULL, params))
6223 {
6224 return gl::error(GL_INVALID_OPERATION);
6225 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006226 }
6227}
6228
6229GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
6230{
6231 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
6232 program, name);
6233
Geoff Langbfdea662014-07-23 14:16:32 -04006234 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006235
Geoff Langbfdea662014-07-23 14:16:32 -04006236 if (context)
6237 {
6238 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006239 {
Geoff Langbfdea662014-07-23 14:16:32 -04006240 return gl::error(GL_INVALID_OPERATION, -1);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006241 }
Geoff Langbfdea662014-07-23 14:16:32 -04006242
6243 if (program == 0)
6244 {
6245 return gl::error(GL_INVALID_VALUE, -1);
6246 }
6247
6248 gl::Program *programObject = context->getProgram(program);
6249
6250 if (!programObject || !programObject->isLinked())
6251 {
6252 return gl::error(GL_INVALID_OPERATION, -1);
6253 }
6254
6255 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6256 if (!programBinary)
6257 {
6258 return gl::error(GL_INVALID_OPERATION, -1);
6259 }
6260
6261 return programBinary->getFragDataLocation(name);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006262 }
6263
6264 return 0;
6265}
6266
6267void __stdcall glUniform1ui(GLint location, GLuint v0)
6268{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00006269 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006270}
6271
6272void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
6273{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00006274 const GLuint xy[] = { v0, v1 };
6275 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006276}
6277
6278void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6279{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00006280 const GLuint xyz[] = { v0, v1, v2 };
6281 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006282}
6283
6284void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6285{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00006286 const GLuint xyzw[] = { v0, v1, v2, v3 };
6287 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006288}
6289
6290void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
6291{
6292 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
6293 location, count, value);
6294
Geoff Langbfdea662014-07-23 14:16:32 -04006295 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006296
Geoff Langbfdea662014-07-23 14:16:32 -04006297 if (context)
6298 {
6299 if (!ValidateUniform(context, GL_UNSIGNED_INT, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006300 {
Geoff Langbfdea662014-07-23 14:16:32 -04006301 return;
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00006302 }
Geoff Langbfdea662014-07-23 14:16:32 -04006303
6304 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
6305 programBinary->setUniform1uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006306 }
6307}
6308
6309void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
6310{
6311 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
6312 location, count, value);
6313
Geoff Langbfdea662014-07-23 14:16:32 -04006314 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006315
Geoff Langbfdea662014-07-23 14:16:32 -04006316 if (context)
6317 {
6318 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC2, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006319 {
Geoff Langbfdea662014-07-23 14:16:32 -04006320 return;
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00006321 }
Geoff Langbfdea662014-07-23 14:16:32 -04006322
6323 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
6324 programBinary->setUniform2uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006325 }
6326}
6327
6328void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
6329{
6330 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
6331 location, count, value);
6332
Geoff Langbfdea662014-07-23 14:16:32 -04006333 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006334
Geoff Langbfdea662014-07-23 14:16:32 -04006335 if (context)
6336 {
6337 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC3, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006338 {
Geoff Langbfdea662014-07-23 14:16:32 -04006339 return;
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00006340 }
Geoff Langbfdea662014-07-23 14:16:32 -04006341
6342 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
6343 programBinary->setUniform3uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006344 }
6345}
6346
6347void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
6348{
6349 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
6350 location, count, value);
6351
Geoff Langbfdea662014-07-23 14:16:32 -04006352 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006353
Geoff Langbfdea662014-07-23 14:16:32 -04006354 if (context)
6355 {
6356 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC4, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006357 {
Geoff Langbfdea662014-07-23 14:16:32 -04006358 return;
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00006359 }
Geoff Langbfdea662014-07-23 14:16:32 -04006360
6361 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
6362 programBinary->setUniform4uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006363 }
6364}
6365
6366void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
6367{
6368 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
6369 buffer, drawbuffer, value);
6370
Geoff Langbfdea662014-07-23 14:16:32 -04006371 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006372
Geoff Langbfdea662014-07-23 14:16:32 -04006373 if (context)
6374 {
6375 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006376 {
Geoff Langbfdea662014-07-23 14:16:32 -04006377 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006378 }
Geoff Langbfdea662014-07-23 14:16:32 -04006379
6380 switch (buffer)
6381 {
6382 case GL_COLOR:
6383 if (drawbuffer < 0 || static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers)
6384 {
6385 return gl::error(GL_INVALID_VALUE);
6386 }
6387 break;
6388 case GL_STENCIL:
6389 if (drawbuffer != 0)
6390 {
6391 return gl::error(GL_INVALID_VALUE);
6392 }
6393 break;
6394 default:
6395 return gl::error(GL_INVALID_ENUM);
6396 }
6397
6398 context->clearBufferiv(buffer, drawbuffer, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006399 }
6400}
6401
6402void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
6403{
6404 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
6405 buffer, drawbuffer, value);
6406
Geoff Langbfdea662014-07-23 14:16:32 -04006407 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006408
Geoff Langbfdea662014-07-23 14:16:32 -04006409 if (context)
6410 {
6411 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006412 {
Geoff Langbfdea662014-07-23 14:16:32 -04006413 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006414 }
Geoff Langbfdea662014-07-23 14:16:32 -04006415
6416 switch (buffer)
6417 {
6418 case GL_COLOR:
6419 if (drawbuffer < 0 || static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers)
6420 {
6421 return gl::error(GL_INVALID_VALUE);
6422 }
6423 break;
6424 default:
6425 return gl::error(GL_INVALID_ENUM);
6426 }
6427
6428 context->clearBufferuiv(buffer, drawbuffer, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006429 }
6430}
6431
6432void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
6433{
6434 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
6435 buffer, drawbuffer, value);
6436
Geoff Langbfdea662014-07-23 14:16:32 -04006437 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006438
Geoff Langbfdea662014-07-23 14:16:32 -04006439 if (context)
6440 {
6441 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006442 {
Geoff Langbfdea662014-07-23 14:16:32 -04006443 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006444 }
Geoff Langbfdea662014-07-23 14:16:32 -04006445
6446 switch (buffer)
6447 {
6448 case GL_COLOR:
6449 if (drawbuffer < 0 || static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers)
6450 {
6451 return gl::error(GL_INVALID_VALUE);
6452 }
6453 break;
6454 case GL_DEPTH:
6455 if (drawbuffer != 0)
6456 {
6457 return gl::error(GL_INVALID_VALUE);
6458 }
6459 break;
6460 default:
6461 return gl::error(GL_INVALID_ENUM);
6462 }
6463
6464 context->clearBufferfv(buffer, drawbuffer, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006465 }
6466}
6467
6468void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
6469{
6470 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
6471 buffer, drawbuffer, depth, stencil);
6472
Geoff Langbfdea662014-07-23 14:16:32 -04006473 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006474
Geoff Langbfdea662014-07-23 14:16:32 -04006475 if (context)
6476 {
6477 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006478 {
Geoff Langbfdea662014-07-23 14:16:32 -04006479 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006480 }
Geoff Langbfdea662014-07-23 14:16:32 -04006481
6482 switch (buffer)
6483 {
6484 case GL_DEPTH_STENCIL:
6485 if (drawbuffer != 0)
6486 {
6487 return gl::error(GL_INVALID_VALUE);
6488 }
6489 break;
6490 default:
6491 return gl::error(GL_INVALID_ENUM);
6492 }
6493
6494 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006495 }
6496}
6497
6498const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
6499{
6500 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
6501
Geoff Langbfdea662014-07-23 14:16:32 -04006502 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006503
Geoff Langbfdea662014-07-23 14:16:32 -04006504 if (context)
6505 {
6506 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006507 {
Geoff Langbfdea662014-07-23 14:16:32 -04006508 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00006509 }
Geoff Langbfdea662014-07-23 14:16:32 -04006510
6511 if (name != GL_EXTENSIONS)
6512 {
6513 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
6514 }
6515
6516 if (index >= context->getExtensionStringCount())
6517 {
6518 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
6519 }
6520
6521 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index).c_str());
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006522 }
6523
6524 return NULL;
6525}
6526
6527void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
6528{
6529 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
6530 readTarget, writeTarget, readOffset, writeOffset, size);
6531
Geoff Langbfdea662014-07-23 14:16:32 -04006532 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006533
Geoff Langbfdea662014-07-23 14:16:32 -04006534 if (context)
6535 {
6536 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006537 {
Geoff Langbfdea662014-07-23 14:16:32 -04006538 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00006539 }
Geoff Langbfdea662014-07-23 14:16:32 -04006540
6541 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
6542 {
6543 return gl::error(GL_INVALID_ENUM);
6544 }
6545
6546 gl::Buffer *readBuffer = context->getState().getTargetBuffer(readTarget);
6547 gl::Buffer *writeBuffer = context->getState().getTargetBuffer(writeTarget);
6548
6549 if (!readBuffer || !writeBuffer)
6550 {
6551 return gl::error(GL_INVALID_OPERATION);
6552 }
6553
Jamie Madillcfaaf722014-07-31 10:47:54 -04006554 // Verify that readBuffer and writeBuffer are not currently mapped
Geoff Langbfdea662014-07-23 14:16:32 -04006555 if (readBuffer->isMapped() || writeBuffer->isMapped())
6556 {
6557 return gl::error(GL_INVALID_OPERATION);
6558 }
6559
6560 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
6561 static_cast<unsigned int>(readOffset + size) > readBuffer->getSize() ||
6562 static_cast<unsigned int>(writeOffset + size) > writeBuffer->getSize())
6563 {
6564 return gl::error(GL_INVALID_VALUE);
6565 }
6566
6567 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
6568 {
6569 return gl::error(GL_INVALID_VALUE);
6570 }
6571
Geoff Langbfdea662014-07-23 14:16:32 -04006572 // if size is zero, the copy is a successful no-op
6573 if (size > 0)
6574 {
6575 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
6576 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006577 }
6578}
6579
6580void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
6581{
6582 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
6583 program, uniformCount, uniformNames, uniformIndices);
6584
Geoff Langbfdea662014-07-23 14:16:32 -04006585 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006586
Geoff Langbfdea662014-07-23 14:16:32 -04006587 if (context)
6588 {
6589 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006590 {
Geoff Langbfdea662014-07-23 14:16:32 -04006591 return gl::error(GL_INVALID_OPERATION);
6592 }
6593
6594 if (uniformCount < 0)
6595 {
6596 return gl::error(GL_INVALID_VALUE);
6597 }
6598
6599 gl::Program *programObject = context->getProgram(program);
6600
6601 if (!programObject)
6602 {
6603 if (context->getShader(program))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006604 {
6605 return gl::error(GL_INVALID_OPERATION);
6606 }
Geoff Langbfdea662014-07-23 14:16:32 -04006607 else
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00006608 {
6609 return gl::error(GL_INVALID_VALUE);
6610 }
Geoff Langbfdea662014-07-23 14:16:32 -04006611 }
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00006612
Geoff Langbfdea662014-07-23 14:16:32 -04006613 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6614 if (!programObject->isLinked() || !programBinary)
6615 {
6616 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00006617 {
Geoff Langbfdea662014-07-23 14:16:32 -04006618 uniformIndices[uniformId] = GL_INVALID_INDEX;
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00006619 }
6620 }
Geoff Langbfdea662014-07-23 14:16:32 -04006621 else
6622 {
6623 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6624 {
6625 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
6626 }
6627 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006628 }
6629}
6630
6631void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
6632{
6633 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
6634 program, uniformCount, uniformIndices, pname, params);
6635
Geoff Langbfdea662014-07-23 14:16:32 -04006636 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006637
Geoff Langbfdea662014-07-23 14:16:32 -04006638 if (context)
6639 {
6640 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006641 {
Geoff Langbfdea662014-07-23 14:16:32 -04006642 return gl::error(GL_INVALID_OPERATION);
6643 }
6644
6645 if (uniformCount < 0)
6646 {
6647 return gl::error(GL_INVALID_VALUE);
6648 }
6649
6650 gl::Program *programObject = context->getProgram(program);
6651
6652 if (!programObject)
6653 {
6654 if (context->getShader(program))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006655 {
6656 return gl::error(GL_INVALID_OPERATION);
6657 }
Geoff Langbfdea662014-07-23 14:16:32 -04006658 else
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00006659 {
6660 return gl::error(GL_INVALID_VALUE);
6661 }
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00006662 }
Geoff Langbfdea662014-07-23 14:16:32 -04006663
6664 switch (pname)
6665 {
6666 case GL_UNIFORM_TYPE:
6667 case GL_UNIFORM_SIZE:
6668 case GL_UNIFORM_NAME_LENGTH:
6669 case GL_UNIFORM_BLOCK_INDEX:
6670 case GL_UNIFORM_OFFSET:
6671 case GL_UNIFORM_ARRAY_STRIDE:
6672 case GL_UNIFORM_MATRIX_STRIDE:
6673 case GL_UNIFORM_IS_ROW_MAJOR:
6674 break;
6675 default:
6676 return gl::error(GL_INVALID_ENUM);
6677 }
6678
6679 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6680
6681 if (!programBinary && uniformCount > 0)
6682 {
6683 return gl::error(GL_INVALID_VALUE);
6684 }
6685
6686 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6687 {
6688 const GLuint index = uniformIndices[uniformId];
6689
6690 if (index >= (GLuint)programBinary->getActiveUniformCount())
6691 {
6692 return gl::error(GL_INVALID_VALUE);
6693 }
6694 }
6695
6696 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6697 {
6698 const GLuint index = uniformIndices[uniformId];
6699 params[uniformId] = programBinary->getActiveUniformi(index, pname);
6700 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006701 }
6702}
6703
6704GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
6705{
6706 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
6707
Geoff Langbfdea662014-07-23 14:16:32 -04006708 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006709
Geoff Langbfdea662014-07-23 14:16:32 -04006710 if (context)
6711 {
6712 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006713 {
Geoff Langbfdea662014-07-23 14:16:32 -04006714 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
6715 }
6716
6717 gl::Program *programObject = context->getProgram(program);
6718
6719 if (!programObject)
6720 {
6721 if (context->getShader(program))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006722 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00006723 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006724 }
Geoff Langbfdea662014-07-23 14:16:32 -04006725 else
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00006726 {
Geoff Langbfdea662014-07-23 14:16:32 -04006727 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00006728 }
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00006729 }
Geoff Langbfdea662014-07-23 14:16:32 -04006730
6731 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6732 if (!programBinary)
6733 {
6734 return GL_INVALID_INDEX;
6735 }
6736
6737 return programBinary->getUniformBlockIndex(uniformBlockName);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006738 }
6739
6740 return 0;
6741}
6742
6743void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
6744{
6745 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
6746 program, uniformBlockIndex, pname, params);
6747
Geoff Langbfdea662014-07-23 14:16:32 -04006748 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006749
Geoff Langbfdea662014-07-23 14:16:32 -04006750 if (context)
6751 {
6752 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006753 {
Geoff Langbfdea662014-07-23 14:16:32 -04006754 return gl::error(GL_INVALID_OPERATION);
6755 }
6756 gl::Program *programObject = context->getProgram(program);
6757
6758 if (!programObject)
6759 {
6760 if (context->getShader(program))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006761 {
6762 return gl::error(GL_INVALID_OPERATION);
6763 }
Geoff Langbfdea662014-07-23 14:16:32 -04006764 else
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00006765 {
6766 return gl::error(GL_INVALID_VALUE);
6767 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00006768 }
Geoff Langbfdea662014-07-23 14:16:32 -04006769
6770 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6771
6772 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
6773 {
6774 return gl::error(GL_INVALID_VALUE);
6775 }
6776
6777 switch (pname)
6778 {
6779 case GL_UNIFORM_BLOCK_BINDING:
6780 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
6781 break;
6782
6783 case GL_UNIFORM_BLOCK_DATA_SIZE:
6784 case GL_UNIFORM_BLOCK_NAME_LENGTH:
6785 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
6786 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
6787 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
6788 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
6789 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
6790 break;
6791
6792 default:
6793 return gl::error(GL_INVALID_ENUM);
6794 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006795 }
6796}
6797
6798void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
6799{
6800 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
6801 program, uniformBlockIndex, bufSize, length, uniformBlockName);
6802
Geoff Langbfdea662014-07-23 14:16:32 -04006803 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006804
Geoff Langbfdea662014-07-23 14:16:32 -04006805 if (context)
6806 {
6807 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006808 {
Geoff Langbfdea662014-07-23 14:16:32 -04006809 return gl::error(GL_INVALID_OPERATION);
6810 }
6811
6812 gl::Program *programObject = context->getProgram(program);
6813
6814 if (!programObject)
6815 {
6816 if (context->getShader(program))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006817 {
6818 return gl::error(GL_INVALID_OPERATION);
6819 }
Geoff Langbfdea662014-07-23 14:16:32 -04006820 else
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00006821 {
6822 return gl::error(GL_INVALID_VALUE);
6823 }
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00006824 }
Geoff Langbfdea662014-07-23 14:16:32 -04006825
6826 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6827
6828 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
6829 {
6830 return gl::error(GL_INVALID_VALUE);
6831 }
6832
6833 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006834 }
6835}
6836
6837void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
6838{
6839 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
6840 program, uniformBlockIndex, uniformBlockBinding);
6841
Geoff Langbfdea662014-07-23 14:16:32 -04006842 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006843
Geoff Langbfdea662014-07-23 14:16:32 -04006844 if (context)
6845 {
6846 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006847 {
Geoff Langbfdea662014-07-23 14:16:32 -04006848 return gl::error(GL_INVALID_OPERATION);
6849 }
6850
6851 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
6852 {
6853 return gl::error(GL_INVALID_VALUE);
6854 }
6855
6856 gl::Program *programObject = context->getProgram(program);
6857
6858 if (!programObject)
6859 {
6860 if (context->getShader(program))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006861 {
6862 return gl::error(GL_INVALID_OPERATION);
6863 }
Geoff Langbfdea662014-07-23 14:16:32 -04006864 else
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00006865 {
6866 return gl::error(GL_INVALID_VALUE);
6867 }
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00006868 }
Geoff Langbfdea662014-07-23 14:16:32 -04006869
6870 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6871
6872 // if never linked, there won't be any uniform blocks
6873 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
6874 {
6875 return gl::error(GL_INVALID_VALUE);
6876 }
6877
6878 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006879 }
6880}
6881
6882void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
6883{
6884 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
6885 mode, first, count, instanceCount);
6886
Geoff Langbfdea662014-07-23 14:16:32 -04006887 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006888
Geoff Langbfdea662014-07-23 14:16:32 -04006889 if (context)
6890 {
6891 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006892 {
Geoff Langbfdea662014-07-23 14:16:32 -04006893 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006894 }
Geoff Langbfdea662014-07-23 14:16:32 -04006895
6896 // glDrawArraysInstanced
6897 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006898 }
6899}
6900
6901void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
6902{
6903 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
6904 mode, count, type, indices, instanceCount);
6905
Geoff Langbfdea662014-07-23 14:16:32 -04006906 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006907
Geoff Langbfdea662014-07-23 14:16:32 -04006908 if (context)
6909 {
6910 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006911 {
Geoff Langbfdea662014-07-23 14:16:32 -04006912 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006913 }
Geoff Langbfdea662014-07-23 14:16:32 -04006914
6915 // glDrawElementsInstanced
6916 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006917 }
6918}
6919
6920GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
6921{
6922 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
6923
Geoff Langbfdea662014-07-23 14:16:32 -04006924 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006925
Geoff Langbfdea662014-07-23 14:16:32 -04006926 if (context)
6927 {
6928 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006929 {
Geoff Langbfdea662014-07-23 14:16:32 -04006930 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006931 }
Geoff Langbfdea662014-07-23 14:16:32 -04006932
6933 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
6934 {
6935 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
6936 }
6937
6938 if (flags != 0)
6939 {
6940 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
6941 }
6942
6943 return context->createFenceSync(condition);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006944 }
6945
6946 return NULL;
6947}
6948
6949GLboolean __stdcall glIsSync(GLsync sync)
6950{
6951 EVENT("(GLsync sync = 0x%0.8p)", sync);
6952
Geoff Langbfdea662014-07-23 14:16:32 -04006953 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006954
Geoff Langbfdea662014-07-23 14:16:32 -04006955 if (context)
6956 {
6957 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006958 {
Geoff Langbfdea662014-07-23 14:16:32 -04006959 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006960 }
Geoff Langbfdea662014-07-23 14:16:32 -04006961
6962 return (context->getFenceSync(sync) != NULL);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006963 }
6964
6965 return GL_FALSE;
6966}
6967
6968void __stdcall glDeleteSync(GLsync sync)
6969{
6970 EVENT("(GLsync sync = 0x%0.8p)", sync);
6971
Geoff Langbfdea662014-07-23 14:16:32 -04006972 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006973
Geoff Langbfdea662014-07-23 14:16:32 -04006974 if (context)
6975 {
6976 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006977 {
Geoff Langbfdea662014-07-23 14:16:32 -04006978 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006979 }
Geoff Langbfdea662014-07-23 14:16:32 -04006980
6981 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
6982 {
6983 return gl::error(GL_INVALID_VALUE);
6984 }
6985
6986 context->deleteFenceSync(sync);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006987 }
6988}
6989
6990GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6991{
6992 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
6993 sync, flags, timeout);
6994
Geoff Langbfdea662014-07-23 14:16:32 -04006995 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006996
Geoff Langbfdea662014-07-23 14:16:32 -04006997 if (context)
6998 {
6999 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007000 {
Geoff Langbfdea662014-07-23 14:16:32 -04007001 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007002 }
Geoff Langbfdea662014-07-23 14:16:32 -04007003
7004 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
7005 {
7006 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
7007 }
7008
7009 gl::FenceSync *fenceSync = context->getFenceSync(sync);
7010
7011 if (!fenceSync)
7012 {
7013 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
7014 }
7015
7016 return fenceSync->clientWait(flags, timeout);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007017 }
7018
7019 return GL_FALSE;
7020}
7021
7022void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
7023{
7024 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
7025 sync, flags, timeout);
7026
Geoff Langbfdea662014-07-23 14:16:32 -04007027 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007028
Geoff Langbfdea662014-07-23 14:16:32 -04007029 if (context)
7030 {
7031 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007032 {
Geoff Langbfdea662014-07-23 14:16:32 -04007033 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007034 }
Geoff Langbfdea662014-07-23 14:16:32 -04007035
7036 if (flags != 0)
7037 {
7038 return gl::error(GL_INVALID_VALUE);
7039 }
7040
7041 if (timeout != GL_TIMEOUT_IGNORED)
7042 {
7043 return gl::error(GL_INVALID_VALUE);
7044 }
7045
7046 gl::FenceSync *fenceSync = context->getFenceSync(sync);
7047
7048 if (!fenceSync)
7049 {
7050 return gl::error(GL_INVALID_VALUE);
7051 }
7052
7053 fenceSync->serverWait();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007054 }
7055}
7056
7057void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
7058{
7059 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
7060 pname, params);
7061
Geoff Langbfdea662014-07-23 14:16:32 -04007062 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007063
Geoff Langbfdea662014-07-23 14:16:32 -04007064 if (context)
7065 {
7066 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007067 {
Geoff Langbfdea662014-07-23 14:16:32 -04007068 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007069 }
Geoff Langbfdea662014-07-23 14:16:32 -04007070
7071 GLenum nativeType;
7072 unsigned int numParams = 0;
7073 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
7074 {
7075 return;
7076 }
7077
7078 if (nativeType == GL_INT_64_ANGLEX)
7079 {
7080 context->getInteger64v(pname, params);
7081 }
7082 else
7083 {
7084 CastStateValues(context, nativeType, pname, numParams, params);
7085 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007086 }
7087}
7088
7089void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
7090{
7091 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
7092 sync, pname, bufSize, length, values);
7093
Geoff Langbfdea662014-07-23 14:16:32 -04007094 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007095
Geoff Langbfdea662014-07-23 14:16:32 -04007096 if (context)
7097 {
7098 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007099 {
Geoff Langbfdea662014-07-23 14:16:32 -04007100 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007101 }
Geoff Langbfdea662014-07-23 14:16:32 -04007102
7103 if (bufSize < 0)
7104 {
7105 return gl::error(GL_INVALID_VALUE);
7106 }
7107
7108 gl::FenceSync *fenceSync = context->getFenceSync(sync);
7109
7110 if (!fenceSync)
7111 {
7112 return gl::error(GL_INVALID_VALUE);
7113 }
7114
7115 switch (pname)
7116 {
7117 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
7118 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
7119 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
7120 case GL_SYNC_FLAGS: values[0] = 0; break;
7121
7122 default:
7123 return gl::error(GL_INVALID_ENUM);
7124 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007125 }
7126}
7127
7128void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
7129{
7130 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
7131 target, index, data);
7132
Geoff Langbfdea662014-07-23 14:16:32 -04007133 gl::Context *context = gl::getNonLostContext();
7134
7135 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007136 {
Geoff Langbfdea662014-07-23 14:16:32 -04007137 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007138 {
Geoff Langbfdea662014-07-23 14:16:32 -04007139 return gl::error(GL_INVALID_OPERATION);
7140 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007141
Geoff Langbfdea662014-07-23 14:16:32 -04007142 switch (target)
7143 {
7144 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7145 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7146 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7147 if (index >= context->getMaxTransformFeedbackBufferBindings())
7148 return gl::error(GL_INVALID_VALUE);
7149 break;
7150 case GL_UNIFORM_BUFFER_START:
7151 case GL_UNIFORM_BUFFER_SIZE:
7152 case GL_UNIFORM_BUFFER_BINDING:
7153 if (index >= context->getMaximumCombinedUniformBufferBindings())
7154 return gl::error(GL_INVALID_VALUE);
7155 break;
7156 default:
7157 return gl::error(GL_INVALID_ENUM);
7158 }
7159
7160 if (!(context->getIndexedInteger64v(target, index, data)))
7161 {
7162 GLenum nativeType;
7163 unsigned int numParams = 0;
7164 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
Shannon Woods15934d52013-08-19 14:28:49 -04007165 return gl::error(GL_INVALID_ENUM);
Shannon Woods15934d52013-08-19 14:28:49 -04007166
Geoff Langbfdea662014-07-23 14:16:32 -04007167 if (numParams == 0)
7168 return; // it is known that pname is valid, but there are no parameters to return
7169
7170 if (nativeType == GL_INT)
Shannon Woods15934d52013-08-19 14:28:49 -04007171 {
Geoff Langbfdea662014-07-23 14:16:32 -04007172 GLint *intParams = new GLint[numParams];
Shannon Woods15934d52013-08-19 14:28:49 -04007173
Geoff Langbfdea662014-07-23 14:16:32 -04007174 context->getIndexedIntegerv(target, index, intParams);
Shannon Woods15934d52013-08-19 14:28:49 -04007175
Geoff Langbfdea662014-07-23 14:16:32 -04007176 for (unsigned int i = 0; i < numParams; ++i)
Shannon Woods15934d52013-08-19 14:28:49 -04007177 {
Geoff Langbfdea662014-07-23 14:16:32 -04007178 data[i] = static_cast<GLint64>(intParams[i]);
Shannon Woods15934d52013-08-19 14:28:49 -04007179 }
Geoff Langbfdea662014-07-23 14:16:32 -04007180
7181 delete [] intParams;
7182 }
7183 else
7184 {
7185 UNREACHABLE();
Shannon Woods15934d52013-08-19 14:28:49 -04007186 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007187 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007188 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007189}
7190
7191void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
7192{
7193 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
7194 target, pname, params);
7195
Geoff Langbfdea662014-07-23 14:16:32 -04007196 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007197
Geoff Langbfdea662014-07-23 14:16:32 -04007198 if (context)
7199 {
7200 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007201 {
Geoff Langbfdea662014-07-23 14:16:32 -04007202 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007203 }
Geoff Langbfdea662014-07-23 14:16:32 -04007204
7205 if (!gl::ValidBufferTarget(context, target))
7206 {
7207 return gl::error(GL_INVALID_ENUM);
7208 }
7209
7210 if (!gl::ValidBufferParameter(context, pname))
7211 {
7212 return gl::error(GL_INVALID_ENUM);
7213 }
7214
7215 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
7216
7217 if (!buffer)
7218 {
7219 // A null buffer means that "0" is bound to the requested buffer target
7220 return gl::error(GL_INVALID_OPERATION);
7221 }
7222
7223 switch (pname)
7224 {
7225 case GL_BUFFER_USAGE:
7226 *params = static_cast<GLint64>(buffer->getUsage());
7227 break;
7228 case GL_BUFFER_SIZE:
7229 *params = buffer->getSize();
7230 break;
7231 case GL_BUFFER_ACCESS_FLAGS:
7232 *params = static_cast<GLint64>(buffer->getAccessFlags());
7233 break;
7234 case GL_BUFFER_MAPPED:
7235 *params = static_cast<GLint64>(buffer->isMapped());
7236 break;
7237 case GL_BUFFER_MAP_OFFSET:
7238 *params = buffer->getMapOffset();
7239 break;
7240 case GL_BUFFER_MAP_LENGTH:
7241 *params = buffer->getMapLength();
7242 break;
7243 default: UNREACHABLE(); break;
7244 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007245 }
7246}
7247
7248void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
7249{
7250 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
7251
Geoff Langbfdea662014-07-23 14:16:32 -04007252 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007253
Geoff Langbfdea662014-07-23 14:16:32 -04007254 if (context)
7255 {
7256 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007257 {
Geoff Langbfdea662014-07-23 14:16:32 -04007258 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007259 }
Geoff Langbfdea662014-07-23 14:16:32 -04007260
7261 if (count < 0)
7262 {
7263 return gl::error(GL_INVALID_VALUE);
7264 }
7265
7266 for (int i = 0; i < count; i++)
7267 {
7268 samplers[i] = context->createSampler();
7269 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007270 }
7271}
7272
7273void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
7274{
7275 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
7276
Geoff Langbfdea662014-07-23 14:16:32 -04007277 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007278
Geoff Langbfdea662014-07-23 14:16:32 -04007279 if (context)
7280 {
7281 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007282 {
Geoff Langbfdea662014-07-23 14:16:32 -04007283 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007284 }
Geoff Langbfdea662014-07-23 14:16:32 -04007285
7286 if (count < 0)
7287 {
7288 return gl::error(GL_INVALID_VALUE);
7289 }
7290
7291 for (int i = 0; i < count; i++)
7292 {
7293 context->deleteSampler(samplers[i]);
7294 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007295 }
7296}
7297
7298GLboolean __stdcall glIsSampler(GLuint sampler)
7299{
7300 EVENT("(GLuint sampler = %u)", sampler);
7301
Geoff Langbfdea662014-07-23 14:16:32 -04007302 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007303
Geoff Langbfdea662014-07-23 14:16:32 -04007304 if (context)
7305 {
7306 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007307 {
Geoff Langbfdea662014-07-23 14:16:32 -04007308 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007309 }
Geoff Langbfdea662014-07-23 14:16:32 -04007310
7311 return context->isSampler(sampler);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007312 }
7313
7314 return GL_FALSE;
7315}
7316
7317void __stdcall glBindSampler(GLuint unit, GLuint sampler)
7318{
7319 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
7320
Geoff Langbfdea662014-07-23 14:16:32 -04007321 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007322
Geoff Langbfdea662014-07-23 14:16:32 -04007323 if (context)
7324 {
7325 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007326 {
Geoff Langbfdea662014-07-23 14:16:32 -04007327 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007328 }
Geoff Langbfdea662014-07-23 14:16:32 -04007329
7330 if (sampler != 0 && !context->isSampler(sampler))
7331 {
7332 return gl::error(GL_INVALID_OPERATION);
7333 }
7334
7335 if (unit >= context->getMaximumCombinedTextureImageUnits())
7336 {
7337 return gl::error(GL_INVALID_VALUE);
7338 }
7339
7340 context->bindSampler(unit, sampler);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007341 }
7342}
7343
7344void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
7345{
7346 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
7347
Geoff Langbfdea662014-07-23 14:16:32 -04007348 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007349
Geoff Langbfdea662014-07-23 14:16:32 -04007350 if (context)
7351 {
7352 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007353 {
Geoff Langbfdea662014-07-23 14:16:32 -04007354 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007355 }
Geoff Langbfdea662014-07-23 14:16:32 -04007356
7357 if (!gl::ValidateSamplerObjectParameter(pname))
7358 {
7359 return;
7360 }
7361
7362 if (!gl::ValidateTexParamParameters(context, pname, param))
7363 {
7364 return;
7365 }
7366
7367 if (!context->isSampler(sampler))
7368 {
7369 return gl::error(GL_INVALID_OPERATION);
7370 }
7371
7372 context->samplerParameteri(sampler, pname, param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007373 }
7374}
7375
7376void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
7377{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04007378 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007379}
7380
7381void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
7382{
7383 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
7384
Geoff Langbfdea662014-07-23 14:16:32 -04007385 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007386
Geoff Langbfdea662014-07-23 14:16:32 -04007387 if (context)
7388 {
7389 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007390 {
Geoff Langbfdea662014-07-23 14:16:32 -04007391 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007392 }
Geoff Langbfdea662014-07-23 14:16:32 -04007393
7394 if (!gl::ValidateSamplerObjectParameter(pname))
7395 {
7396 return;
7397 }
7398
7399 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
7400 {
7401 return;
7402 }
7403
7404 if (!context->isSampler(sampler))
7405 {
7406 return gl::error(GL_INVALID_OPERATION);
7407 }
7408
7409 context->samplerParameterf(sampler, pname, param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007410 }
7411}
7412
7413void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
7414{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04007415 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007416}
7417
7418void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
7419{
7420 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
7421
Geoff Langbfdea662014-07-23 14:16:32 -04007422 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007423
Geoff Langbfdea662014-07-23 14:16:32 -04007424 if (context)
7425 {
7426 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007427 {
Geoff Langbfdea662014-07-23 14:16:32 -04007428 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007429 }
Geoff Langbfdea662014-07-23 14:16:32 -04007430
7431 if (!gl::ValidateSamplerObjectParameter(pname))
7432 {
7433 return;
7434 }
7435
7436 if (!context->isSampler(sampler))
7437 {
7438 return gl::error(GL_INVALID_OPERATION);
7439 }
7440
7441 *params = context->getSamplerParameteri(sampler, pname);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007442 }
7443}
7444
7445void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
7446{
7447 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
7448
Geoff Langbfdea662014-07-23 14:16:32 -04007449 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007450
Geoff Langbfdea662014-07-23 14:16:32 -04007451 if (context)
7452 {
7453 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007454 {
Geoff Langbfdea662014-07-23 14:16:32 -04007455 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007456 }
Geoff Langbfdea662014-07-23 14:16:32 -04007457
7458 if (!gl::ValidateSamplerObjectParameter(pname))
7459 {
7460 return;
7461 }
7462
7463 if (!context->isSampler(sampler))
7464 {
7465 return gl::error(GL_INVALID_OPERATION);
7466 }
7467
7468 *params = context->getSamplerParameterf(sampler, pname);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007469 }
7470}
7471
7472void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
7473{
7474 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
7475
Geoff Langbfdea662014-07-23 14:16:32 -04007476 if (index >= gl::MAX_VERTEX_ATTRIBS)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007477 {
Geoff Langbfdea662014-07-23 14:16:32 -04007478 return gl::error(GL_INVALID_VALUE);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007479 }
Geoff Langbfdea662014-07-23 14:16:32 -04007480
7481 gl::Context *context = gl::getNonLostContext();
7482
7483 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007484 {
Geoff Langbfdea662014-07-23 14:16:32 -04007485 if (context->getClientVersion() < 3)
7486 {
7487 return gl::error(GL_INVALID_OPERATION);
7488 }
7489
7490 context->setVertexAttribDivisor(index, divisor);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007491 }
7492}
7493
7494void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
7495{
7496 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7497
Geoff Langbfdea662014-07-23 14:16:32 -04007498 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007499
Geoff Langbfdea662014-07-23 14:16:32 -04007500 if (context)
7501 {
7502 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007503 {
Geoff Langbfdea662014-07-23 14:16:32 -04007504 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007505 }
Geoff Langbfdea662014-07-23 14:16:32 -04007506
7507 switch (target)
7508 {
7509 case GL_TRANSFORM_FEEDBACK:
7510 {
7511 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
7512 gl::TransformFeedback *curTransformFeedback = context->getState().getCurrentTransformFeedback();
7513 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
7514 {
7515 return gl::error(GL_INVALID_OPERATION);
7516 }
7517
7518 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
7519 if (context->getTransformFeedback(id) == NULL)
7520 {
7521 return gl::error(GL_INVALID_OPERATION);
7522 }
7523
7524 context->bindTransformFeedback(id);
7525 }
7526 break;
7527
7528 default:
7529 return gl::error(GL_INVALID_ENUM);
7530 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007531 }
7532}
7533
7534void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
7535{
7536 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
7537
Geoff Langbfdea662014-07-23 14:16:32 -04007538 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007539
Geoff Langbfdea662014-07-23 14:16:32 -04007540 if (context)
7541 {
7542 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007543 {
Geoff Langbfdea662014-07-23 14:16:32 -04007544 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007545 }
Geoff Langbfdea662014-07-23 14:16:32 -04007546
7547 for (int i = 0; i < n; i++)
7548 {
7549 context->deleteTransformFeedback(ids[i]);
7550 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007551 }
7552}
7553
7554void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
7555{
7556 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7557
Geoff Langbfdea662014-07-23 14:16:32 -04007558 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007559
Geoff Langbfdea662014-07-23 14:16:32 -04007560 if (context)
7561 {
7562 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007563 {
Geoff Langbfdea662014-07-23 14:16:32 -04007564 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007565 }
Geoff Langbfdea662014-07-23 14:16:32 -04007566
7567 for (int i = 0; i < n; i++)
7568 {
7569 ids[i] = context->createTransformFeedback();
7570 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007571 }
7572}
7573
7574GLboolean __stdcall glIsTransformFeedback(GLuint id)
7575{
7576 EVENT("(GLuint id = %u)", id);
7577
Geoff Langbfdea662014-07-23 14:16:32 -04007578 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007579
Geoff Langbfdea662014-07-23 14:16:32 -04007580 if (context)
7581 {
7582 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007583 {
Geoff Langbfdea662014-07-23 14:16:32 -04007584 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007585 }
Geoff Langbfdea662014-07-23 14:16:32 -04007586
7587 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007588 }
7589
7590 return GL_FALSE;
7591}
7592
7593void __stdcall glPauseTransformFeedback(void)
7594{
7595 EVENT("(void)");
7596
Geoff Langbfdea662014-07-23 14:16:32 -04007597 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007598
Geoff Langbfdea662014-07-23 14:16:32 -04007599 if (context)
7600 {
7601 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007602 {
Geoff Langbfdea662014-07-23 14:16:32 -04007603 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007604 }
Geoff Langbfdea662014-07-23 14:16:32 -04007605
7606 gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
7607 ASSERT(transformFeedback != NULL);
7608
7609 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
7610 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
7611 {
7612 return gl::error(GL_INVALID_OPERATION);
7613 }
7614
7615 transformFeedback->pause();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007616 }
7617}
7618
7619void __stdcall glResumeTransformFeedback(void)
7620{
7621 EVENT("(void)");
7622
Geoff Langbfdea662014-07-23 14:16:32 -04007623 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007624
Geoff Langbfdea662014-07-23 14:16:32 -04007625 if (context)
7626 {
7627 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007628 {
Geoff Langbfdea662014-07-23 14:16:32 -04007629 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007630 }
Geoff Langbfdea662014-07-23 14:16:32 -04007631
7632 gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
7633 ASSERT(transformFeedback != NULL);
7634
7635 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
7636 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
7637 {
7638 return gl::error(GL_INVALID_OPERATION);
7639 }
7640
7641 transformFeedback->resume();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007642 }
7643}
7644
7645void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
7646{
7647 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
7648 program, bufSize, length, binaryFormat, binary);
7649
Geoff Langbfdea662014-07-23 14:16:32 -04007650 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007651
Geoff Langbfdea662014-07-23 14:16:32 -04007652 if (context)
7653 {
7654 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007655 {
Geoff Langbfdea662014-07-23 14:16:32 -04007656 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007657 }
Geoff Langbfdea662014-07-23 14:16:32 -04007658
7659 // glGetProgramBinary
7660 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007661 }
7662}
7663
7664void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
7665{
7666 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
7667 program, binaryFormat, binary, length);
7668
Geoff Langbfdea662014-07-23 14:16:32 -04007669 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007670
Geoff Langbfdea662014-07-23 14:16:32 -04007671 if (context)
7672 {
7673 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007674 {
Geoff Langbfdea662014-07-23 14:16:32 -04007675 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007676 }
Geoff Langbfdea662014-07-23 14:16:32 -04007677
7678 // glProgramBinary
7679 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007680 }
7681}
7682
7683void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
7684{
7685 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
7686 program, pname, value);
7687
Geoff Langbfdea662014-07-23 14:16:32 -04007688 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007689
Geoff Langbfdea662014-07-23 14:16:32 -04007690 if (context)
7691 {
7692 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007693 {
Geoff Langbfdea662014-07-23 14:16:32 -04007694 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007695 }
Geoff Langbfdea662014-07-23 14:16:32 -04007696
7697 // glProgramParameteri
7698 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007699 }
7700}
7701
7702void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
7703{
7704 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
7705 target, numAttachments, attachments);
7706
Geoff Langbfdea662014-07-23 14:16:32 -04007707 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007708
Geoff Langbfdea662014-07-23 14:16:32 -04007709 if (context)
7710 {
7711 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007712 {
Geoff Langbfdea662014-07-23 14:16:32 -04007713 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00007714 }
Geoff Langbfdea662014-07-23 14:16:32 -04007715
7716 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
7717 {
7718 return;
7719 }
7720
7721 GLuint maxDimension = context->getCaps().maxRenderbufferSize;
7722 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007723 }
7724}
7725
7726void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
7727{
7728 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
7729 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7730 target, numAttachments, attachments, x, y, width, height);
7731
Geoff Langbfdea662014-07-23 14:16:32 -04007732 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007733
Geoff Langbfdea662014-07-23 14:16:32 -04007734 if (context)
7735 {
7736 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007737 {
Geoff Langbfdea662014-07-23 14:16:32 -04007738 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00007739 }
Geoff Langbfdea662014-07-23 14:16:32 -04007740
7741 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
7742 {
7743 return;
7744 }
7745
7746 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007747 }
7748}
7749
7750void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
7751{
7752 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7753 target, levels, internalformat, width, height);
7754
Geoff Langbfdea662014-07-23 14:16:32 -04007755 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007756
Geoff Langbfdea662014-07-23 14:16:32 -04007757 if (context)
7758 {
7759 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007760 {
Geoff Langbfdea662014-07-23 14:16:32 -04007761 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00007762 }
Geoff Langbfdea662014-07-23 14:16:32 -04007763
7764 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
7765 {
7766 return;
7767 }
7768
7769 switch (target)
7770 {
7771 case GL_TEXTURE_2D:
7772 {
7773 gl::Texture2D *texture2d = context->getTexture2D();
7774 texture2d->storage(levels, internalformat, width, height);
7775 }
7776 break;
7777
7778 case GL_TEXTURE_CUBE_MAP:
7779 {
7780 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
7781 textureCube->storage(levels, internalformat, width);
7782 }
7783 break;
7784
7785 default:
7786 return gl::error(GL_INVALID_ENUM);
7787 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007788 }
7789}
7790
7791void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
7792{
7793 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
7794 "GLsizei height = %d, GLsizei depth = %d)",
7795 target, levels, internalformat, width, height, depth);
7796
Geoff Langbfdea662014-07-23 14:16:32 -04007797 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007798
Geoff Langbfdea662014-07-23 14:16:32 -04007799 if (context)
7800 {
7801 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007802 {
Geoff Langbfdea662014-07-23 14:16:32 -04007803 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00007804 }
Geoff Langbfdea662014-07-23 14:16:32 -04007805
7806 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
7807 {
7808 return;
7809 }
7810
7811 switch (target)
7812 {
7813 case GL_TEXTURE_3D:
7814 {
7815 gl::Texture3D *texture3d = context->getTexture3D();
7816 texture3d->storage(levels, internalformat, width, height, depth);
7817 }
7818 break;
7819
7820 case GL_TEXTURE_2D_ARRAY:
7821 {
7822 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
7823 texture2darray->storage(levels, internalformat, width, height, depth);
7824 }
7825 break;
7826
7827 default:
7828 UNREACHABLE();
7829 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007830 }
7831}
7832
7833void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
7834{
7835 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
7836 "GLint* params = 0x%0.8p)",
7837 target, internalformat, pname, bufSize, params);
7838
Geoff Langbfdea662014-07-23 14:16:32 -04007839 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007840
Geoff Langbfdea662014-07-23 14:16:32 -04007841 if (context)
7842 {
7843 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007844 {
Geoff Langbfdea662014-07-23 14:16:32 -04007845 return gl::error(GL_INVALID_OPERATION);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007846 }
Geoff Langbfdea662014-07-23 14:16:32 -04007847
7848 const gl::TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
7849 if (!formatCaps.renderable)
7850 {
7851 return gl::error(GL_INVALID_ENUM);
7852 }
7853
7854 if (target != GL_RENDERBUFFER)
7855 {
7856 return gl::error(GL_INVALID_ENUM);
7857 }
7858
7859 if (bufSize < 0)
7860 {
7861 return gl::error(GL_INVALID_VALUE);
7862 }
7863
7864 switch (pname)
7865 {
7866 case GL_NUM_SAMPLE_COUNTS:
7867 if (bufSize != 0)
Geoff Lang5f4c4632014-07-03 13:46:52 -04007868 {
7869 *params = formatCaps.sampleCounts.size();
7870 }
Geoff Langbfdea662014-07-23 14:16:32 -04007871 break;
7872 case GL_SAMPLES:
Geoff Lang5f4c4632014-07-03 13:46:52 -04007873 std::copy_n(formatCaps.sampleCounts.rbegin(), std::min<size_t>(bufSize, formatCaps.sampleCounts.size()), params);
Geoff Langbfdea662014-07-23 14:16:32 -04007874 break;
7875 default:
7876 return gl::error(GL_INVALID_ENUM);
7877 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007878 }
7879}
7880
7881// Extension functions
7882
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00007883void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
7884 GLbitfield mask, GLenum filter)
7885{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007886 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00007887 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
7888 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7889 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7890
Geoff Langbfdea662014-07-23 14:16:32 -04007891 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00007892
Geoff Langbfdea662014-07-23 14:16:32 -04007893 if (context)
7894 {
7895 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
7896 dstX0, dstY0, dstX1, dstY1, mask, filter,
7897 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00007898 {
Geoff Langbfdea662014-07-23 14:16:32 -04007899 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00007900 }
Geoff Langbfdea662014-07-23 14:16:32 -04007901
7902 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7903 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00007904 }
7905}
7906
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007907void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
7908 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007910 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007911 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007912 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007913 target, level, internalformat, width, height, depth, border, format, type, pixels);
7914
Geoff Langbfdea662014-07-23 14:16:32 -04007915 UNIMPLEMENTED(); // FIXME
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007916}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00007917
Geoff Langbfdea662014-07-23 14:16:32 -04007918void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00007919 GLenum *binaryFormat, void *binary)
7920{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00007921 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 +00007922 program, bufSize, length, binaryFormat, binary);
7923
Geoff Langbfdea662014-07-23 14:16:32 -04007924 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00007925
Geoff Langbfdea662014-07-23 14:16:32 -04007926 if (context)
7927 {
7928 gl::Program *programObject = context->getProgram(program);
7929
7930 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00007931 {
Geoff Langbfdea662014-07-23 14:16:32 -04007932 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00007933 }
Geoff Langbfdea662014-07-23 14:16:32 -04007934
7935 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7936
7937 if (!programBinary)
7938 {
7939 return gl::error(GL_INVALID_OPERATION);
7940 }
7941
Geoff Lang900013c2014-07-07 11:32:19 -04007942 if (!programBinary->save(binaryFormat, binary, bufSize, length))
Geoff Langbfdea662014-07-23 14:16:32 -04007943 {
7944 return gl::error(GL_INVALID_OPERATION);
7945 }
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00007946 }
7947}
7948
7949void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
7950 const void *binary, GLint length)
7951{
7952 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
7953 program, binaryFormat, binary, length);
7954
Geoff Langbfdea662014-07-23 14:16:32 -04007955 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00007956
Geoff Langbfdea662014-07-23 14:16:32 -04007957 if (context)
7958 {
Geoff Lang900013c2014-07-07 11:32:19 -04007959 const std::vector<GLenum> &programBinaryFormats = context->getCaps().programBinaryFormats;
7960 if (std::find(programBinaryFormats.begin(), programBinaryFormats.end(), binaryFormat) == programBinaryFormats.end())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00007961 {
Geoff Langbfdea662014-07-23 14:16:32 -04007962 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00007963 }
Geoff Langbfdea662014-07-23 14:16:32 -04007964
7965 gl::Program *programObject = context->getProgram(program);
Geoff Langbfdea662014-07-23 14:16:32 -04007966 if (!programObject)
7967 {
7968 return gl::error(GL_INVALID_OPERATION);
7969 }
7970
Geoff Lang900013c2014-07-07 11:32:19 -04007971 context->setProgramBinary(program, binaryFormat, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00007972 }
7973}
7974
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00007975void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
7976{
7977 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
7978
Geoff Langbfdea662014-07-23 14:16:32 -04007979 gl::Context *context = gl::getNonLostContext();
7980
7981 if (context)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00007982 {
Geoff Langbfdea662014-07-23 14:16:32 -04007983 if (n < 0 || static_cast<GLuint>(n) > context->getCaps().maxDrawBuffers)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00007984 {
Geoff Langbfdea662014-07-23 14:16:32 -04007985 return gl::error(GL_INVALID_VALUE);
7986 }
7987
7988 if (context->getState().getDrawFramebuffer()->id() == 0)
7989 {
7990 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00007991 {
Geoff Langbfdea662014-07-23 14:16:32 -04007992 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00007993 }
7994
Geoff Langbfdea662014-07-23 14:16:32 -04007995 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00007996 {
Geoff Langbfdea662014-07-23 14:16:32 -04007997 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00007998 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00007999 }
Geoff Langbfdea662014-07-23 14:16:32 -04008000 else
8001 {
8002 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
8003 {
8004 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
8005 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
8006 {
8007 return gl::error(GL_INVALID_OPERATION);
8008 }
8009 }
8010 }
8011
8012 gl::Framebuffer *framebuffer = context->getState().getDrawFramebuffer();
8013
8014 for (unsigned int colorAttachment = 0; colorAttachment < static_cast<unsigned int>(n); colorAttachment++)
8015 {
8016 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
8017 }
8018
8019 for (unsigned int colorAttachment = n; colorAttachment < context->getCaps().maxDrawBuffers; colorAttachment++)
8020 {
8021 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
8022 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00008023 }
8024}
8025
Shannon Woodsb3801742014-03-27 14:59:19 -04008026void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
8027{
8028 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
8029
Geoff Langbfdea662014-07-23 14:16:32 -04008030 gl::Context *context = gl::getNonLostContext();
Shannon Woodsb3801742014-03-27 14:59:19 -04008031
Geoff Langbfdea662014-07-23 14:16:32 -04008032 if (context)
8033 {
8034 if (!gl::ValidBufferTarget(context, target))
Shannon Woodsb3801742014-03-27 14:59:19 -04008035 {
Geoff Langbfdea662014-07-23 14:16:32 -04008036 return gl::error(GL_INVALID_ENUM);
Shannon Woodsb3801742014-03-27 14:59:19 -04008037 }
Geoff Langbfdea662014-07-23 14:16:32 -04008038
8039 if (pname != GL_BUFFER_MAP_POINTER)
8040 {
8041 return gl::error(GL_INVALID_ENUM);
8042 }
8043
8044 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
8045
8046 if (!buffer || !buffer->isMapped())
8047 {
8048 *params = NULL;
8049 }
8050 else
8051 {
8052 *params = buffer->getMapPointer();
8053 }
Shannon Woodsb3801742014-03-27 14:59:19 -04008054 }
8055}
8056
8057void * __stdcall glMapBufferOES(GLenum target, GLenum access)
8058{
8059 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
8060
Geoff Langbfdea662014-07-23 14:16:32 -04008061 gl::Context *context = gl::getNonLostContext();
Shannon Woodsb3801742014-03-27 14:59:19 -04008062
Geoff Langbfdea662014-07-23 14:16:32 -04008063 if (context)
8064 {
8065 if (!gl::ValidBufferTarget(context, target))
Shannon Woodsb3801742014-03-27 14:59:19 -04008066 {
Geoff Langbfdea662014-07-23 14:16:32 -04008067 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
Shannon Woodsb3801742014-03-27 14:59:19 -04008068 }
Geoff Langbfdea662014-07-23 14:16:32 -04008069
8070 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
8071
8072 if (buffer == NULL)
8073 {
8074 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8075 }
8076
8077 if (access != GL_WRITE_ONLY_OES)
8078 {
8079 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
8080 }
8081
8082 if (buffer->isMapped())
8083 {
8084 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8085 }
8086
8087 return buffer->mapRange(0, buffer->getSize(), GL_MAP_WRITE_BIT);
Shannon Woodsb3801742014-03-27 14:59:19 -04008088 }
8089
8090 return NULL;
8091}
8092
8093GLboolean __stdcall glUnmapBufferOES(GLenum target)
8094{
8095 EVENT("(GLenum target = 0x%X)", target);
8096
Geoff Langbfdea662014-07-23 14:16:32 -04008097 gl::Context *context = gl::getNonLostContext();
Shannon Woodsb3801742014-03-27 14:59:19 -04008098
Geoff Langbfdea662014-07-23 14:16:32 -04008099 if (context)
8100 {
8101 if (!gl::ValidBufferTarget(context, target))
Shannon Woodsb3801742014-03-27 14:59:19 -04008102 {
Geoff Langbfdea662014-07-23 14:16:32 -04008103 return gl::error(GL_INVALID_ENUM, GL_FALSE);
Shannon Woodsb3801742014-03-27 14:59:19 -04008104 }
Geoff Langbfdea662014-07-23 14:16:32 -04008105
8106 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
8107
8108 if (buffer == NULL || !buffer->isMapped())
8109 {
8110 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8111 }
8112
8113 // TODO: detect if we had corruption. if so, throw an error and return false.
8114
8115 buffer->unmap();
8116
8117 return GL_TRUE;
Shannon Woodsb3801742014-03-27 14:59:19 -04008118 }
8119
8120 return GL_FALSE;
8121}
8122
Shannon Woods916e7692014-03-27 16:58:22 -04008123void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
8124{
8125 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
8126 target, offset, length, access);
8127
Geoff Langbfdea662014-07-23 14:16:32 -04008128 gl::Context *context = gl::getNonLostContext();
Shannon Woods916e7692014-03-27 16:58:22 -04008129
Geoff Langbfdea662014-07-23 14:16:32 -04008130 if (context)
8131 {
8132 if (!gl::ValidBufferTarget(context, target))
Shannon Woods916e7692014-03-27 16:58:22 -04008133 {
Geoff Langbfdea662014-07-23 14:16:32 -04008134 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
Shannon Woods916e7692014-03-27 16:58:22 -04008135 }
Geoff Langbfdea662014-07-23 14:16:32 -04008136
8137 if (offset < 0 || length < 0)
8138 {
8139 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
8140 }
8141
8142 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
8143
8144 if (buffer == NULL)
8145 {
8146 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8147 }
8148
8149 // Check for buffer overflow
8150 size_t offsetSize = static_cast<size_t>(offset);
8151 size_t lengthSize = static_cast<size_t>(length);
8152
8153 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
8154 offsetSize + lengthSize > static_cast<size_t>(buffer->getSize()))
8155 {
8156 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
8157 }
8158
8159 // Check for invalid bits in the mask
8160 GLbitfield allAccessBits = GL_MAP_READ_BIT |
8161 GL_MAP_WRITE_BIT |
8162 GL_MAP_INVALIDATE_RANGE_BIT |
8163 GL_MAP_INVALIDATE_BUFFER_BIT |
8164 GL_MAP_FLUSH_EXPLICIT_BIT |
8165 GL_MAP_UNSYNCHRONIZED_BIT;
8166
8167 if (access & ~(allAccessBits))
8168 {
8169 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
8170 }
8171
8172 if (length == 0 || buffer->isMapped())
8173 {
8174 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8175 }
8176
8177 // Check for invalid bit combinations
8178 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
8179 {
8180 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8181 }
8182
8183 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
8184 GL_MAP_INVALIDATE_BUFFER_BIT |
8185 GL_MAP_UNSYNCHRONIZED_BIT;
8186
8187 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
8188 {
8189 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8190 }
8191
8192 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
8193 {
8194 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8195 }
8196
8197 return buffer->mapRange(offset, length, access);
Shannon Woods916e7692014-03-27 16:58:22 -04008198 }
8199
8200 return NULL;
8201}
8202
8203void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
8204{
8205 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
8206
Geoff Langbfdea662014-07-23 14:16:32 -04008207 gl::Context *context = gl::getNonLostContext();
Shannon Woods916e7692014-03-27 16:58:22 -04008208
Geoff Langbfdea662014-07-23 14:16:32 -04008209 if (context)
8210 {
8211 if (offset < 0 || length < 0)
Shannon Woods916e7692014-03-27 16:58:22 -04008212 {
Geoff Langbfdea662014-07-23 14:16:32 -04008213 return gl::error(GL_INVALID_VALUE);
Shannon Woods916e7692014-03-27 16:58:22 -04008214 }
Geoff Langbfdea662014-07-23 14:16:32 -04008215
8216 if (!gl::ValidBufferTarget(context, target))
8217 {
8218 return gl::error(GL_INVALID_ENUM);
8219 }
8220
8221 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
8222
8223 if (buffer == NULL)
8224 {
8225 return gl::error(GL_INVALID_OPERATION);
8226 }
8227
8228 if (!buffer->isMapped() || (buffer->getAccessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
8229 {
8230 return gl::error(GL_INVALID_OPERATION);
8231 }
8232
8233 // Check for buffer overflow
8234 size_t offsetSize = static_cast<size_t>(offset);
8235 size_t lengthSize = static_cast<size_t>(length);
8236
8237 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
8238 offsetSize + lengthSize > static_cast<size_t>(buffer->getMapLength()))
8239 {
8240 return gl::error(GL_INVALID_VALUE);
8241 }
8242
8243 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
Shannon Woods916e7692014-03-27 16:58:22 -04008244 }
8245}
8246
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00008247__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
8248{
8249 struct Extension
8250 {
8251 const char *name;
8252 __eglMustCastToProperFunctionPointerType address;
8253 };
8254
8255 static const Extension glExtensions[] =
8256 {
8257 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00008258 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00008259 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00008260 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
8261 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
8262 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
8263 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
8264 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
8265 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
8266 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00008267 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00008268 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00008269 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
8270 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
8271 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
8272 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00008273 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
8274 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
8275 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
8276 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
8277 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
8278 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
8279 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +00008280 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00008281 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
8282 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
8283 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00008284 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -04008285 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
8286 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
8287 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -04008288 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
8289 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
8290 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00008291
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +00008292 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00008293 {
8294 if (strcmp(procname, glExtensions[ext].name) == 0)
8295 {
8296 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
8297 }
8298 }
8299
8300 return NULL;
8301}
8302
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00008303// Non-public functions used by EGL
8304
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00008305bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00008306{
8307 EVENT("(egl::Surface* surface = 0x%0.8p)",
8308 surface);
8309
Geoff Langbfdea662014-07-23 14:16:32 -04008310 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00008311
Geoff Langbfdea662014-07-23 14:16:32 -04008312 if (context)
8313 {
8314 gl::Texture2D *textureObject = context->getTexture2D();
8315 ASSERT(textureObject != NULL);
8316
8317 if (textureObject->isImmutable())
jbauman@chromium.orgae345802011-03-30 22:04:25 +00008318 {
Geoff Langbfdea662014-07-23 14:16:32 -04008319 return false;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00008320 }
Geoff Langbfdea662014-07-23 14:16:32 -04008321
8322 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00008323 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00008324
8325 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00008326}
8327
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00008328}