blob: b4bc4ee697202c8386ddb3d73b867f98e1659162 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
Geoff Lang48dcae72014-02-05 16:28:24 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
8
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00009#include "common/version.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040010#include "common/utilities.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000013#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000014#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000015#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000016#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000017#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000018#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000019#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000020#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000021#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000022#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040023#include "libGLESv2/VertexArray.h"
Brandon Jones5bf98292014-06-06 17:19:38 -070024#include "libGLESv2/VertexAttribute.h"
Geoff Langc8058452014-02-03 12:04:11 -050025#include "libGLESv2/TransformFeedback.h"
Jamie Madille261b442014-06-25 12:42:21 -040026#include "libGLESv2/FramebufferAttachment.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000027
Geoff Lange8ebe7f2013-08-05 15:03:13 -040028#include "libGLESv2/validationES.h"
29#include "libGLESv2/validationES2.h"
30#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050031#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040032
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000033extern "C"
34{
35
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000036// OpenGL ES 2.0 functions
37
Kenneth Russell67ea1902014-10-06 16:44:50 -070038void GL_APIENTRY glActiveTexture(GLenum texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000039{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000040 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000041
Geoff Langbfdea662014-07-23 14:16:32 -040042 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -040043 if (context)
44 {
Geoff Lang3a61c322014-07-10 13:01:54 -040045 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getCaps().maxCombinedTextureImageUnits - 1)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000046 {
Geoff Langb1196682014-07-23 13:47:29 -040047 context->recordError(gl::Error(GL_INVALID_ENUM));
48 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000049 }
Geoff Langbfdea662014-07-23 14:16:32 -040050
51 context->getState().setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000052 }
53}
54
Kenneth Russell67ea1902014-10-06 16:44:50 -070055void GL_APIENTRY glAttachShader(GLuint program, GLuint shader)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000056{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000057 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058
Geoff Langbfdea662014-07-23 14:16:32 -040059 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -040060 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000061 {
Geoff Langbfdea662014-07-23 14:16:32 -040062 gl::Program *programObject = context->getProgram(program);
63 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064
Geoff Langbfdea662014-07-23 14:16:32 -040065 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000066 {
Geoff Langbfdea662014-07-23 14:16:32 -040067 if (context->getShader(program))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068 {
Geoff Langb1196682014-07-23 13:47:29 -040069 context->recordError(gl::Error(GL_INVALID_OPERATION));
70 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000071 }
Geoff Langbfdea662014-07-23 14:16:32 -040072 else
73 {
Geoff Langb1196682014-07-23 13:47:29 -040074 context->recordError(gl::Error(GL_INVALID_VALUE));
75 return;
Geoff Langbfdea662014-07-23 14:16:32 -040076 }
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 {
Geoff Langb1196682014-07-23 13:47:29 -040083 context->recordError(gl::Error(GL_INVALID_OPERATION));
84 return;
Geoff Langbfdea662014-07-23 14:16:32 -040085 }
86 else
87 {
Geoff Langb1196682014-07-23 13:47:29 -040088 context->recordError(gl::Error(GL_INVALID_VALUE));
89 return;
Geoff Langbfdea662014-07-23 14:16:32 -040090 }
91 }
92
93 if (!programObject->attachShader(shaderObject))
94 {
Geoff Langb1196682014-07-23 13:47:29 -040095 context->recordError(gl::Error(GL_INVALID_OPERATION));
96 return;
Geoff Langbfdea662014-07-23 14:16:32 -040097 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000098 }
99}
100
Kenneth Russell67ea1902014-10-06 16:44:50 -0700101void GL_APIENTRY glBeginQueryEXT(GLenum target, GLuint id)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000102{
103 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
104
Geoff Langbfdea662014-07-23 14:16:32 -0400105 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400106 if (context)
107 {
108 if (!ValidateBeginQuery(context, target, id))
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000109 {
Geoff Langbfdea662014-07-23 14:16:32 -0400110 return;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000111 }
Geoff Langbfdea662014-07-23 14:16:32 -0400112
Geoff Lang5aad9672014-09-08 11:10:42 -0400113 gl::Error error = context->beginQuery(target, id);
114 if (error.isError())
115 {
116 context->recordError(error);
117 return;
118 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000119 }
120}
121
Kenneth Russell67ea1902014-10-06 16:44:50 -0700122void GL_APIENTRY glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000123{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000124 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000125
Geoff Langbfdea662014-07-23 14:16:32 -0400126 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400127 if (context)
128 {
Geoff Langb1196682014-07-23 13:47:29 -0400129 if (index >= gl::MAX_VERTEX_ATTRIBS)
130 {
131 context->recordError(gl::Error(GL_INVALID_VALUE));
132 return;
133 }
134
Geoff Langbfdea662014-07-23 14:16:32 -0400135 gl::Program *programObject = context->getProgram(program);
136
137 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000138 {
Geoff Langbfdea662014-07-23 14:16:32 -0400139 if (context->getShader(program))
daniel@transgaming.com98079832010-04-13 03:26:29 +0000140 {
Geoff Langb1196682014-07-23 13:47:29 -0400141 context->recordError(gl::Error(GL_INVALID_OPERATION));
142 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000143 }
Geoff Langbfdea662014-07-23 14:16:32 -0400144 else
145 {
Geoff Langb1196682014-07-23 13:47:29 -0400146 context->recordError(gl::Error(GL_INVALID_VALUE));
147 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400148 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000149 }
Geoff Langbfdea662014-07-23 14:16:32 -0400150
151 if (strncmp(name, "gl_", 3) == 0)
152 {
Geoff Langb1196682014-07-23 13:47:29 -0400153 context->recordError(gl::Error(GL_INVALID_OPERATION));
154 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400155 }
156
157 programObject->bindAttributeLocation(index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000158 }
159}
160
Kenneth Russell67ea1902014-10-06 16:44:50 -0700161void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000163 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000164
Geoff Langbfdea662014-07-23 14:16:32 -0400165 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400166 if (context)
167 {
168 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000169 {
Geoff Langb1196682014-07-23 13:47:29 -0400170 context->recordError(gl::Error(GL_INVALID_ENUM));
171 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000172 }
Geoff Langbfdea662014-07-23 14:16:32 -0400173
174 switch (target)
175 {
176 case GL_ARRAY_BUFFER:
177 context->bindArrayBuffer(buffer);
178 return;
179 case GL_ELEMENT_ARRAY_BUFFER:
180 context->bindElementArrayBuffer(buffer);
181 return;
182 case GL_COPY_READ_BUFFER:
183 context->bindCopyReadBuffer(buffer);
184 return;
185 case GL_COPY_WRITE_BUFFER:
186 context->bindCopyWriteBuffer(buffer);
187 return;
188 case GL_PIXEL_PACK_BUFFER:
189 context->bindPixelPackBuffer(buffer);
190 return;
191 case GL_PIXEL_UNPACK_BUFFER:
192 context->bindPixelUnpackBuffer(buffer);
193 return;
194 case GL_UNIFORM_BUFFER:
195 context->bindGenericUniformBuffer(buffer);
196 return;
197 case GL_TRANSFORM_FEEDBACK_BUFFER:
198 context->bindGenericTransformFeedbackBuffer(buffer);
199 return;
Geoff Langb1196682014-07-23 13:47:29 -0400200
Geoff Langbfdea662014-07-23 14:16:32 -0400201 default:
Geoff Langb1196682014-07-23 13:47:29 -0400202 context->recordError(gl::Error(GL_INVALID_ENUM));
203 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400204 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000205 }
206}
207
Kenneth Russell67ea1902014-10-06 16:44:50 -0700208void GL_APIENTRY glBindFramebuffer(GLenum target, GLuint framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000209{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000210 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000211
Geoff Langbfdea662014-07-23 14:16:32 -0400212 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400213 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000214 {
Geoff Langb1196682014-07-23 13:47:29 -0400215 if (!gl::ValidFramebufferTarget(target))
216 {
217 context->recordError(gl::Error(GL_INVALID_ENUM));
218 return;
219 }
220
Geoff Langbfdea662014-07-23 14:16:32 -0400221 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
222 {
223 context->bindReadFramebuffer(framebuffer);
224 }
225
226 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
227 {
228 context->bindDrawFramebuffer(framebuffer);
229 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000230 }
231}
232
Kenneth Russell67ea1902014-10-06 16:44:50 -0700233void GL_APIENTRY glBindRenderbuffer(GLenum target, GLuint renderbuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000234{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000235 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000236
Geoff Langbfdea662014-07-23 14:16:32 -0400237 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400238 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000239 {
Geoff Langb1196682014-07-23 13:47:29 -0400240 if (target != GL_RENDERBUFFER)
241 {
242 context->recordError(gl::Error(GL_INVALID_ENUM));
243 return;
244 }
245
Geoff Langbfdea662014-07-23 14:16:32 -0400246 context->bindRenderbuffer(renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000247 }
248}
249
Kenneth Russell67ea1902014-10-06 16:44:50 -0700250void GL_APIENTRY glBindTexture(GLenum target, GLuint texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000251{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000252 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000253
Geoff Langbfdea662014-07-23 14:16:32 -0400254 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400255 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256 {
Geoff Langbfdea662014-07-23 14:16:32 -0400257 gl::Texture *textureObject = context->getTexture(texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258
Geoff Langbfdea662014-07-23 14:16:32 -0400259 if (textureObject && textureObject->getTarget() != target && texture != 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000260 {
Geoff Langb1196682014-07-23 13:47:29 -0400261 context->recordError(gl::Error(GL_INVALID_OPERATION));
262 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400263 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000264
Geoff Langbfdea662014-07-23 14:16:32 -0400265 switch (target)
266 {
267 case GL_TEXTURE_2D:
Geoff Langbfdea662014-07-23 14:16:32 -0400268 case GL_TEXTURE_CUBE_MAP:
Geoff Lang76b10c92014-09-05 16:28:14 -0400269 break;
Geoff Langb1196682014-07-23 13:47:29 -0400270
Geoff Langbfdea662014-07-23 14:16:32 -0400271 case GL_TEXTURE_3D:
Geoff Langbfdea662014-07-23 14:16:32 -0400272 case GL_TEXTURE_2D_ARRAY:
273 if (context->getClientVersion() < 3)
274 {
Geoff Langb1196682014-07-23 13:47:29 -0400275 context->recordError(gl::Error(GL_INVALID_ENUM));
276 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400277 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400278 break;
Geoff Langb1196682014-07-23 13:47:29 -0400279
Geoff Langbfdea662014-07-23 14:16:32 -0400280 default:
Geoff Langb1196682014-07-23 13:47:29 -0400281 context->recordError(gl::Error(GL_INVALID_ENUM));
282 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000283 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400284
285 context->bindTexture(target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000286 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000287}
288
Kenneth Russell67ea1902014-10-06 16:44:50 -0700289void GL_APIENTRY glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000290{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000291 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000292 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000293
Geoff Langbfdea662014-07-23 14:16:32 -0400294 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000295
Geoff Langbfdea662014-07-23 14:16:32 -0400296 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000297 {
Geoff Langbfdea662014-07-23 14:16:32 -0400298 context->getState().setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000299 }
300}
301
Kenneth Russell67ea1902014-10-06 16:44:50 -0700302void GL_APIENTRY glBlendEquation(GLenum mode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000303{
304 glBlendEquationSeparate(mode, mode);
305}
306
Kenneth Russell67ea1902014-10-06 16:44:50 -0700307void GL_APIENTRY glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000308{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000309 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000310
Geoff Langbfdea662014-07-23 14:16:32 -0400311 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400312 if (context)
313 {
Geoff Langb1196682014-07-23 13:47:29 -0400314 switch (modeRGB)
315 {
316 case GL_FUNC_ADD:
317 case GL_FUNC_SUBTRACT:
318 case GL_FUNC_REVERSE_SUBTRACT:
319 case GL_MIN:
320 case GL_MAX:
321 break;
322
323 default:
324 context->recordError(gl::Error(GL_INVALID_ENUM));
325 return;
326 }
327
328 switch (modeAlpha)
329 {
330 case GL_FUNC_ADD:
331 case GL_FUNC_SUBTRACT:
332 case GL_FUNC_REVERSE_SUBTRACT:
333 case GL_MIN:
334 case GL_MAX:
335 break;
336
337 default:
338 context->recordError(gl::Error(GL_INVALID_ENUM));
339 return;
340 }
341
Geoff Langbfdea662014-07-23 14:16:32 -0400342 context->getState().setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000343 }
344}
345
Kenneth Russell67ea1902014-10-06 16:44:50 -0700346void GL_APIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000347{
348 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
349}
350
Kenneth Russell67ea1902014-10-06 16:44:50 -0700351void GL_APIENTRY glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000352{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000353 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 +0000354 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000355
Geoff Langbfdea662014-07-23 14:16:32 -0400356 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400357 if (context)
358 {
Geoff Langb1196682014-07-23 13:47:29 -0400359 switch (srcRGB)
360 {
361 case GL_ZERO:
362 case GL_ONE:
363 case GL_SRC_COLOR:
364 case GL_ONE_MINUS_SRC_COLOR:
365 case GL_DST_COLOR:
366 case GL_ONE_MINUS_DST_COLOR:
367 case GL_SRC_ALPHA:
368 case GL_ONE_MINUS_SRC_ALPHA:
369 case GL_DST_ALPHA:
370 case GL_ONE_MINUS_DST_ALPHA:
371 case GL_CONSTANT_COLOR:
372 case GL_ONE_MINUS_CONSTANT_COLOR:
373 case GL_CONSTANT_ALPHA:
374 case GL_ONE_MINUS_CONSTANT_ALPHA:
375 case GL_SRC_ALPHA_SATURATE:
376 break;
377
378 default:
379 context->recordError(gl::Error(GL_INVALID_ENUM));
380 return;
381 }
382
383 switch (dstRGB)
384 {
385 case GL_ZERO:
386 case GL_ONE:
387 case GL_SRC_COLOR:
388 case GL_ONE_MINUS_SRC_COLOR:
389 case GL_DST_COLOR:
390 case GL_ONE_MINUS_DST_COLOR:
391 case GL_SRC_ALPHA:
392 case GL_ONE_MINUS_SRC_ALPHA:
393 case GL_DST_ALPHA:
394 case GL_ONE_MINUS_DST_ALPHA:
395 case GL_CONSTANT_COLOR:
396 case GL_ONE_MINUS_CONSTANT_COLOR:
397 case GL_CONSTANT_ALPHA:
398 case GL_ONE_MINUS_CONSTANT_ALPHA:
399 break;
400
401 case GL_SRC_ALPHA_SATURATE:
402 if (context->getClientVersion() < 3)
403 {
404 context->recordError(gl::Error(GL_INVALID_ENUM));
405 return;
406 }
407 break;
408
409 default:
410 context->recordError(gl::Error(GL_INVALID_ENUM));
411 return;
412 }
413
414 switch (srcAlpha)
415 {
416 case GL_ZERO:
417 case GL_ONE:
418 case GL_SRC_COLOR:
419 case GL_ONE_MINUS_SRC_COLOR:
420 case GL_DST_COLOR:
421 case GL_ONE_MINUS_DST_COLOR:
422 case GL_SRC_ALPHA:
423 case GL_ONE_MINUS_SRC_ALPHA:
424 case GL_DST_ALPHA:
425 case GL_ONE_MINUS_DST_ALPHA:
426 case GL_CONSTANT_COLOR:
427 case GL_ONE_MINUS_CONSTANT_COLOR:
428 case GL_CONSTANT_ALPHA:
429 case GL_ONE_MINUS_CONSTANT_ALPHA:
430 case GL_SRC_ALPHA_SATURATE:
431 break;
432
433 default:
434 context->recordError(gl::Error(GL_INVALID_ENUM));
435 return;
436 }
437
438 switch (dstAlpha)
439 {
440 case GL_ZERO:
441 case GL_ONE:
442 case GL_SRC_COLOR:
443 case GL_ONE_MINUS_SRC_COLOR:
444 case GL_DST_COLOR:
445 case GL_ONE_MINUS_DST_COLOR:
446 case GL_SRC_ALPHA:
447 case GL_ONE_MINUS_SRC_ALPHA:
448 case GL_DST_ALPHA:
449 case GL_ONE_MINUS_DST_ALPHA:
450 case GL_CONSTANT_COLOR:
451 case GL_ONE_MINUS_CONSTANT_COLOR:
452 case GL_CONSTANT_ALPHA:
453 case GL_ONE_MINUS_CONSTANT_ALPHA:
454 break;
455
456 case GL_SRC_ALPHA_SATURATE:
457 if (context->getClientVersion() < 3)
458 {
459 context->recordError(gl::Error(GL_INVALID_ENUM));
460 return;
461 }
462 break;
463
464 default:
465 context->recordError(gl::Error(GL_INVALID_ENUM));
466 return;
467 }
468
469 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
470 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
471
472 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
473 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
474
475 if (constantColorUsed && constantAlphaUsed)
476 {
477 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
478 context->recordError(gl::Error(GL_INVALID_OPERATION));
479 return;
480 }
481
Geoff Langbfdea662014-07-23 14:16:32 -0400482 context->getState().setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000483 }
484}
485
Kenneth Russell67ea1902014-10-06 16:44:50 -0700486void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000487{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000488 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 +0000489 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000490
Geoff Langbfdea662014-07-23 14:16:32 -0400491 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400492 if (context)
493 {
Geoff Langb1196682014-07-23 13:47:29 -0400494 if (size < 0)
495 {
496 context->recordError(gl::Error(GL_INVALID_VALUE));
497 return;
498 }
499
500 switch (usage)
501 {
502 case GL_STREAM_DRAW:
503 case GL_STATIC_DRAW:
504 case GL_DYNAMIC_DRAW:
505 break;
506
507 case GL_STREAM_READ:
508 case GL_STREAM_COPY:
509 case GL_STATIC_READ:
510 case GL_STATIC_COPY:
511 case GL_DYNAMIC_READ:
512 case GL_DYNAMIC_COPY:
513 if (context->getClientVersion() < 3)
514 {
515 context->recordError(gl::Error(GL_INVALID_ENUM));
516 return;
517 }
518 break;
519
520 default:
521 context->recordError(gl::Error(GL_INVALID_ENUM));
522 return;
523 }
524
Geoff Langbfdea662014-07-23 14:16:32 -0400525 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000526 {
Geoff Langb1196682014-07-23 13:47:29 -0400527 context->recordError(gl::Error(GL_INVALID_ENUM));
528 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000529 }
530
Geoff Langbfdea662014-07-23 14:16:32 -0400531 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
532
533 if (!buffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000534 {
Geoff Langb1196682014-07-23 13:47:29 -0400535 context->recordError(gl::Error(GL_INVALID_OPERATION));
536 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000537 }
Geoff Langbfdea662014-07-23 14:16:32 -0400538
Geoff Lang2a1c15a2014-07-25 11:43:00 -0400539 gl::Error error = buffer->bufferData(data, size, usage);
540 if (error.isError())
541 {
542 context->recordError(error);
543 return;
544 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000545 }
546}
547
Kenneth Russell67ea1902014-10-06 16:44:50 -0700548void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000549{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000550 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 +0000551 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000552
Geoff Langbfdea662014-07-23 14:16:32 -0400553 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400554 if (context)
555 {
Geoff Langb1196682014-07-23 13:47:29 -0400556 if (size < 0 || offset < 0)
557 {
558 context->recordError(gl::Error(GL_INVALID_VALUE));
559 return;
560 }
561
562 if (data == NULL)
563 {
564 return;
565 }
566
Geoff Langbfdea662014-07-23 14:16:32 -0400567 if (!gl::ValidBufferTarget(context, target))
568 {
Geoff Langb1196682014-07-23 13:47:29 -0400569 context->recordError(gl::Error(GL_INVALID_ENUM));
570 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400571 }
572
573 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
574
575 if (!buffer)
576 {
Geoff Langb1196682014-07-23 13:47:29 -0400577 context->recordError(gl::Error(GL_INVALID_OPERATION));
578 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400579 }
580
581 if (buffer->isMapped())
582 {
Geoff Langb1196682014-07-23 13:47:29 -0400583 context->recordError(gl::Error(GL_INVALID_OPERATION));
584 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400585 }
586
587 // Check for possible overflow of size + offset
588 if (!rx::IsUnsignedAdditionSafe<size_t>(size, offset))
589 {
Geoff Langb1196682014-07-23 13:47:29 -0400590 context->recordError(gl::Error(GL_OUT_OF_MEMORY));
591 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400592 }
593
594 if (size + offset > buffer->getSize())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000595 {
Geoff Langb1196682014-07-23 13:47:29 -0400596 context->recordError(gl::Error(GL_INVALID_VALUE));
597 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000598 }
599
Geoff Lang2a1c15a2014-07-25 11:43:00 -0400600 gl::Error error = buffer->bufferSubData(data, size, offset);
601 if (error.isError())
602 {
603 context->recordError(error);
604 return;
605 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000606 }
607}
608
Kenneth Russell67ea1902014-10-06 16:44:50 -0700609GLenum GL_APIENTRY glCheckFramebufferStatus(GLenum target)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000610{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000611 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000612
Geoff Langbfdea662014-07-23 14:16:32 -0400613 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400614 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000615 {
Geoff Langb1196682014-07-23 13:47:29 -0400616 if (!gl::ValidFramebufferTarget(target))
617 {
618 context->recordError(gl::Error(GL_INVALID_ENUM));
619 return 0;
620 }
621
Geoff Langbfdea662014-07-23 14:16:32 -0400622 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
623 ASSERT(framebuffer);
624 return framebuffer->completeness();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000625 }
626
627 return 0;
628}
629
Kenneth Russell67ea1902014-10-06 16:44:50 -0700630void GL_APIENTRY glClear(GLbitfield mask)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000631{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000632 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000633
Geoff Langbfdea662014-07-23 14:16:32 -0400634 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400635 if (context)
636 {
637 gl::Framebuffer *framebufferObject = context->getState().getDrawFramebuffer();
638
639 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000640 {
Geoff Langb1196682014-07-23 13:47:29 -0400641 context->recordError(gl::Error(GL_INVALID_FRAMEBUFFER_OPERATION));
642 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000643 }
Geoff Langbfdea662014-07-23 14:16:32 -0400644
645 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
646 {
Geoff Langb1196682014-07-23 13:47:29 -0400647 context->recordError(gl::Error(GL_INVALID_VALUE));
648 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400649 }
650
Geoff Langcc79b8c2014-07-25 13:48:02 -0400651 gl::Error error = context->clear(mask);
652 if (error.isError())
653 {
654 context->recordError(error);
655 return;
656 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000657 }
658}
659
Kenneth Russell67ea1902014-10-06 16:44:50 -0700660void GL_APIENTRY glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000661{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000662 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000663 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000664
Geoff Langbfdea662014-07-23 14:16:32 -0400665 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400666 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000667 {
Geoff Langbfdea662014-07-23 14:16:32 -0400668 context->getState().setClearColor(red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000669 }
670}
671
Kenneth Russell67ea1902014-10-06 16:44:50 -0700672void GL_APIENTRY glClearDepthf(GLclampf depth)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000673{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000674 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000675
Geoff Langbfdea662014-07-23 14:16:32 -0400676 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400677 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000678 {
Geoff Langbfdea662014-07-23 14:16:32 -0400679 context->getState().setClearDepth(depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000680 }
681}
682
Kenneth Russell67ea1902014-10-06 16:44:50 -0700683void GL_APIENTRY glClearStencil(GLint s)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000684{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000685 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000686
Geoff Langbfdea662014-07-23 14:16:32 -0400687 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400688 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000689 {
Geoff Langbfdea662014-07-23 14:16:32 -0400690 context->getState().setClearStencil(s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000691 }
692}
693
Kenneth Russell67ea1902014-10-06 16:44:50 -0700694void GL_APIENTRY glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000695{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000696 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000697 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000698
Geoff Langbfdea662014-07-23 14:16:32 -0400699 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400700 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000701 {
Geoff Langbfdea662014-07-23 14:16:32 -0400702 context->getState().setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000703 }
704}
705
Kenneth Russell67ea1902014-10-06 16:44:50 -0700706void GL_APIENTRY glCompileShader(GLuint shader)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000707{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000708 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000709
Geoff Langbfdea662014-07-23 14:16:32 -0400710 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400711 if (context)
712 {
713 gl::Shader *shaderObject = context->getShader(shader);
714
715 if (!shaderObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000716 {
Geoff Langbfdea662014-07-23 14:16:32 -0400717 if (context->getProgram(shader))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000718 {
Geoff Langb1196682014-07-23 13:47:29 -0400719 context->recordError(gl::Error(GL_INVALID_OPERATION));
720 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000721 }
Geoff Langbfdea662014-07-23 14:16:32 -0400722 else
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000723 {
Geoff Langb1196682014-07-23 13:47:29 -0400724 context->recordError(gl::Error(GL_INVALID_VALUE));
725 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000726 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000727 }
Geoff Langbfdea662014-07-23 14:16:32 -0400728
729 shaderObject->compile();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000730 }
Geoff Langbfdea662014-07-23 14:16:32 -0400731}
732
Kenneth Russell67ea1902014-10-06 16:44:50 -0700733void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
Geoff Langbfdea662014-07-23 14:16:32 -0400734 GLint border, GLsizei imageSize, const GLvoid* data)
735{
736 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
737 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
738 target, level, internalformat, width, height, border, imageSize, data);
739
740 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400741 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000742 {
Geoff Langbfdea662014-07-23 14:16:32 -0400743 if (context->getClientVersion() < 3 &&
744 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
745 0, 0, width, height, border, GL_NONE, GL_NONE, data))
746 {
747 return;
748 }
749
750 if (context->getClientVersion() >= 3 &&
751 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
752 0, 0, 0, width, height, 1, border, GL_NONE, GL_NONE, data))
753 {
754 return;
755 }
756
Geoff Lang5d601382014-07-22 15:14:06 -0400757 const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalformat);
758 if (imageSize < 0 || static_cast<GLuint>(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
Geoff Langbfdea662014-07-23 14:16:32 -0400759 {
Geoff Langb1196682014-07-23 13:47:29 -0400760 context->recordError(gl::Error(GL_INVALID_VALUE));
761 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400762 }
763
764 switch (target)
765 {
766 case GL_TEXTURE_2D:
767 {
768 gl::Texture2D *texture = context->getTexture2D();
Geoff Langb5348332014-09-02 13:16:34 -0400769 gl::Error error = texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
770 if (error.isError())
771 {
772 context->recordError(error);
773 return;
774 }
Geoff Langbfdea662014-07-23 14:16:32 -0400775 }
776 break;
777
778 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
779 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
780 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
781 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
782 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
783 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
784 {
785 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Geoff Langb5348332014-09-02 13:16:34 -0400786 gl::Error error = texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
787 if (error.isError())
788 {
789 context->recordError(error);
790 return;
791 }
Geoff Langbfdea662014-07-23 14:16:32 -0400792 }
793 break;
794
795 default:
Geoff Langb1196682014-07-23 13:47:29 -0400796 context->recordError(gl::Error(GL_INVALID_ENUM));
797 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400798 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000799 }
800}
801
Kenneth Russell67ea1902014-10-06 16:44:50 -0700802void GL_APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000803 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000804{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000805 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000806 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000807 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000808 target, level, xoffset, yoffset, width, height, format, imageSize, data);
809
Geoff Langbfdea662014-07-23 14:16:32 -0400810 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400811 if (context)
812 {
813 if (context->getClientVersion() < 3 &&
814 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
815 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
daniel@transgaming.com01868132010-08-24 19:21:17 +0000816 {
Geoff Langbfdea662014-07-23 14:16:32 -0400817 return;
daniel@transgaming.com01868132010-08-24 19:21:17 +0000818 }
Geoff Langbfdea662014-07-23 14:16:32 -0400819
820 if (context->getClientVersion() >= 3 &&
821 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
822 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
823 {
824 return;
825 }
826
Geoff Lang5d601382014-07-22 15:14:06 -0400827 const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(format);
828 if (imageSize < 0 || static_cast<GLuint>(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
Geoff Langbfdea662014-07-23 14:16:32 -0400829 {
Geoff Langb1196682014-07-23 13:47:29 -0400830 context->recordError(gl::Error(GL_INVALID_VALUE));
831 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400832 }
833
834 switch (target)
835 {
836 case GL_TEXTURE_2D:
837 {
838 gl::Texture2D *texture = context->getTexture2D();
Geoff Langb5348332014-09-02 13:16:34 -0400839 gl::Error error = texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
840 if (error.isError())
841 {
842 context->recordError(error);
843 return;
844 }
Geoff Langbfdea662014-07-23 14:16:32 -0400845 }
846 break;
847
848 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
849 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
850 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
851 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
852 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
853 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
854 {
855 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Geoff Langb5348332014-09-02 13:16:34 -0400856 gl::Error error = texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
857 if (error.isError())
858 {
859 context->recordError(error);
860 return;
861 }
Geoff Langbfdea662014-07-23 14:16:32 -0400862 }
863 break;
864
865 default:
Geoff Langb1196682014-07-23 13:47:29 -0400866 context->recordError(gl::Error(GL_INVALID_ENUM));
867 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400868 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000869 }
870}
871
Kenneth Russell67ea1902014-10-06 16:44:50 -0700872void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000873{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000874 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000875 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000876 target, level, internalformat, x, y, width, height, border);
877
Geoff Langbfdea662014-07-23 14:16:32 -0400878 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400879 if (context)
880 {
881 if (context->getClientVersion() < 3 &&
882 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
883 0, 0, x, y, width, height, border))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000884 {
Geoff Langbfdea662014-07-23 14:16:32 -0400885 return;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000886 }
Geoff Langbfdea662014-07-23 14:16:32 -0400887
888 if (context->getClientVersion() >= 3 &&
889 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
890 0, 0, 0, x, y, width, height, border))
891 {
892 return;
893 }
894
895 gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
896
897 switch (target)
898 {
899 case GL_TEXTURE_2D:
900 {
901 gl::Texture2D *texture = context->getTexture2D();
Geoff Langef7b0162014-09-04 13:29:23 -0400902 gl::Error error = texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
903 if (error.isError())
904 {
905 context->recordError(error);
906 return;
907 }
Geoff Langbfdea662014-07-23 14:16:32 -0400908 }
909 break;
910
911 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
912 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
913 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
914 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
915 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
916 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
917 {
918 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Geoff Langef7b0162014-09-04 13:29:23 -0400919 gl::Error error = texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
920 if (error.isError())
921 {
922 context->recordError(error);
923 return;
924 }
Geoff Langbfdea662014-07-23 14:16:32 -0400925 }
926 break;
927
Geoff Langb1196682014-07-23 13:47:29 -0400928 default:
929 context->recordError(gl::Error(GL_INVALID_ENUM));
930 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400931 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000932 }
933}
934
Kenneth Russell67ea1902014-10-06 16:44:50 -0700935void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000936{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000937 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000938 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000939 target, level, xoffset, yoffset, x, y, width, height);
940
Geoff Langbfdea662014-07-23 14:16:32 -0400941 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -0400942 if (context)
943 {
944 if (context->getClientVersion() < 3 &&
945 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
946 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000947 {
Geoff Langbfdea662014-07-23 14:16:32 -0400948 return;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000949 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000950
Geoff Langbfdea662014-07-23 14:16:32 -0400951 if (context->getClientVersion() >= 3 &&
952 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
953 xoffset, yoffset, 0, x, y, width, height, 0))
954 {
955 return;
956 }
957
958 gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
959
960 switch (target)
961 {
962 case GL_TEXTURE_2D:
963 {
964 gl::Texture2D *texture = context->getTexture2D();
Geoff Langef7b0162014-09-04 13:29:23 -0400965 gl::Error error = texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
966 if (error.isError())
967 {
968 context->recordError(error);
969 return;
970 }
Geoff Langbfdea662014-07-23 14:16:32 -0400971 }
972 break;
973
974 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
975 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
976 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
977 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
978 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
979 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
980 {
981 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Geoff Langef7b0162014-09-04 13:29:23 -0400982 gl::Error error = texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
983 if (error.isError())
984 {
985 context->recordError(error);
986 return;
987 }
Geoff Langbfdea662014-07-23 14:16:32 -0400988 }
989 break;
990
991 default:
Geoff Langb1196682014-07-23 13:47:29 -0400992 context->recordError(gl::Error(GL_INVALID_ENUM));
993 return;
Geoff Langbfdea662014-07-23 14:16:32 -0400994 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000995 }
996}
997
Kenneth Russell67ea1902014-10-06 16:44:50 -0700998GLuint GL_APIENTRY glCreateProgram(void)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000999{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001000 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001001
Geoff Langbfdea662014-07-23 14:16:32 -04001002 gl::Context *context = gl::getNonLostContext();
1003 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001004 {
Geoff Langbfdea662014-07-23 14:16:32 -04001005 return context->createProgram();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001006 }
1007
1008 return 0;
1009}
1010
Kenneth Russell67ea1902014-10-06 16:44:50 -07001011GLuint GL_APIENTRY glCreateShader(GLenum type)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001012{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001013 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001014
Geoff Langbfdea662014-07-23 14:16:32 -04001015 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001016 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001017 {
Geoff Langbfdea662014-07-23 14:16:32 -04001018 switch (type)
1019 {
1020 case GL_FRAGMENT_SHADER:
1021 case GL_VERTEX_SHADER:
1022 return context->createShader(type);
Geoff Langb1196682014-07-23 13:47:29 -04001023
Geoff Langbfdea662014-07-23 14:16:32 -04001024 default:
Geoff Langb1196682014-07-23 13:47:29 -04001025 context->recordError(gl::Error(GL_INVALID_ENUM));
1026 return 0;
Geoff Langbfdea662014-07-23 14:16:32 -04001027 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001028 }
1029
1030 return 0;
1031}
1032
Kenneth Russell67ea1902014-10-06 16:44:50 -07001033void GL_APIENTRY glCullFace(GLenum mode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001034{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001035 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001036
Geoff Langb1196682014-07-23 13:47:29 -04001037 gl::Context *context = gl::getNonLostContext();
1038 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001039 {
Geoff Langb1196682014-07-23 13:47:29 -04001040 switch (mode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001041 {
Geoff Langb1196682014-07-23 13:47:29 -04001042 case GL_FRONT:
1043 case GL_BACK:
1044 case GL_FRONT_AND_BACK:
1045 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001046
Geoff Langb1196682014-07-23 13:47:29 -04001047 default:
1048 context->recordError(gl::Error(GL_INVALID_ENUM));
1049 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001050 }
Geoff Langb1196682014-07-23 13:47:29 -04001051
1052 context->getState().setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001053 }
1054}
1055
Kenneth Russell67ea1902014-10-06 16:44:50 -07001056void GL_APIENTRY glDeleteBuffers(GLsizei n, const GLuint* buffers)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001057{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001058 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001059
Geoff Langbfdea662014-07-23 14:16:32 -04001060 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001061 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001062 {
Geoff Langb1196682014-07-23 13:47:29 -04001063 if (n < 0)
1064 {
1065 context->recordError(gl::Error(GL_INVALID_VALUE));
1066 return;
1067 }
1068
Geoff Langbfdea662014-07-23 14:16:32 -04001069 for (int i = 0; i < n; i++)
1070 {
1071 context->deleteBuffer(buffers[i]);
1072 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001073 }
1074}
1075
Kenneth Russell67ea1902014-10-06 16:44:50 -07001076void GL_APIENTRY glDeleteFencesNV(GLsizei n, const GLuint* fences)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001077{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001078 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001079
Geoff Langbfdea662014-07-23 14:16:32 -04001080 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001081 if (context)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001082 {
Geoff Langb1196682014-07-23 13:47:29 -04001083 if (n < 0)
1084 {
1085 context->recordError(gl::Error(GL_INVALID_VALUE));
1086 return;
1087 }
1088
Geoff Langbfdea662014-07-23 14:16:32 -04001089 for (int i = 0; i < n; i++)
1090 {
1091 context->deleteFenceNV(fences[i]);
1092 }
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001093 }
1094}
1095
Kenneth Russell67ea1902014-10-06 16:44:50 -07001096void GL_APIENTRY glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001097{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001098 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001099
Geoff Langbfdea662014-07-23 14:16:32 -04001100 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001101 if (context)
1102 {
Geoff Langb1196682014-07-23 13:47:29 -04001103 if (n < 0)
1104 {
1105 context->recordError(gl::Error(GL_INVALID_VALUE));
1106 return;
1107 }
1108
Geoff Langbfdea662014-07-23 14:16:32 -04001109 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001110 {
Geoff Langbfdea662014-07-23 14:16:32 -04001111 if (framebuffers[i] != 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001112 {
Geoff Langbfdea662014-07-23 14:16:32 -04001113 context->deleteFramebuffer(framebuffers[i]);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001114 }
1115 }
1116 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001117}
1118
Kenneth Russell67ea1902014-10-06 16:44:50 -07001119void GL_APIENTRY glDeleteProgram(GLuint program)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001120{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001121 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001122
Geoff Langbfdea662014-07-23 14:16:32 -04001123 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001124 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001125 {
Geoff Langb1196682014-07-23 13:47:29 -04001126 if (program == 0)
1127 {
1128 return;
1129 }
1130
Geoff Langbfdea662014-07-23 14:16:32 -04001131 if (!context->getProgram(program))
1132 {
1133 if(context->getShader(program))
1134 {
Geoff Langb1196682014-07-23 13:47:29 -04001135 context->recordError(gl::Error(GL_INVALID_OPERATION));
1136 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001137 }
1138 else
1139 {
Geoff Langb1196682014-07-23 13:47:29 -04001140 context->recordError(gl::Error(GL_INVALID_VALUE));
1141 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001142 }
1143 }
1144
1145 context->deleteProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001146 }
1147}
1148
Kenneth Russell67ea1902014-10-06 16:44:50 -07001149void GL_APIENTRY glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001150{
1151 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1152
Geoff Langbfdea662014-07-23 14:16:32 -04001153 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001154 if (context)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001155 {
Geoff Langb1196682014-07-23 13:47:29 -04001156 if (n < 0)
1157 {
1158 context->recordError(gl::Error(GL_INVALID_VALUE));
1159 return;
1160 }
1161
Geoff Langbfdea662014-07-23 14:16:32 -04001162 for (int i = 0; i < n; i++)
1163 {
1164 context->deleteQuery(ids[i]);
1165 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001166 }
1167}
1168
Kenneth Russell67ea1902014-10-06 16:44:50 -07001169void GL_APIENTRY glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001170{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001171 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001172
Geoff Langbfdea662014-07-23 14:16:32 -04001173 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001174 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001175 {
Geoff Langb1196682014-07-23 13:47:29 -04001176 if (n < 0)
1177 {
1178 context->recordError(gl::Error(GL_INVALID_VALUE));
1179 return;
1180 }
1181
Geoff Langbfdea662014-07-23 14:16:32 -04001182 for (int i = 0; i < n; i++)
1183 {
1184 context->deleteRenderbuffer(renderbuffers[i]);
1185 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001186 }
1187}
1188
Kenneth Russell67ea1902014-10-06 16:44:50 -07001189void GL_APIENTRY glDeleteShader(GLuint shader)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001190{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001191 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001192
Geoff Langbfdea662014-07-23 14:16:32 -04001193 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001194 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001195 {
Geoff Langb1196682014-07-23 13:47:29 -04001196 if (shader == 0)
1197 {
1198 return;
1199 }
1200
Geoff Langbfdea662014-07-23 14:16:32 -04001201 if (!context->getShader(shader))
1202 {
1203 if(context->getProgram(shader))
1204 {
Geoff Langb1196682014-07-23 13:47:29 -04001205 context->recordError(gl::Error(GL_INVALID_OPERATION));
1206 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001207 }
1208 else
1209 {
Geoff Langb1196682014-07-23 13:47:29 -04001210 context->recordError(gl::Error(GL_INVALID_VALUE));
1211 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001212 }
1213 }
1214
1215 context->deleteShader(shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001216 }
1217}
1218
Kenneth Russell67ea1902014-10-06 16:44:50 -07001219void GL_APIENTRY glDeleteTextures(GLsizei n, const GLuint* textures)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001220{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001221 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001222
Geoff Langbfdea662014-07-23 14:16:32 -04001223 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001224 if (context)
1225 {
Geoff Langb1196682014-07-23 13:47:29 -04001226 if (n < 0)
1227 {
1228 context->recordError(gl::Error(GL_INVALID_VALUE));
1229 return;
1230 }
1231
Geoff Langbfdea662014-07-23 14:16:32 -04001232 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001233 {
Geoff Langbfdea662014-07-23 14:16:32 -04001234 if (textures[i] != 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001235 {
Geoff Langbfdea662014-07-23 14:16:32 -04001236 context->deleteTexture(textures[i]);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001237 }
1238 }
1239 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001240}
1241
Kenneth Russell67ea1902014-10-06 16:44:50 -07001242void GL_APIENTRY glDepthFunc(GLenum func)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001243{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001244 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001245
Geoff Langbfdea662014-07-23 14:16:32 -04001246 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001247 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001248 {
Geoff Langb1196682014-07-23 13:47:29 -04001249 switch (func)
1250 {
1251 case GL_NEVER:
1252 case GL_ALWAYS:
1253 case GL_LESS:
1254 case GL_LEQUAL:
1255 case GL_EQUAL:
1256 case GL_GREATER:
1257 case GL_GEQUAL:
1258 case GL_NOTEQUAL:
1259 context->getState().setDepthFunc(func);
1260 break;
1261
1262 default:
1263 context->recordError(gl::Error(GL_INVALID_ENUM));
1264 return;
1265 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001266 }
1267}
1268
Kenneth Russell67ea1902014-10-06 16:44:50 -07001269void GL_APIENTRY glDepthMask(GLboolean flag)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001270{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001271 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001272
Geoff Langbfdea662014-07-23 14:16:32 -04001273 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001274 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001275 {
Geoff Langbfdea662014-07-23 14:16:32 -04001276 context->getState().setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001277 }
1278}
1279
Kenneth Russell67ea1902014-10-06 16:44:50 -07001280void GL_APIENTRY glDepthRangef(GLclampf zNear, GLclampf zFar)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001281{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001282 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001283
Geoff Langbfdea662014-07-23 14:16:32 -04001284 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001285 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001286 {
Geoff Langbfdea662014-07-23 14:16:32 -04001287 context->getState().setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001288 }
1289}
1290
Kenneth Russell67ea1902014-10-06 16:44:50 -07001291void GL_APIENTRY glDetachShader(GLuint program, GLuint shader)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001292{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001293 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001294
Geoff Langbfdea662014-07-23 14:16:32 -04001295 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001296 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001297 {
Geoff Langbfdea662014-07-23 14:16:32 -04001298 gl::Program *programObject = context->getProgram(program);
1299 gl::Shader *shaderObject = context->getShader(shader);
1300
1301 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001302 {
Geoff Langbfdea662014-07-23 14:16:32 -04001303 gl::Shader *shaderByProgramHandle;
1304 shaderByProgramHandle = context->getShader(program);
1305 if (!shaderByProgramHandle)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001306 {
Geoff Langb1196682014-07-23 13:47:29 -04001307 context->recordError(gl::Error(GL_INVALID_VALUE));
1308 return;
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001309 }
Geoff Langbfdea662014-07-23 14:16:32 -04001310 else
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001311 {
Geoff Langb1196682014-07-23 13:47:29 -04001312 context->recordError(gl::Error(GL_INVALID_OPERATION));
1313 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001314 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001315 }
Geoff Langbfdea662014-07-23 14:16:32 -04001316
1317 if (!shaderObject)
1318 {
1319 gl::Program *programByShaderHandle = context->getProgram(shader);
1320 if (!programByShaderHandle)
1321 {
Geoff Langb1196682014-07-23 13:47:29 -04001322 context->recordError(gl::Error(GL_INVALID_VALUE));
1323 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001324 }
1325 else
1326 {
Geoff Langb1196682014-07-23 13:47:29 -04001327 context->recordError(gl::Error(GL_INVALID_OPERATION));
1328 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001329 }
1330 }
1331
1332 if (!programObject->detachShader(shaderObject))
1333 {
Geoff Langb1196682014-07-23 13:47:29 -04001334 context->recordError(gl::Error(GL_INVALID_OPERATION));
1335 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001336 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001337 }
1338}
1339
Kenneth Russell67ea1902014-10-06 16:44:50 -07001340void GL_APIENTRY glDisable(GLenum cap)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001342 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001343
Geoff Langbfdea662014-07-23 14:16:32 -04001344 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001345 if (context)
1346 {
1347 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001348 {
Geoff Langb1196682014-07-23 13:47:29 -04001349 context->recordError(gl::Error(GL_INVALID_ENUM));
1350 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001351 }
Geoff Langbfdea662014-07-23 14:16:32 -04001352
1353 context->getState().setEnableFeature(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001354 }
1355}
1356
Kenneth Russell67ea1902014-10-06 16:44:50 -07001357void GL_APIENTRY glDisableVertexAttribArray(GLuint index)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001358{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001359 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001360
Geoff Langbfdea662014-07-23 14:16:32 -04001361 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001362 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001363 {
Geoff Langb1196682014-07-23 13:47:29 -04001364 if (index >= gl::MAX_VERTEX_ATTRIBS)
1365 {
1366 context->recordError(gl::Error(GL_INVALID_VALUE));
1367 return;
1368 }
1369
Geoff Langbfdea662014-07-23 14:16:32 -04001370 context->getState().setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001371 }
1372}
1373
Kenneth Russell67ea1902014-10-06 16:44:50 -07001374void GL_APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001376 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001377
Geoff Langbfdea662014-07-23 14:16:32 -04001378 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001379 if (context)
1380 {
Jamie Madill2b976812014-08-25 15:47:49 -04001381 if (!ValidateDrawArrays(context, mode, first, count, 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001382 {
Geoff Langbfdea662014-07-23 14:16:32 -04001383 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001384 }
Geoff Langbfdea662014-07-23 14:16:32 -04001385
Geoff Langc77e8c32014-09-08 16:28:24 -04001386 gl::Error error = context->drawArrays(mode, first, count, 0);
1387 if (error.isError())
1388 {
1389 context->recordError(error);
1390 return;
1391 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001392 }
1393}
1394
Kenneth Russell67ea1902014-10-06 16:44:50 -07001395void GL_APIENTRY glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001396{
1397 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1398
Geoff Langbfdea662014-07-23 14:16:32 -04001399 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001400 if (context)
1401 {
Geoff Lang87a93302014-09-16 13:29:43 -04001402 if (!ValidateDrawArraysInstancedANGLE(context, mode, first, count, primcount))
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001403 {
Geoff Langbfdea662014-07-23 14:16:32 -04001404 return;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001405 }
Geoff Langbfdea662014-07-23 14:16:32 -04001406
Geoff Langc77e8c32014-09-08 16:28:24 -04001407 gl::Error error = context->drawArrays(mode, first, count, primcount);
1408 if (error.isError())
1409 {
1410 context->recordError(error);
1411 return;
1412 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001413 }
1414}
1415
Kenneth Russell67ea1902014-10-06 16:44:50 -07001416void GL_APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001417{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001418 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 +00001419 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001420
Geoff Langbfdea662014-07-23 14:16:32 -04001421 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001422 if (context)
1423 {
Jamie Madill2b976812014-08-25 15:47:49 -04001424 rx::RangeUI indexRange;
1425 if (!ValidateDrawElements(context, mode, count, type, indices, 0, &indexRange))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001426 {
Geoff Langbfdea662014-07-23 14:16:32 -04001427 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001428 }
Geoff Langbfdea662014-07-23 14:16:32 -04001429
Geoff Langc77e8c32014-09-08 16:28:24 -04001430 gl::Error error = context->drawElements(mode, count, type, indices, 0, indexRange);
1431 if (error.isError())
1432 {
1433 context->recordError(error);
1434 return;
1435 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001436 }
1437}
1438
Kenneth Russell67ea1902014-10-06 16:44:50 -07001439void GL_APIENTRY glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001440{
1441 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1442 mode, count, type, indices, primcount);
1443
Geoff Langbfdea662014-07-23 14:16:32 -04001444 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001445 if (context)
1446 {
Jamie Madill2b976812014-08-25 15:47:49 -04001447 rx::RangeUI indexRange;
Geoff Lang87a93302014-09-16 13:29:43 -04001448 if (!ValidateDrawElementsInstancedANGLE(context, mode, count, type, indices, primcount, &indexRange))
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001449 {
Geoff Langbfdea662014-07-23 14:16:32 -04001450 return;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001451 }
Geoff Langbfdea662014-07-23 14:16:32 -04001452
Geoff Langc77e8c32014-09-08 16:28:24 -04001453 gl::Error error = context->drawElements(mode, count, type, indices, primcount, indexRange);
1454 if (error.isError())
1455 {
1456 context->recordError(error);
1457 return;
1458 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001459 }
1460}
1461
Kenneth Russell67ea1902014-10-06 16:44:50 -07001462void GL_APIENTRY glEnable(GLenum cap)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001463{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001464 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001465
Geoff Langbfdea662014-07-23 14:16:32 -04001466 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001467 if (context)
1468 {
1469 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001470 {
Geoff Langb1196682014-07-23 13:47:29 -04001471 context->recordError(gl::Error(GL_INVALID_ENUM));
1472 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001473 }
Geoff Langbfdea662014-07-23 14:16:32 -04001474
1475 context->getState().setEnableFeature(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001476 }
1477}
1478
Kenneth Russell67ea1902014-10-06 16:44:50 -07001479void GL_APIENTRY glEnableVertexAttribArray(GLuint index)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001480{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001481 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001482
Geoff Langbfdea662014-07-23 14:16:32 -04001483 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001484 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001485 {
Geoff Langb1196682014-07-23 13:47:29 -04001486 if (index >= gl::MAX_VERTEX_ATTRIBS)
1487 {
1488 context->recordError(gl::Error(GL_INVALID_VALUE));
1489 return;
1490 }
1491
Geoff Langbfdea662014-07-23 14:16:32 -04001492 context->getState().setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001493 }
1494}
1495
Kenneth Russell67ea1902014-10-06 16:44:50 -07001496void GL_APIENTRY glEndQueryEXT(GLenum target)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001497{
1498 EVENT("GLenum target = 0x%X)", target);
1499
Geoff Langbfdea662014-07-23 14:16:32 -04001500 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001501 if (context)
1502 {
1503 if (!ValidateEndQuery(context, target))
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001504 {
Geoff Langbfdea662014-07-23 14:16:32 -04001505 return;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001506 }
Geoff Langbfdea662014-07-23 14:16:32 -04001507
Geoff Lang5aad9672014-09-08 11:10:42 -04001508 gl::Error error = context->endQuery(target);
1509 if (error.isError())
1510 {
1511 context->recordError(error);
1512 return;
1513 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001514 }
1515}
1516
Kenneth Russell67ea1902014-10-06 16:44:50 -07001517void GL_APIENTRY glFinishFenceNV(GLuint fence)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001518{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001519 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001520
Geoff Langbfdea662014-07-23 14:16:32 -04001521 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001522 if (context)
1523 {
1524 gl::FenceNV *fenceObject = context->getFenceNV(fence);
1525
1526 if (fenceObject == NULL)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001527 {
Geoff Langb1196682014-07-23 13:47:29 -04001528 context->recordError(gl::Error(GL_INVALID_OPERATION));
1529 return;
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001530 }
Geoff Langbfdea662014-07-23 14:16:32 -04001531
1532 if (fenceObject->isFence() != GL_TRUE)
1533 {
Geoff Langb1196682014-07-23 13:47:29 -04001534 context->recordError(gl::Error(GL_INVALID_OPERATION));
1535 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001536 }
1537
1538 fenceObject->finishFence();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001539 }
1540}
1541
Kenneth Russell67ea1902014-10-06 16:44:50 -07001542void GL_APIENTRY glFinish(void)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001543{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001544 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001545
Geoff Langbfdea662014-07-23 14:16:32 -04001546 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001547 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001548 {
Geoff Lang26298562014-10-01 10:49:03 -04001549 gl::Error error = context->sync(true);
1550 if (error.isError())
1551 {
1552 context->recordError(error);
1553 return;
1554 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001555 }
1556}
1557
Kenneth Russell67ea1902014-10-06 16:44:50 -07001558void GL_APIENTRY glFlush(void)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001559{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001560 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001561
Geoff Langbfdea662014-07-23 14:16:32 -04001562 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001563 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001564 {
Geoff Lang26298562014-10-01 10:49:03 -04001565 gl::Error error = context->sync(false);
1566 if (error.isError())
1567 {
1568 context->recordError(error);
1569 return;
1570 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001571 }
1572}
1573
Kenneth Russell67ea1902014-10-06 16:44:50 -07001574void GL_APIENTRY glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001575{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001576 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001577 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001578
Geoff Langbfdea662014-07-23 14:16:32 -04001579 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001580 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001581 {
Geoff Langb1196682014-07-23 13:47:29 -04001582 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
1583 {
1584 context->recordError(gl::Error(GL_INVALID_ENUM));
1585 return;
1586 }
1587
Geoff Langbfdea662014-07-23 14:16:32 -04001588 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
1589 {
1590 return;
1591 }
1592
1593 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
1594 ASSERT(framebuffer);
1595
1596 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
1597 {
1598 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
1599 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
1600 }
1601 else
1602 {
1603 switch (attachment)
1604 {
1605 case GL_DEPTH_ATTACHMENT:
1606 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1607 break;
1608 case GL_STENCIL_ATTACHMENT:
1609 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1610 break;
1611 case GL_DEPTH_STENCIL_ATTACHMENT:
1612 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1613 break;
1614 default:
1615 UNREACHABLE();
1616 break;
1617 }
1618 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001619 }
1620}
1621
Kenneth Russell67ea1902014-10-06 16:44:50 -07001622void GL_APIENTRY glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001623{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001624 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001625 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001626
Geoff Langbfdea662014-07-23 14:16:32 -04001627 gl::Context *context = gl::getNonLostContext();
1628 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001629 {
Geoff Langbfdea662014-07-23 14:16:32 -04001630 if (!ValidateFramebufferTexture2D(context, target, attachment, textarget, texture, level))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001631 {
Geoff Langbfdea662014-07-23 14:16:32 -04001632 return;
1633 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001634
Geoff Langbfdea662014-07-23 14:16:32 -04001635 if (texture == 0)
1636 {
1637 textarget = GL_NONE;
1638 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001639
Geoff Langbfdea662014-07-23 14:16:32 -04001640 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001641
Geoff Langbfdea662014-07-23 14:16:32 -04001642 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
1643 {
1644 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
1645 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
1646 }
1647 else
1648 {
1649 switch (attachment)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001650 {
Geoff Langbfdea662014-07-23 14:16:32 -04001651 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
1652 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
1653 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001654 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001655 }
1656 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001657}
1658
Kenneth Russell67ea1902014-10-06 16:44:50 -07001659void GL_APIENTRY glFrontFace(GLenum mode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001660{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001661 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001662
Geoff Langb1196682014-07-23 13:47:29 -04001663 gl::Context *context = gl::getNonLostContext();
1664 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001665 {
Geoff Langb1196682014-07-23 13:47:29 -04001666 switch (mode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001667 {
Geoff Langb1196682014-07-23 13:47:29 -04001668 case GL_CW:
1669 case GL_CCW:
1670 context->getState().setFrontFace(mode);
1671 break;
1672 default:
1673 context->recordError(gl::Error(GL_INVALID_ENUM));
1674 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001675 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001676 }
1677}
1678
Kenneth Russell67ea1902014-10-06 16:44:50 -07001679void GL_APIENTRY glGenBuffers(GLsizei n, GLuint* buffers)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001680{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001681 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001682
Geoff Langbfdea662014-07-23 14:16:32 -04001683 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001684 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001685 {
Geoff Langb1196682014-07-23 13:47:29 -04001686 if (n < 0)
1687 {
1688 context->recordError(gl::Error(GL_INVALID_VALUE));
1689 return;
1690 }
1691
Geoff Langbfdea662014-07-23 14:16:32 -04001692 for (int i = 0; i < n; i++)
1693 {
1694 buffers[i] = context->createBuffer();
1695 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001696 }
1697}
1698
Kenneth Russell67ea1902014-10-06 16:44:50 -07001699void GL_APIENTRY glGenerateMipmap(GLenum target)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001700{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001701 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001702
Geoff Langbfdea662014-07-23 14:16:32 -04001703 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001704 if (context)
1705 {
1706 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001707 {
Geoff Langb1196682014-07-23 13:47:29 -04001708 context->recordError(gl::Error(GL_INVALID_ENUM));
1709 return;
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001710 }
Geoff Langbfdea662014-07-23 14:16:32 -04001711
1712 gl::Texture *texture = context->getTargetTexture(target);
1713
1714 if (texture == NULL)
1715 {
Geoff Langb1196682014-07-23 13:47:29 -04001716 context->recordError(gl::Error(GL_INVALID_OPERATION));
1717 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001718 }
1719
1720 GLenum internalFormat = texture->getBaseLevelInternalFormat();
1721 const gl::TextureCaps &formatCaps = context->getTextureCaps().get(internalFormat);
Geoff Lang5d601382014-07-22 15:14:06 -04001722 const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalFormat);
Geoff Langbfdea662014-07-23 14:16:32 -04001723
1724 // GenerateMipmap should not generate an INVALID_OPERATION for textures created with
1725 // unsized formats or that are color renderable and filterable. Since we do not track if
1726 // the texture was created with sized or unsized format (only sized formats are stored),
1727 // it is not possible to make sure the the LUMA formats can generate mipmaps (they should
1728 // be able to) because they aren't color renderable. Simply do a special case for LUMA
1729 // textures since they're the only texture format that can be created with unsized formats
1730 // that is not color renderable. New unsized formats are unlikely to be added, since ES2
1731 // was the last version to use add them.
1732 bool isLUMA = internalFormat == GL_LUMINANCE8_EXT ||
1733 internalFormat == GL_LUMINANCE8_ALPHA8_EXT ||
1734 internalFormat == GL_ALPHA8_EXT;
1735
Geoff Lang5d601382014-07-22 15:14:06 -04001736 if (formatInfo.depthBits > 0 || formatInfo.stencilBits > 0 || !formatCaps.filterable ||
1737 (!formatCaps.renderable && !isLUMA) || formatInfo.compressed)
Geoff Langbfdea662014-07-23 14:16:32 -04001738 {
Geoff Langb1196682014-07-23 13:47:29 -04001739 context->recordError(gl::Error(GL_INVALID_OPERATION));
1740 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001741 }
1742
1743 // GL_EXT_sRGB does not support mipmap generation on sRGB textures
Geoff Lang5d601382014-07-22 15:14:06 -04001744 if (context->getClientVersion() == 2 && formatInfo.colorEncoding == GL_SRGB)
Geoff Langbfdea662014-07-23 14:16:32 -04001745 {
Geoff Langb1196682014-07-23 13:47:29 -04001746 context->recordError(gl::Error(GL_INVALID_OPERATION));
1747 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001748 }
1749
1750 // Non-power of 2 ES2 check
1751 if (!context->getExtensions().textureNPOT && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
1752 {
1753 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
Geoff Langb1196682014-07-23 13:47:29 -04001754 context->recordError(gl::Error(GL_INVALID_OPERATION));
1755 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001756 }
1757
1758 // Cube completeness check
1759 if (target == GL_TEXTURE_CUBE_MAP)
1760 {
1761 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
1762 if (!textureCube->isCubeComplete())
1763 {
Geoff Langb1196682014-07-23 13:47:29 -04001764 context->recordError(gl::Error(GL_INVALID_OPERATION));
1765 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001766 }
1767 }
1768
1769 texture->generateMipmaps();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001770 }
1771}
1772
Kenneth Russell67ea1902014-10-06 16:44:50 -07001773void GL_APIENTRY glGenFencesNV(GLsizei n, GLuint* fences)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001774{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001775 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001776
Geoff Langbfdea662014-07-23 14:16:32 -04001777 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001778 if (context)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001779 {
Geoff Langb1196682014-07-23 13:47:29 -04001780 if (n < 0)
1781 {
1782 context->recordError(gl::Error(GL_INVALID_VALUE));
1783 return;
1784 }
1785
Geoff Langbfdea662014-07-23 14:16:32 -04001786 for (int i = 0; i < n; i++)
1787 {
1788 fences[i] = context->createFenceNV();
1789 }
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001790 }
1791}
1792
Kenneth Russell67ea1902014-10-06 16:44:50 -07001793void GL_APIENTRY glGenFramebuffers(GLsizei n, GLuint* framebuffers)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001794{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001795 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001796
Geoff Langbfdea662014-07-23 14:16:32 -04001797 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001798 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001799 {
Geoff Langb1196682014-07-23 13:47:29 -04001800 if (n < 0)
1801 {
1802 context->recordError(gl::Error(GL_INVALID_VALUE));
1803 return;
1804 }
1805
Geoff Langbfdea662014-07-23 14:16:32 -04001806 for (int i = 0; i < n; i++)
1807 {
1808 framebuffers[i] = context->createFramebuffer();
1809 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001810 }
1811}
1812
Kenneth Russell67ea1902014-10-06 16:44:50 -07001813void GL_APIENTRY glGenQueriesEXT(GLsizei n, GLuint* ids)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001814{
1815 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
1816
Geoff Langbfdea662014-07-23 14:16:32 -04001817 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001818 if (context)
1819 {
1820 if (n < 0)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001821 {
Geoff Langb1196682014-07-23 13:47:29 -04001822 context->recordError(gl::Error(GL_INVALID_VALUE));
1823 return;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001824 }
Geoff Langbfdea662014-07-23 14:16:32 -04001825
1826 for (GLsizei i = 0; i < n; i++)
1827 {
1828 ids[i] = context->createQuery();
1829 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001830 }
1831}
1832
Kenneth Russell67ea1902014-10-06 16:44:50 -07001833void GL_APIENTRY glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001835 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001836
Geoff Langbfdea662014-07-23 14:16:32 -04001837 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001838 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001839 {
Geoff Langb1196682014-07-23 13:47:29 -04001840 if (n < 0)
1841 {
1842 context->recordError(gl::Error(GL_INVALID_VALUE));
1843 return;
1844 }
1845
Geoff Langbfdea662014-07-23 14:16:32 -04001846 for (int i = 0; i < n; i++)
1847 {
1848 renderbuffers[i] = context->createRenderbuffer();
1849 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001850 }
1851}
1852
Kenneth Russell67ea1902014-10-06 16:44:50 -07001853void GL_APIENTRY glGenTextures(GLsizei n, GLuint* textures)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001854{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001855 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001856
Geoff Langbfdea662014-07-23 14:16:32 -04001857 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001858 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001859 {
Geoff Langb1196682014-07-23 13:47:29 -04001860 if (n < 0)
1861 {
1862 context->recordError(gl::Error(GL_INVALID_VALUE));
1863 return;
1864 }
1865
Geoff Langbfdea662014-07-23 14:16:32 -04001866 for (int i = 0; i < n; i++)
1867 {
1868 textures[i] = context->createTexture();
1869 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001870 }
1871}
1872
Kenneth Russell67ea1902014-10-06 16:44:50 -07001873void GL_APIENTRY glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001874{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001875 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00001876 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001877 program, index, bufsize, length, size, type, name);
1878
Geoff Langbfdea662014-07-23 14:16:32 -04001879 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001880 if (context)
1881 {
Geoff Langb1196682014-07-23 13:47:29 -04001882 if (bufsize < 0)
1883 {
1884 context->recordError(gl::Error(GL_INVALID_VALUE));
1885 return;
1886 }
1887
Geoff Langbfdea662014-07-23 14:16:32 -04001888 gl::Program *programObject = context->getProgram(program);
1889
1890 if (!programObject)
1891 {
1892 if (context->getShader(program))
1893 {
Geoff Langb1196682014-07-23 13:47:29 -04001894 context->recordError(gl::Error(GL_INVALID_OPERATION));
1895 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001896 }
1897 else
1898 {
Geoff Langb1196682014-07-23 13:47:29 -04001899 context->recordError(gl::Error(GL_INVALID_VALUE));
1900 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001901 }
1902 }
1903
1904 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001905 {
Geoff Langb1196682014-07-23 13:47:29 -04001906 context->recordError(gl::Error(GL_INVALID_VALUE));
1907 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001908 }
1909
Geoff Langbfdea662014-07-23 14:16:32 -04001910 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001911 }
1912}
1913
Kenneth Russell67ea1902014-10-06 16:44:50 -07001914void GL_APIENTRY glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001915{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001916 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001917 "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 +00001918 program, index, bufsize, length, size, type, name);
1919
Geoff Langbfdea662014-07-23 14:16:32 -04001920
1921 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001922 if (context)
1923 {
Geoff Langb1196682014-07-23 13:47:29 -04001924 if (bufsize < 0)
1925 {
1926 context->recordError(gl::Error(GL_INVALID_VALUE));
1927 return;
1928 }
1929
Geoff Langbfdea662014-07-23 14:16:32 -04001930 gl::Program *programObject = context->getProgram(program);
1931
1932 if (!programObject)
1933 {
1934 if (context->getShader(program))
1935 {
Geoff Langb1196682014-07-23 13:47:29 -04001936 context->recordError(gl::Error(GL_INVALID_OPERATION));
1937 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001938 }
1939 else
1940 {
Geoff Langb1196682014-07-23 13:47:29 -04001941 context->recordError(gl::Error(GL_INVALID_VALUE));
1942 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001943 }
1944 }
1945
1946 if (index >= (GLuint)programObject->getActiveUniformCount())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001947 {
Geoff Langb1196682014-07-23 13:47:29 -04001948 context->recordError(gl::Error(GL_INVALID_VALUE));
1949 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001950 }
1951
Geoff Langbfdea662014-07-23 14:16:32 -04001952 programObject->getActiveUniform(index, bufsize, length, size, type, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001953 }
1954}
1955
Kenneth Russell67ea1902014-10-06 16:44:50 -07001956void GL_APIENTRY glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001957{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001958 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 +00001959 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960
Geoff Langbfdea662014-07-23 14:16:32 -04001961 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001962 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001963 {
Geoff Langb1196682014-07-23 13:47:29 -04001964 if (maxcount < 0)
1965 {
1966 context->recordError(gl::Error(GL_INVALID_VALUE));
1967 return;
1968 }
1969
Geoff Langbfdea662014-07-23 14:16:32 -04001970 gl::Program *programObject = context->getProgram(program);
1971
1972 if (!programObject)
1973 {
1974 if (context->getShader(program))
1975 {
Geoff Langb1196682014-07-23 13:47:29 -04001976 context->recordError(gl::Error(GL_INVALID_OPERATION));
1977 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001978 }
1979 else
1980 {
Geoff Langb1196682014-07-23 13:47:29 -04001981 context->recordError(gl::Error(GL_INVALID_VALUE));
1982 return;
Geoff Langbfdea662014-07-23 14:16:32 -04001983 }
1984 }
1985
1986 return programObject->getAttachedShaders(maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001987 }
1988}
1989
Kenneth Russell67ea1902014-10-06 16:44:50 -07001990GLint GL_APIENTRY glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001991{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001992 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001993
Geoff Langbfdea662014-07-23 14:16:32 -04001994 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04001995 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001996 {
Geoff Langbfdea662014-07-23 14:16:32 -04001997 gl::Program *programObject = context->getProgram(program);
1998
1999 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002000 {
Geoff Langbfdea662014-07-23 14:16:32 -04002001 if (context->getShader(program))
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002002 {
Geoff Langb1196682014-07-23 13:47:29 -04002003 context->recordError(gl::Error(GL_INVALID_OPERATION));
2004 return -1;
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002005 }
Geoff Langbfdea662014-07-23 14:16:32 -04002006 else
2007 {
Geoff Langb1196682014-07-23 13:47:29 -04002008 context->recordError(gl::Error(GL_INVALID_VALUE));
2009 return -1;
Geoff Langbfdea662014-07-23 14:16:32 -04002010 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002011 }
Geoff Langbfdea662014-07-23 14:16:32 -04002012
2013 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
2014 if (!programObject->isLinked() || !programBinary)
2015 {
Geoff Langb1196682014-07-23 13:47:29 -04002016 context->recordError(gl::Error(GL_INVALID_OPERATION));
2017 return -1;
Geoff Langbfdea662014-07-23 14:16:32 -04002018 }
2019
2020 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002021 }
2022
2023 return -1;
2024}
2025
Kenneth Russell67ea1902014-10-06 16:44:50 -07002026void GL_APIENTRY glGetBooleanv(GLenum pname, GLboolean* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002027{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002028 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002029
Geoff Langbfdea662014-07-23 14:16:32 -04002030 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002031 if (context)
2032 {
2033 GLenum nativeType;
2034 unsigned int numParams = 0;
2035 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002036 {
Geoff Langbfdea662014-07-23 14:16:32 -04002037 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002038 }
Geoff Langbfdea662014-07-23 14:16:32 -04002039
2040 if (nativeType == GL_BOOL)
2041 {
2042 context->getBooleanv(pname, params);
2043 }
2044 else
2045 {
2046 CastStateValues(context, nativeType, pname, numParams, params);
2047 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002048 }
2049}
2050
Kenneth Russell67ea1902014-10-06 16:44:50 -07002051void GL_APIENTRY glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002052{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002053 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 +00002054
Geoff Langbfdea662014-07-23 14:16:32 -04002055 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002056 if (context)
2057 {
2058 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002059 {
Geoff Langb1196682014-07-23 13:47:29 -04002060 context->recordError(gl::Error(GL_INVALID_ENUM));
2061 return;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002062 }
Geoff Langbfdea662014-07-23 14:16:32 -04002063
2064 if (!gl::ValidBufferParameter(context, pname))
2065 {
Geoff Langb1196682014-07-23 13:47:29 -04002066 context->recordError(gl::Error(GL_INVALID_ENUM));
2067 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002068 }
2069
2070 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
2071
2072 if (!buffer)
2073 {
2074 // A null buffer means that "0" is bound to the requested buffer target
Geoff Langb1196682014-07-23 13:47:29 -04002075 context->recordError(gl::Error(GL_INVALID_OPERATION));
2076 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002077 }
2078
2079 switch (pname)
2080 {
2081 case GL_BUFFER_USAGE:
2082 *params = static_cast<GLint>(buffer->getUsage());
2083 break;
2084 case GL_BUFFER_SIZE:
2085 *params = gl::clampCast<GLint>(buffer->getSize());
2086 break;
2087 case GL_BUFFER_ACCESS_FLAGS:
2088 *params = buffer->getAccessFlags();
2089 break;
2090 case GL_BUFFER_MAPPED:
2091 *params = static_cast<GLint>(buffer->isMapped());
2092 break;
2093 case GL_BUFFER_MAP_OFFSET:
2094 *params = gl::clampCast<GLint>(buffer->getMapOffset());
2095 break;
2096 case GL_BUFFER_MAP_LENGTH:
2097 *params = gl::clampCast<GLint>(buffer->getMapLength());
2098 break;
2099 default: UNREACHABLE(); break;
2100 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002101 }
2102}
2103
Kenneth Russell67ea1902014-10-06 16:44:50 -07002104GLenum GL_APIENTRY glGetError(void)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002105{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002106 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002107
2108 gl::Context *context = gl::getContext();
2109
2110 if (context)
2111 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002112 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002113 }
2114
2115 return GL_NO_ERROR;
2116}
2117
Kenneth Russell67ea1902014-10-06 16:44:50 -07002118void GL_APIENTRY glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002119{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002120 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002121
Geoff Langbfdea662014-07-23 14:16:32 -04002122 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002123 if (context)
2124 {
2125 gl::FenceNV *fenceObject = context->getFenceNV(fence);
2126
2127 if (fenceObject == NULL)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002128 {
Geoff Langb1196682014-07-23 13:47:29 -04002129 context->recordError(gl::Error(GL_INVALID_OPERATION));
2130 return;
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002131 }
Geoff Langbfdea662014-07-23 14:16:32 -04002132
2133 if (fenceObject->isFence() != GL_TRUE)
2134 {
Geoff Langb1196682014-07-23 13:47:29 -04002135 context->recordError(gl::Error(GL_INVALID_OPERATION));
2136 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002137 }
2138
2139 switch (pname)
2140 {
2141 case GL_FENCE_STATUS_NV:
2142 case GL_FENCE_CONDITION_NV:
2143 break;
2144
Geoff Langb1196682014-07-23 13:47:29 -04002145 default:
2146 context->recordError(gl::Error(GL_INVALID_ENUM));
2147 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002148 }
2149
Geoff Lang882033e2014-09-30 11:26:07 -04002150 gl::Error error = fenceObject->getFencei(pname, params);
2151 if (error.isError())
2152 {
2153 context->recordError(error);
2154 return;
2155 }
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002156 }
2157}
2158
Kenneth Russell67ea1902014-10-06 16:44:50 -07002159void GL_APIENTRY glGetFloatv(GLenum pname, GLfloat* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002160{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002161 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002162
Geoff Langbfdea662014-07-23 14:16:32 -04002163 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002164 if (context)
2165 {
2166 GLenum nativeType;
2167 unsigned int numParams = 0;
2168 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002169 {
Geoff Langbfdea662014-07-23 14:16:32 -04002170 return;
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002171 }
Geoff Langbfdea662014-07-23 14:16:32 -04002172
2173 if (nativeType == GL_FLOAT)
2174 {
2175 context->getFloatv(pname, params);
2176 }
2177 else
2178 {
2179 CastStateValues(context, nativeType, pname, numParams, params);
2180 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002181 }
2182}
2183
Kenneth Russell67ea1902014-10-06 16:44:50 -07002184void GL_APIENTRY glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002185{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002186 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 +00002187 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002188
Geoff Langbfdea662014-07-23 14:16:32 -04002189 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002190 if (context)
2191 {
2192 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002193 {
Geoff Langb1196682014-07-23 13:47:29 -04002194 context->recordError(gl::Error(GL_INVALID_ENUM));
2195 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002196 }
2197
2198 int clientVersion = context->getClientVersion();
2199
2200 switch (pname)
2201 {
2202 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2203 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2204 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2205 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2206 break;
Geoff Langb1196682014-07-23 13:47:29 -04002207
Geoff Langbfdea662014-07-23 14:16:32 -04002208 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2209 if (clientVersion < 3 && !context->getExtensions().sRGB)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002210 {
Geoff Langb1196682014-07-23 13:47:29 -04002211 context->recordError(gl::Error(GL_INVALID_ENUM));
2212 return;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002213 }
Geoff Langbfdea662014-07-23 14:16:32 -04002214 break;
Geoff Langb1196682014-07-23 13:47:29 -04002215
Geoff Langbfdea662014-07-23 14:16:32 -04002216 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2217 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2218 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2219 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2220 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2221 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2222 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2223 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2224 if (clientVersion < 3)
2225 {
Geoff Langb1196682014-07-23 13:47:29 -04002226 context->recordError(gl::Error(GL_INVALID_ENUM));
2227 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002228 }
2229 break;
Geoff Langb1196682014-07-23 13:47:29 -04002230
Geoff Langbfdea662014-07-23 14:16:32 -04002231 default:
Geoff Langb1196682014-07-23 13:47:29 -04002232 context->recordError(gl::Error(GL_INVALID_ENUM));
2233 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002234 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002235
Geoff Langbfdea662014-07-23 14:16:32 -04002236 // Determine if the attachment is a valid enum
2237 switch (attachment)
2238 {
2239 case GL_BACK:
2240 case GL_FRONT:
2241 case GL_DEPTH:
2242 case GL_STENCIL:
2243 case GL_DEPTH_STENCIL_ATTACHMENT:
2244 if (clientVersion < 3)
2245 {
Geoff Langb1196682014-07-23 13:47:29 -04002246 context->recordError(gl::Error(GL_INVALID_ENUM));
2247 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002248 }
2249 break;
2250
2251 case GL_DEPTH_ATTACHMENT:
2252 case GL_STENCIL_ATTACHMENT:
2253 break;
2254
2255 default:
2256 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2257 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getCaps().maxColorAttachments)
2258 {
Geoff Langb1196682014-07-23 13:47:29 -04002259 context->recordError(gl::Error(GL_INVALID_ENUM));
2260 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002261 }
2262 break;
2263 }
2264
2265 GLuint framebufferHandle = context->getState().getTargetFramebuffer(target)->id();
2266 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2267
2268 if (framebufferHandle == 0)
2269 {
2270 if (clientVersion < 3)
2271 {
Geoff Langb1196682014-07-23 13:47:29 -04002272 context->recordError(gl::Error(GL_INVALID_OPERATION));
2273 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002274 }
2275
2276 switch (attachment)
2277 {
2278 case GL_BACK:
2279 case GL_DEPTH:
2280 case GL_STENCIL:
2281 break;
Geoff Langb1196682014-07-23 13:47:29 -04002282
Geoff Langbfdea662014-07-23 14:16:32 -04002283 default:
Geoff Langb1196682014-07-23 13:47:29 -04002284 context->recordError(gl::Error(GL_INVALID_OPERATION));
2285 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002286 }
2287 }
2288 else
2289 {
2290 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2291 {
2292 // Valid attachment query
2293 }
2294 else
2295 {
2296 switch (attachment)
2297 {
2298 case GL_DEPTH_ATTACHMENT:
2299 case GL_STENCIL_ATTACHMENT:
2300 break;
Geoff Langb1196682014-07-23 13:47:29 -04002301
Geoff Langbfdea662014-07-23 14:16:32 -04002302 case GL_DEPTH_STENCIL_ATTACHMENT:
2303 if (framebuffer->hasValidDepthStencil())
2304 {
Geoff Langb1196682014-07-23 13:47:29 -04002305 context->recordError(gl::Error(GL_INVALID_OPERATION));
2306 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002307 }
2308 break;
Geoff Langb1196682014-07-23 13:47:29 -04002309
Geoff Langbfdea662014-07-23 14:16:32 -04002310 default:
Geoff Langb1196682014-07-23 13:47:29 -04002311 context->recordError(gl::Error(GL_INVALID_OPERATION));
2312 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002313 }
2314 }
2315 }
2316
2317 GLenum attachmentType = GL_NONE;
2318 GLuint attachmentHandle = 0;
2319 GLuint attachmentLevel = 0;
2320 GLuint attachmentLayer = 0;
2321
2322 const gl::FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
2323
2324 if (attachmentObject)
2325 {
2326 attachmentType = attachmentObject->type();
2327 attachmentHandle = attachmentObject->id();
2328 attachmentLevel = attachmentObject->mipLevel();
2329 attachmentLayer = attachmentObject->layer();
2330 }
2331
2332 GLenum attachmentObjectType; // Type category
2333 if (framebufferHandle == 0)
2334 {
2335 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2336 }
2337 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
2338 {
2339 attachmentObjectType = attachmentType;
2340 }
2341 else if (gl::ValidTexture2DDestinationTarget(context, attachmentType))
2342 {
2343 attachmentObjectType = GL_TEXTURE;
2344 }
2345 else
2346 {
2347 UNREACHABLE();
2348 return;
2349 }
2350
2351 if (attachmentObjectType == GL_NONE)
2352 {
2353 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2354 // is NONE, then querying any other pname will generate INVALID_ENUM.
2355
2356 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2357 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2358 // INVALID_OPERATION for all other pnames
Jamie Madill1e3fa742014-06-16 10:34:00 -04002359
Geoff Lang646559f2013-08-15 11:08:15 -04002360 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002361 {
Geoff Lang646559f2013-08-15 11:08:15 -04002362 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
Geoff Langbfdea662014-07-23 14:16:32 -04002363 *params = attachmentObjectType;
2364 break;
2365
Geoff Lang646559f2013-08-15 11:08:15 -04002366 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
Geoff Lang05b05022014-06-11 15:31:45 -04002367 if (clientVersion < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002368 {
Geoff Langb1196682014-07-23 13:47:29 -04002369 context->recordError(gl::Error(GL_INVALID_ENUM));
2370 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002371 }
Geoff Langbfdea662014-07-23 14:16:32 -04002372 *params = 0;
Geoff Lang646559f2013-08-15 11:08:15 -04002373 break;
2374
2375 default:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002376 if (clientVersion < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002377 {
Geoff Langb1196682014-07-23 13:47:29 -04002378 context->recordError(gl::Error(GL_INVALID_ENUM));
2379 return;
Geoff Lang646559f2013-08-15 11:08:15 -04002380 }
2381 else
2382 {
Geoff Langb1196682014-07-23 13:47:29 -04002383 context->recordError(gl::Error(GL_INVALID_OPERATION));
2384 return;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002385 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002386 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002387 }
Geoff Langbfdea662014-07-23 14:16:32 -04002388 else
2389 {
2390 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2391 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2392 ASSERT(attachmentObject != NULL);
2393
2394 switch (pname)
2395 {
2396 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2397 *params = attachmentObjectType;
2398 break;
2399
2400 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2401 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2402 {
Geoff Langb1196682014-07-23 13:47:29 -04002403 context->recordError(gl::Error(GL_INVALID_ENUM));
2404 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002405 }
2406 *params = attachmentHandle;
2407 break;
2408
2409 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2410 if (attachmentObjectType != GL_TEXTURE)
2411 {
Geoff Langb1196682014-07-23 13:47:29 -04002412 context->recordError(gl::Error(GL_INVALID_ENUM));
2413 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002414 }
2415 *params = attachmentLevel;
2416 break;
2417
2418 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2419 if (attachmentObjectType != GL_TEXTURE)
2420 {
Geoff Langb1196682014-07-23 13:47:29 -04002421 context->recordError(gl::Error(GL_INVALID_ENUM));
2422 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002423 }
2424 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2425 break;
2426
2427 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2428 *params = attachmentObject->getRedSize();
2429 break;
2430
2431 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2432 *params = attachmentObject->getGreenSize();
2433 break;
2434
2435 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2436 *params = attachmentObject->getBlueSize();
2437 break;
2438
2439 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2440 *params = attachmentObject->getAlphaSize();
2441 break;
2442
2443 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2444 *params = attachmentObject->getDepthSize();
2445 break;
2446
2447 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2448 *params = attachmentObject->getStencilSize();
2449 break;
2450
2451 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
Jamie Madillee85d1b2014-09-17 10:35:23 -04002452 if (attachment == GL_DEPTH_STENCIL_ATTACHMENT)
Geoff Langbfdea662014-07-23 14:16:32 -04002453 {
Geoff Langb1196682014-07-23 13:47:29 -04002454 context->recordError(gl::Error(GL_INVALID_OPERATION));
2455 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002456 }
2457 *params = attachmentObject->getComponentType();
2458 break;
2459
2460 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2461 *params = attachmentObject->getColorEncoding();
2462 break;
2463
2464 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2465 if (attachmentObjectType != GL_TEXTURE)
2466 {
Geoff Langb1196682014-07-23 13:47:29 -04002467 context->recordError(gl::Error(GL_INVALID_ENUM));
2468 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002469 }
2470 *params = attachmentLayer;
2471 break;
2472
2473 default:
2474 UNREACHABLE();
2475 break;
2476 }
2477 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002478 }
2479}
2480
Kenneth Russell67ea1902014-10-06 16:44:50 -07002481GLenum GL_APIENTRY glGetGraphicsResetStatusEXT(void)
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002482{
2483 EVENT("()");
2484
Geoff Langbfdea662014-07-23 14:16:32 -04002485 gl::Context *context = gl::getContext();
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002486
Geoff Langbfdea662014-07-23 14:16:32 -04002487 if (context)
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002488 {
Geoff Langbfdea662014-07-23 14:16:32 -04002489 return context->getResetStatus();
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002490 }
Geoff Langbfdea662014-07-23 14:16:32 -04002491
2492 return GL_NO_ERROR;
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002493}
2494
Kenneth Russell67ea1902014-10-06 16:44:50 -07002495void GL_APIENTRY glGetIntegerv(GLenum pname, GLint* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002497 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002498
Geoff Langbfdea662014-07-23 14:16:32 -04002499 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002500 if (context)
2501 {
2502 GLenum nativeType;
2503 unsigned int numParams = 0;
2504
2505 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002506 {
Geoff Langbfdea662014-07-23 14:16:32 -04002507 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002508 }
Geoff Langbfdea662014-07-23 14:16:32 -04002509
2510 if (nativeType == GL_INT)
2511 {
2512 context->getIntegerv(pname, params);
2513 }
2514 else
2515 {
2516 CastStateValues(context, nativeType, pname, numParams, params);
2517 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002518 }
2519}
2520
Kenneth Russell67ea1902014-10-06 16:44:50 -07002521void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002522{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002523 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002524
Geoff Langbfdea662014-07-23 14:16:32 -04002525 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002526 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002527 {
Geoff Langbfdea662014-07-23 14:16:32 -04002528 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002529
Geoff Langbfdea662014-07-23 14:16:32 -04002530 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002531 {
Geoff Langb1196682014-07-23 13:47:29 -04002532 context->recordError(gl::Error(GL_INVALID_VALUE));
2533 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002534 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535
Geoff Langbfdea662014-07-23 14:16:32 -04002536 if (context->getClientVersion() < 3)
2537 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002538 switch (pname)
2539 {
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002540 case GL_ACTIVE_UNIFORM_BLOCKS:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002541 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002542 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002543 case GL_TRANSFORM_FEEDBACK_VARYINGS:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002544 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
Geoff Langb1196682014-07-23 13:47:29 -04002545 context->recordError(gl::Error(GL_INVALID_ENUM));
2546 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002547 }
2548 }
Geoff Langbfdea662014-07-23 14:16:32 -04002549
2550 switch (pname)
2551 {
2552 case GL_DELETE_STATUS:
2553 *params = programObject->isFlaggedForDeletion();
2554 return;
2555 case GL_LINK_STATUS:
2556 *params = programObject->isLinked();
2557 return;
2558 case GL_VALIDATE_STATUS:
2559 *params = programObject->isValidated();
2560 return;
2561 case GL_INFO_LOG_LENGTH:
2562 *params = programObject->getInfoLogLength();
2563 return;
2564 case GL_ATTACHED_SHADERS:
2565 *params = programObject->getAttachedShadersCount();
2566 return;
2567 case GL_ACTIVE_ATTRIBUTES:
2568 *params = programObject->getActiveAttributeCount();
2569 return;
2570 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
2571 *params = programObject->getActiveAttributeMaxLength();
2572 return;
2573 case GL_ACTIVE_UNIFORMS:
2574 *params = programObject->getActiveUniformCount();
2575 return;
2576 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
2577 *params = programObject->getActiveUniformMaxLength();
2578 return;
2579 case GL_PROGRAM_BINARY_LENGTH_OES:
2580 *params = programObject->getProgramBinaryLength();
2581 return;
2582 case GL_ACTIVE_UNIFORM_BLOCKS:
2583 *params = programObject->getActiveUniformBlockCount();
2584 return;
2585 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
2586 *params = programObject->getActiveUniformBlockMaxLength();
2587 break;
2588 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2589 *params = programObject->getTransformFeedbackBufferMode();
2590 break;
2591 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2592 *params = programObject->getTransformFeedbackVaryingCount();
2593 break;
2594 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
2595 *params = programObject->getTransformFeedbackVaryingMaxLength();
2596 break;
Geoff Langb1196682014-07-23 13:47:29 -04002597
Geoff Langbfdea662014-07-23 14:16:32 -04002598 default:
Geoff Langb1196682014-07-23 13:47:29 -04002599 context->recordError(gl::Error(GL_INVALID_ENUM));
2600 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002601 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002602 }
2603}
2604
Kenneth Russell67ea1902014-10-06 16:44:50 -07002605void GL_APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002606{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002607 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 +00002608 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002609
Geoff Langbfdea662014-07-23 14:16:32 -04002610 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002611 if (context)
2612 {
Geoff Langb1196682014-07-23 13:47:29 -04002613 if (bufsize < 0)
2614 {
2615 context->recordError(gl::Error(GL_INVALID_VALUE));
2616 return;
2617 }
2618
Geoff Langbfdea662014-07-23 14:16:32 -04002619 gl::Program *programObject = context->getProgram(program);
2620
2621 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002622 {
Geoff Langb1196682014-07-23 13:47:29 -04002623 context->recordError(gl::Error(GL_INVALID_VALUE));
2624 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002625 }
2626
Geoff Langbfdea662014-07-23 14:16:32 -04002627 programObject->getInfoLog(bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002628 }
2629}
2630
Kenneth Russell67ea1902014-10-06 16:44:50 -07002631void GL_APIENTRY glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002632{
2633 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
2634
Geoff Langbfdea662014-07-23 14:16:32 -04002635 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002636 if (context)
2637 {
2638 if (!ValidQueryType(context, target))
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002639 {
Geoff Langb1196682014-07-23 13:47:29 -04002640 context->recordError(gl::Error(GL_INVALID_ENUM));
2641 return;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002642 }
Geoff Langbfdea662014-07-23 14:16:32 -04002643
2644 switch (pname)
2645 {
2646 case GL_CURRENT_QUERY_EXT:
2647 params[0] = context->getState().getActiveQueryId(target);
2648 break;
2649
2650 default:
Geoff Langb1196682014-07-23 13:47:29 -04002651 context->recordError(gl::Error(GL_INVALID_ENUM));
2652 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002653 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002654 }
2655}
2656
Kenneth Russell67ea1902014-10-06 16:44:50 -07002657void GL_APIENTRY glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002658{
2659 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
2660
Geoff Langbfdea662014-07-23 14:16:32 -04002661 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002662 if (context)
2663 {
2664 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
2665
2666 if (!queryObject)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002667 {
Geoff Langb1196682014-07-23 13:47:29 -04002668 context->recordError(gl::Error(GL_INVALID_OPERATION));
2669 return;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002670 }
Geoff Langbfdea662014-07-23 14:16:32 -04002671
2672 if (context->getState().getActiveQueryId(queryObject->getType()) == id)
2673 {
Geoff Langb1196682014-07-23 13:47:29 -04002674 context->recordError(gl::Error(GL_INVALID_OPERATION));
2675 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002676 }
2677
2678 switch(pname)
2679 {
2680 case GL_QUERY_RESULT_EXT:
Geoff Lang5aad9672014-09-08 11:10:42 -04002681 {
2682 gl::Error error = queryObject->getResult(params);
2683 if (error.isError())
2684 {
2685 context->recordError(error);
2686 return;
2687 }
2688 }
Geoff Langbfdea662014-07-23 14:16:32 -04002689 break;
Geoff Lang5aad9672014-09-08 11:10:42 -04002690
Geoff Langbfdea662014-07-23 14:16:32 -04002691 case GL_QUERY_RESULT_AVAILABLE_EXT:
Geoff Lang5aad9672014-09-08 11:10:42 -04002692 {
2693 gl::Error error = queryObject->isResultAvailable(params);
2694 if (error.isError())
2695 {
2696 context->recordError(error);
2697 return;
2698 }
2699 }
Geoff Langbfdea662014-07-23 14:16:32 -04002700 break;
Geoff Lang5aad9672014-09-08 11:10:42 -04002701
Geoff Langbfdea662014-07-23 14:16:32 -04002702 default:
Geoff Langb1196682014-07-23 13:47:29 -04002703 context->recordError(gl::Error(GL_INVALID_ENUM));
2704 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002705 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002706 }
2707}
2708
Kenneth Russell67ea1902014-10-06 16:44:50 -07002709void GL_APIENTRY glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002710{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002711 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 +00002712
Geoff Langbfdea662014-07-23 14:16:32 -04002713 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002714 if (context)
2715 {
2716 if (target != GL_RENDERBUFFER)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00002717 {
Geoff Langb1196682014-07-23 13:47:29 -04002718 context->recordError(gl::Error(GL_INVALID_ENUM));
2719 return;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00002720 }
Geoff Langbfdea662014-07-23 14:16:32 -04002721
2722 if (context->getState().getRenderbufferId() == 0)
2723 {
Geoff Langb1196682014-07-23 13:47:29 -04002724 context->recordError(gl::Error(GL_INVALID_OPERATION));
2725 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002726 }
2727
2728 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getState().getRenderbufferId());
2729
2730 switch (pname)
2731 {
2732 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
2733 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
2734 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
2735 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
2736 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
2737 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
2738 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
2739 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
2740 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
Geoff Langb1196682014-07-23 13:47:29 -04002741
Geoff Langbfdea662014-07-23 14:16:32 -04002742 case GL_RENDERBUFFER_SAMPLES_ANGLE:
2743 if (!context->getExtensions().framebufferMultisample)
2744 {
Geoff Langb1196682014-07-23 13:47:29 -04002745 context->recordError(gl::Error(GL_INVALID_ENUM));
2746 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002747 }
2748 *params = renderbuffer->getSamples();
2749 break;
Geoff Langb1196682014-07-23 13:47:29 -04002750
Geoff Langbfdea662014-07-23 14:16:32 -04002751 default:
Geoff Langb1196682014-07-23 13:47:29 -04002752 context->recordError(gl::Error(GL_INVALID_ENUM));
2753 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002754 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002755 }
2756}
2757
Kenneth Russell67ea1902014-10-06 16:44:50 -07002758void GL_APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002759{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002760 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002761
Geoff Langbfdea662014-07-23 14:16:32 -04002762 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002763 if (context)
2764 {
2765 gl::Shader *shaderObject = context->getShader(shader);
2766
2767 if (!shaderObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002768 {
Geoff Langb1196682014-07-23 13:47:29 -04002769 context->recordError(gl::Error(GL_INVALID_VALUE));
2770 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002771 }
Geoff Langbfdea662014-07-23 14:16:32 -04002772
2773 switch (pname)
2774 {
2775 case GL_SHADER_TYPE:
2776 *params = shaderObject->getType();
2777 return;
2778 case GL_DELETE_STATUS:
2779 *params = shaderObject->isFlaggedForDeletion();
2780 return;
2781 case GL_COMPILE_STATUS:
2782 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
2783 return;
2784 case GL_INFO_LOG_LENGTH:
2785 *params = shaderObject->getInfoLogLength();
2786 return;
2787 case GL_SHADER_SOURCE_LENGTH:
2788 *params = shaderObject->getSourceLength();
2789 return;
2790 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
2791 *params = shaderObject->getTranslatedSourceLength();
2792 return;
Geoff Langb1196682014-07-23 13:47:29 -04002793
Geoff Langbfdea662014-07-23 14:16:32 -04002794 default:
Geoff Langb1196682014-07-23 13:47:29 -04002795 context->recordError(gl::Error(GL_INVALID_ENUM));
2796 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002797 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002798 }
2799}
2800
Kenneth Russell67ea1902014-10-06 16:44:50 -07002801void GL_APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002802{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002803 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 +00002804 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002805
Geoff Langbfdea662014-07-23 14:16:32 -04002806 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002807 if (context)
2808 {
Geoff Langb1196682014-07-23 13:47:29 -04002809 if (bufsize < 0)
2810 {
2811 context->recordError(gl::Error(GL_INVALID_VALUE));
2812 return;
2813 }
2814
Geoff Langbfdea662014-07-23 14:16:32 -04002815 gl::Shader *shaderObject = context->getShader(shader);
2816
2817 if (!shaderObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002818 {
Geoff Langb1196682014-07-23 13:47:29 -04002819 context->recordError(gl::Error(GL_INVALID_VALUE));
2820 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002821 }
2822
Geoff Langbfdea662014-07-23 14:16:32 -04002823 shaderObject->getInfoLog(bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002824 }
2825}
2826
Kenneth Russell67ea1902014-10-06 16:44:50 -07002827void GL_APIENTRY glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002828{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002829 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 +00002830 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002831
Geoff Langb1196682014-07-23 13:47:29 -04002832 gl::Context *context = gl::getNonLostContext();
2833 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002834 {
Geoff Langb1196682014-07-23 13:47:29 -04002835 switch (shadertype)
2836 {
2837 case GL_VERTEX_SHADER:
2838 case GL_FRAGMENT_SHADER:
2839 break;
Geoff Langbfdea662014-07-23 14:16:32 -04002840
Geoff Langb1196682014-07-23 13:47:29 -04002841 default:
2842 context->recordError(gl::Error(GL_INVALID_ENUM));
2843 return;
2844 }
2845
2846 switch (precisiontype)
2847 {
2848 case GL_LOW_FLOAT:
2849 case GL_MEDIUM_FLOAT:
2850 case GL_HIGH_FLOAT:
2851 // Assume IEEE 754 precision
2852 range[0] = 127;
2853 range[1] = 127;
2854 *precision = 23;
2855 break;
2856
2857 case GL_LOW_INT:
2858 case GL_MEDIUM_INT:
2859 case GL_HIGH_INT:
2860 // Some (most) hardware only supports single-precision floating-point numbers,
2861 // which can accurately represent integers up to +/-16777216
2862 range[0] = 24;
2863 range[1] = 24;
2864 *precision = 0;
2865 break;
2866
2867 default:
2868 context->recordError(gl::Error(GL_INVALID_ENUM));
2869 return;
2870 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002871 }
2872}
2873
Kenneth Russell67ea1902014-10-06 16:44:50 -07002874void GL_APIENTRY glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002875{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002876 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 +00002877 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002878
Geoff Langbfdea662014-07-23 14:16:32 -04002879 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002880 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002881 {
Geoff Langb1196682014-07-23 13:47:29 -04002882 if (bufsize < 0)
2883 {
2884 context->recordError(gl::Error(GL_INVALID_VALUE));
2885 return;
2886 }
2887
Geoff Langbfdea662014-07-23 14:16:32 -04002888 gl::Shader *shaderObject = context->getShader(shader);
2889
2890 if (!shaderObject)
2891 {
Geoff Langb1196682014-07-23 13:47:29 -04002892 context->recordError(gl::Error(GL_INVALID_OPERATION));
2893 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002894 }
2895
2896 shaderObject->getSource(bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002897 }
2898}
2899
Kenneth Russell67ea1902014-10-06 16:44:50 -07002900void GL_APIENTRY glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
zmo@google.coma574f782011-10-03 21:45:23 +00002901{
2902 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
2903 shader, bufsize, length, source);
2904
Geoff Langbfdea662014-07-23 14:16:32 -04002905 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002906 if (context)
zmo@google.coma574f782011-10-03 21:45:23 +00002907 {
Geoff Langb1196682014-07-23 13:47:29 -04002908 if (bufsize < 0)
2909 {
2910 context->recordError(gl::Error(GL_INVALID_VALUE));
2911 return;
2912 }
2913
Geoff Langbfdea662014-07-23 14:16:32 -04002914 gl::Shader *shaderObject = context->getShader(shader);
2915
2916 if (!shaderObject)
2917 {
Geoff Langb1196682014-07-23 13:47:29 -04002918 context->recordError(gl::Error(GL_INVALID_OPERATION));
2919 return;
Geoff Langbfdea662014-07-23 14:16:32 -04002920 }
2921
2922 shaderObject->getTranslatedSource(bufsize, length, source);
zmo@google.coma574f782011-10-03 21:45:23 +00002923 }
2924}
2925
Kenneth Russell67ea1902014-10-06 16:44:50 -07002926const GLubyte* GL_APIENTRY glGetString(GLenum name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002927{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002928 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002929
Geoff Langbfdea662014-07-23 14:16:32 -04002930 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00002931
Geoff Langbfdea662014-07-23 14:16:32 -04002932 switch (name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002933 {
Geoff Langbfdea662014-07-23 14:16:32 -04002934 case GL_VENDOR:
2935 return (GLubyte*)"Google Inc.";
Geoff Langb1196682014-07-23 13:47:29 -04002936
Geoff Langbfdea662014-07-23 14:16:32 -04002937 case GL_RENDERER:
2938 return (GLubyte*)((context != NULL) ? context->getRendererString().c_str() : "ANGLE");
Geoff Langb1196682014-07-23 13:47:29 -04002939
Geoff Langbfdea662014-07-23 14:16:32 -04002940 case GL_VERSION:
2941 if (context->getClientVersion() == 2)
2942 {
2943 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
2944 }
2945 else
2946 {
2947 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
2948 }
Geoff Langb1196682014-07-23 13:47:29 -04002949
Geoff Langbfdea662014-07-23 14:16:32 -04002950 case GL_SHADING_LANGUAGE_VERSION:
2951 if (context->getClientVersion() == 2)
2952 {
2953 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
2954 }
2955 else
2956 {
2957 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
2958 }
Geoff Langb1196682014-07-23 13:47:29 -04002959
Geoff Langbfdea662014-07-23 14:16:32 -04002960 case GL_EXTENSIONS:
2961 return (GLubyte*)((context != NULL) ? context->getExtensionString().c_str() : "");
Geoff Langb1196682014-07-23 13:47:29 -04002962
Geoff Langbfdea662014-07-23 14:16:32 -04002963 default:
Geoff Langb1196682014-07-23 13:47:29 -04002964 if (context)
2965 {
2966 context->recordError(gl::Error(GL_INVALID_ENUM));
2967 }
2968 return NULL;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002969 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002970}
2971
Kenneth Russell67ea1902014-10-06 16:44:50 -07002972void GL_APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002974 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 +00002975
Geoff Langbfdea662014-07-23 14:16:32 -04002976 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04002977 if (context)
2978 {
2979 gl::Texture *texture = context->getTargetTexture(target);
2980
2981 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00002982 {
Geoff Langb1196682014-07-23 13:47:29 -04002983 context->recordError(gl::Error(GL_INVALID_ENUM));
2984 return;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00002985 }
Geoff Langbfdea662014-07-23 14:16:32 -04002986
2987 switch (pname)
2988 {
2989 case GL_TEXTURE_MAG_FILTER:
2990 *params = (GLfloat)texture->getSamplerState().magFilter;
2991 break;
2992 case GL_TEXTURE_MIN_FILTER:
2993 *params = (GLfloat)texture->getSamplerState().minFilter;
2994 break;
2995 case GL_TEXTURE_WRAP_S:
2996 *params = (GLfloat)texture->getSamplerState().wrapS;
2997 break;
2998 case GL_TEXTURE_WRAP_T:
2999 *params = (GLfloat)texture->getSamplerState().wrapT;
3000 break;
3001 case GL_TEXTURE_WRAP_R:
3002 if (context->getClientVersion() < 3)
3003 {
Geoff Langb1196682014-07-23 13:47:29 -04003004 context->recordError(gl::Error(GL_INVALID_ENUM));
3005 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003006 }
3007 *params = (GLfloat)texture->getSamplerState().wrapR;
3008 break;
3009 case GL_TEXTURE_IMMUTABLE_FORMAT:
3010 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
3011 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3012 break;
3013 case GL_TEXTURE_IMMUTABLE_LEVELS:
3014 if (context->getClientVersion() < 3)
3015 {
Geoff Langb1196682014-07-23 13:47:29 -04003016 context->recordError(gl::Error(GL_INVALID_ENUM));
3017 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003018 }
3019 *params = (GLfloat)texture->immutableLevelCount();
3020 break;
3021 case GL_TEXTURE_USAGE_ANGLE:
3022 *params = (GLfloat)texture->getUsage();
3023 break;
3024 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3025 if (!context->getExtensions().textureFilterAnisotropic)
3026 {
Geoff Langb1196682014-07-23 13:47:29 -04003027 context->recordError(gl::Error(GL_INVALID_ENUM));
3028 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003029 }
3030 *params = (GLfloat)texture->getSamplerState().maxAnisotropy;
3031 break;
3032 case GL_TEXTURE_SWIZZLE_R:
3033 if (context->getClientVersion() < 3)
3034 {
Geoff Langb1196682014-07-23 13:47:29 -04003035 context->recordError(gl::Error(GL_INVALID_ENUM));
3036 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003037 }
3038 *params = (GLfloat)texture->getSamplerState().swizzleRed;
3039 break;
3040 case GL_TEXTURE_SWIZZLE_G:
3041 if (context->getClientVersion() < 3)
3042 {
Geoff Langb1196682014-07-23 13:47:29 -04003043 context->recordError(gl::Error(GL_INVALID_ENUM));
3044 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003045 }
3046 *params = (GLfloat)texture->getSamplerState().swizzleGreen;
3047 break;
3048 case GL_TEXTURE_SWIZZLE_B:
3049 if (context->getClientVersion() < 3)
3050 {
Geoff Langb1196682014-07-23 13:47:29 -04003051 context->recordError(gl::Error(GL_INVALID_ENUM));
3052 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003053 }
3054 *params = (GLfloat)texture->getSamplerState().swizzleBlue;
3055 break;
3056 case GL_TEXTURE_SWIZZLE_A:
3057 if (context->getClientVersion() < 3)
3058 {
Geoff Langb1196682014-07-23 13:47:29 -04003059 context->recordError(gl::Error(GL_INVALID_ENUM));
3060 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003061 }
3062 *params = (GLfloat)texture->getSamplerState().swizzleAlpha;
3063 break;
3064 case GL_TEXTURE_BASE_LEVEL:
3065 if (context->getClientVersion() < 3)
3066 {
Geoff Langb1196682014-07-23 13:47:29 -04003067 context->recordError(gl::Error(GL_INVALID_ENUM));
3068 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003069 }
3070 *params = (GLfloat)texture->getSamplerState().baseLevel;
3071 break;
3072 case GL_TEXTURE_MAX_LEVEL:
3073 if (context->getClientVersion() < 3)
3074 {
Geoff Langb1196682014-07-23 13:47:29 -04003075 context->recordError(gl::Error(GL_INVALID_ENUM));
3076 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003077 }
3078 *params = (GLfloat)texture->getSamplerState().maxLevel;
3079 break;
3080 case GL_TEXTURE_MIN_LOD:
3081 if (context->getClientVersion() < 3)
3082 {
Geoff Langb1196682014-07-23 13:47:29 -04003083 context->recordError(gl::Error(GL_INVALID_ENUM));
3084 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003085 }
3086 *params = texture->getSamplerState().minLod;
3087 break;
3088 case GL_TEXTURE_MAX_LOD:
3089 if (context->getClientVersion() < 3)
3090 {
Geoff Langb1196682014-07-23 13:47:29 -04003091 context->recordError(gl::Error(GL_INVALID_ENUM));
3092 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003093 }
3094 *params = texture->getSamplerState().maxLod;
3095 break;
Geoff Langb1196682014-07-23 13:47:29 -04003096
Geoff Langbfdea662014-07-23 14:16:32 -04003097 default:
Geoff Langb1196682014-07-23 13:47:29 -04003098 context->recordError(gl::Error(GL_INVALID_ENUM));
3099 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003100 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003101 }
3102}
3103
Kenneth Russell67ea1902014-10-06 16:44:50 -07003104void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003105{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003106 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 +00003107
Geoff Langbfdea662014-07-23 14:16:32 -04003108 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003109 if (context)
3110 {
3111 gl::Texture *texture = context->getTargetTexture(target);
3112
3113 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003114 {
Geoff Langb1196682014-07-23 13:47:29 -04003115 context->recordError(gl::Error(GL_INVALID_ENUM));
3116 return;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003117 }
Geoff Langbfdea662014-07-23 14:16:32 -04003118
3119 switch (pname)
3120 {
3121 case GL_TEXTURE_MAG_FILTER:
3122 *params = texture->getSamplerState().magFilter;
3123 break;
3124 case GL_TEXTURE_MIN_FILTER:
3125 *params = texture->getSamplerState().minFilter;
3126 break;
3127 case GL_TEXTURE_WRAP_S:
3128 *params = texture->getSamplerState().wrapS;
3129 break;
3130 case GL_TEXTURE_WRAP_T:
3131 *params = texture->getSamplerState().wrapT;
3132 break;
3133 case GL_TEXTURE_WRAP_R:
3134 if (context->getClientVersion() < 3)
3135 {
Geoff Langb1196682014-07-23 13:47:29 -04003136 context->recordError(gl::Error(GL_INVALID_ENUM));
3137 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003138 }
3139 *params = texture->getSamplerState().wrapR;
3140 break;
3141 case GL_TEXTURE_IMMUTABLE_FORMAT:
3142 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
3143 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3144 break;
3145 case GL_TEXTURE_IMMUTABLE_LEVELS:
3146 if (context->getClientVersion() < 3)
3147 {
Geoff Langb1196682014-07-23 13:47:29 -04003148 context->recordError(gl::Error(GL_INVALID_ENUM));
3149 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003150 }
3151 *params = texture->immutableLevelCount();
3152 break;
3153 case GL_TEXTURE_USAGE_ANGLE:
3154 *params = texture->getUsage();
3155 break;
3156 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3157 if (!context->getExtensions().textureFilterAnisotropic)
3158 {
Geoff Langb1196682014-07-23 13:47:29 -04003159 context->recordError(gl::Error(GL_INVALID_ENUM));
3160 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003161 }
3162 *params = (GLint)texture->getSamplerState().maxAnisotropy;
3163 break;
3164 case GL_TEXTURE_SWIZZLE_R:
3165 if (context->getClientVersion() < 3)
3166 {
Geoff Langb1196682014-07-23 13:47:29 -04003167 context->recordError(gl::Error(GL_INVALID_ENUM));
3168 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003169 }
3170 *params = texture->getSamplerState().swizzleRed;
3171 break;
3172 case GL_TEXTURE_SWIZZLE_G:
3173 if (context->getClientVersion() < 3)
3174 {
Geoff Langb1196682014-07-23 13:47:29 -04003175 context->recordError(gl::Error(GL_INVALID_ENUM));
3176 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003177 }
3178 *params = texture->getSamplerState().swizzleGreen;
3179 break;
3180 case GL_TEXTURE_SWIZZLE_B:
3181 if (context->getClientVersion() < 3)
3182 {
Geoff Langb1196682014-07-23 13:47:29 -04003183 context->recordError(gl::Error(GL_INVALID_ENUM));
3184 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003185 }
3186 *params = texture->getSamplerState().swizzleBlue;
3187 break;
3188 case GL_TEXTURE_SWIZZLE_A:
3189 if (context->getClientVersion() < 3)
3190 {
Geoff Langb1196682014-07-23 13:47:29 -04003191 context->recordError(gl::Error(GL_INVALID_ENUM));
3192 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003193 }
3194 *params = texture->getSamplerState().swizzleAlpha;
3195 break;
3196 case GL_TEXTURE_BASE_LEVEL:
3197 if (context->getClientVersion() < 3)
3198 {
Geoff Langb1196682014-07-23 13:47:29 -04003199 context->recordError(gl::Error(GL_INVALID_ENUM));
3200 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003201 }
3202 *params = texture->getSamplerState().baseLevel;
3203 break;
3204 case GL_TEXTURE_MAX_LEVEL:
3205 if (context->getClientVersion() < 3)
3206 {
Geoff Langb1196682014-07-23 13:47:29 -04003207 context->recordError(gl::Error(GL_INVALID_ENUM));
3208 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003209 }
3210 *params = texture->getSamplerState().maxLevel;
3211 break;
3212 case GL_TEXTURE_MIN_LOD:
3213 if (context->getClientVersion() < 3)
3214 {
Geoff Langb1196682014-07-23 13:47:29 -04003215 context->recordError(gl::Error(GL_INVALID_ENUM));
3216 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003217 }
3218 *params = (GLint)texture->getSamplerState().minLod;
3219 break;
3220 case GL_TEXTURE_MAX_LOD:
3221 if (context->getClientVersion() < 3)
3222 {
Geoff Langb1196682014-07-23 13:47:29 -04003223 context->recordError(gl::Error(GL_INVALID_ENUM));
3224 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003225 }
3226 *params = (GLint)texture->getSamplerState().maxLod;
3227 break;
Geoff Langb1196682014-07-23 13:47:29 -04003228
Geoff Langbfdea662014-07-23 14:16:32 -04003229 default:
Geoff Langb1196682014-07-23 13:47:29 -04003230 context->recordError(gl::Error(GL_INVALID_ENUM));
3231 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003232 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003233 }
3234}
3235
Kenneth Russell67ea1902014-10-06 16:44:50 -07003236void GL_APIENTRY glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003237{
3238 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3239 program, location, bufSize, params);
3240
Geoff Langbfdea662014-07-23 14:16:32 -04003241 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003242 if (context)
3243 {
Jamie Madill0063c512014-08-25 15:47:53 -04003244 if (!ValidateGetnUniformfvEXT(context, program, location, bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003245 {
Jamie Madill0063c512014-08-25 15:47:53 -04003246 return;
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003247 }
3248
Jamie Madilla502c742014-08-28 17:19:13 -04003249 gl::Program *programObject = context->getProgram(program);
3250 ASSERT(programObject);
3251 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
Jamie Madill0063c512014-08-25 15:47:53 -04003252 ASSERT(programBinary);
Geoff Langbfdea662014-07-23 14:16:32 -04003253
Jamie Madill99a1e982014-08-25 15:47:54 -04003254 programBinary->getUniformfv(location, params);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003255 }
3256}
3257
Kenneth Russell67ea1902014-10-06 16:44:50 -07003258void GL_APIENTRY glGetUniformfv(GLuint program, GLint location, GLfloat* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003259{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003260 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003261
Geoff Langbfdea662014-07-23 14:16:32 -04003262 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003263 if (context)
3264 {
Jamie Madill0063c512014-08-25 15:47:53 -04003265 if (!ValidateGetUniformfv(context, program, location, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003266 {
Jamie Madill0063c512014-08-25 15:47:53 -04003267 return;
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003268 }
Geoff Langbfdea662014-07-23 14:16:32 -04003269
Jamie Madilla502c742014-08-28 17:19:13 -04003270 gl::Program *programObject = context->getProgram(program);
3271 ASSERT(programObject);
3272 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
Jamie Madill0063c512014-08-25 15:47:53 -04003273 ASSERT(programBinary);
Geoff Langbfdea662014-07-23 14:16:32 -04003274
Jamie Madill99a1e982014-08-25 15:47:54 -04003275 programBinary->getUniformfv(location, params);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003276 }
3277}
3278
Kenneth Russell67ea1902014-10-06 16:44:50 -07003279void GL_APIENTRY glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003280{
Geoff Langbfdea662014-07-23 14:16:32 -04003281 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003282 program, location, bufSize, params);
3283
Geoff Langbfdea662014-07-23 14:16:32 -04003284 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003285 if (context)
3286 {
Jamie Madill0063c512014-08-25 15:47:53 -04003287 if (!ValidateGetnUniformivEXT(context, program, location, bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003288 {
Jamie Madill0063c512014-08-25 15:47:53 -04003289 return;
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003290 }
3291
Jamie Madilla502c742014-08-28 17:19:13 -04003292 gl::Program *programObject = context->getProgram(program);
3293 ASSERT(programObject);
3294 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
Jamie Madill0063c512014-08-25 15:47:53 -04003295 ASSERT(programBinary);
Geoff Langbfdea662014-07-23 14:16:32 -04003296
Jamie Madill99a1e982014-08-25 15:47:54 -04003297 programBinary->getUniformiv(location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003298 }
3299}
3300
Kenneth Russell67ea1902014-10-06 16:44:50 -07003301void GL_APIENTRY glGetUniformiv(GLuint program, GLint location, GLint* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003302{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003303 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003304
Geoff Langbfdea662014-07-23 14:16:32 -04003305 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003306 if (context)
3307 {
Jamie Madill0063c512014-08-25 15:47:53 -04003308 if (!ValidateGetUniformiv(context, program, location, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003309 {
Jamie Madill0063c512014-08-25 15:47:53 -04003310 return;
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003311 }
Geoff Langbfdea662014-07-23 14:16:32 -04003312
Jamie Madilla502c742014-08-28 17:19:13 -04003313 gl::Program *programObject = context->getProgram(program);
3314 ASSERT(programObject);
3315 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
Jamie Madill0063c512014-08-25 15:47:53 -04003316 ASSERT(programBinary);
Geoff Langbfdea662014-07-23 14:16:32 -04003317
Jamie Madill99a1e982014-08-25 15:47:54 -04003318 programBinary->getUniformiv(location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003319 }
3320}
3321
Kenneth Russell67ea1902014-10-06 16:44:50 -07003322GLint GL_APIENTRY glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003323{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003324 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003325
Geoff Langbfdea662014-07-23 14:16:32 -04003326 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003327 if (context)
3328 {
Geoff Langb1196682014-07-23 13:47:29 -04003329 if (strstr(name, "gl_") == name)
3330 {
3331 return -1;
3332 }
3333
Geoff Langbfdea662014-07-23 14:16:32 -04003334 gl::Program *programObject = context->getProgram(program);
3335
3336 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003337 {
Geoff Langbfdea662014-07-23 14:16:32 -04003338 if (context->getShader(program))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003339 {
Geoff Langb1196682014-07-23 13:47:29 -04003340 context->recordError(gl::Error(GL_INVALID_OPERATION));
3341 return -1;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003342 }
Geoff Langbfdea662014-07-23 14:16:32 -04003343 else
3344 {
Geoff Langb1196682014-07-23 13:47:29 -04003345 context->recordError(gl::Error(GL_INVALID_VALUE));
3346 return -1;
Geoff Langbfdea662014-07-23 14:16:32 -04003347 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003348 }
Geoff Langbfdea662014-07-23 14:16:32 -04003349
3350 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3351 if (!programObject->isLinked() || !programBinary)
3352 {
Geoff Langb1196682014-07-23 13:47:29 -04003353 context->recordError(gl::Error(GL_INVALID_OPERATION));
3354 return -1;
Geoff Langbfdea662014-07-23 14:16:32 -04003355 }
3356
3357 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003358 }
3359
3360 return -1;
3361}
3362
Kenneth Russell67ea1902014-10-06 16:44:50 -07003363void GL_APIENTRY glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003365 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003366
Geoff Langbfdea662014-07-23 14:16:32 -04003367 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003368 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003369 {
Geoff Langbfdea662014-07-23 14:16:32 -04003370 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003371 {
Geoff Langb1196682014-07-23 13:47:29 -04003372 context->recordError(gl::Error(GL_INVALID_VALUE));
3373 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003374 }
daniel@transgaming.come0078962010-04-15 20:45:08 +00003375
Geoff Langbfdea662014-07-23 14:16:32 -04003376 const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index);
Geoff Langb1196682014-07-23 13:47:29 -04003377 if (!gl::ValidateGetVertexAttribParameters(context, pname))
Geoff Langbfdea662014-07-23 14:16:32 -04003378 {
3379 return;
3380 }
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003381
Geoff Langbfdea662014-07-23 14:16:32 -04003382 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3383 {
3384 const gl::VertexAttribCurrentValueData &currentValueData = context->getState().getVertexAttribCurrentValue(index);
3385 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003386 {
Geoff Langbfdea662014-07-23 14:16:32 -04003387 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003388 }
3389 }
Geoff Langbfdea662014-07-23 14:16:32 -04003390 else
3391 {
3392 *params = gl::QuerySingleVertexAttributeParameter<GLfloat>(attribState, pname);
3393 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003394 }
3395}
3396
Kenneth Russell67ea1902014-10-06 16:44:50 -07003397void GL_APIENTRY glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003398{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003399 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003400
Geoff Langbfdea662014-07-23 14:16:32 -04003401 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003402 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003403 {
Geoff Langbfdea662014-07-23 14:16:32 -04003404 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003405 {
Geoff Langb1196682014-07-23 13:47:29 -04003406 context->recordError(gl::Error(GL_INVALID_VALUE));
3407 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003408 }
daniel@transgaming.come0078962010-04-15 20:45:08 +00003409
Geoff Langbfdea662014-07-23 14:16:32 -04003410 const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003411
Geoff Langb1196682014-07-23 13:47:29 -04003412 if (!gl::ValidateGetVertexAttribParameters(context, pname))
Geoff Langbfdea662014-07-23 14:16:32 -04003413 {
3414 return;
3415 }
Jamie Madillaff71502013-07-02 11:57:05 -04003416
Geoff Langbfdea662014-07-23 14:16:32 -04003417 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3418 {
3419 const gl::VertexAttribCurrentValueData &currentValueData = context->getState().getVertexAttribCurrentValue(index);
3420 for (int i = 0; i < 4; ++i)
Jamie Madillaff71502013-07-02 11:57:05 -04003421 {
Geoff Langbfdea662014-07-23 14:16:32 -04003422 float currentValue = currentValueData.FloatValues[i];
3423 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003424 }
3425 }
Geoff Langbfdea662014-07-23 14:16:32 -04003426 else
3427 {
3428 *params = gl::QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
3429 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003430 }
3431}
3432
Kenneth Russell67ea1902014-10-06 16:44:50 -07003433void GL_APIENTRY glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003434{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003435 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003436
Geoff Langbfdea662014-07-23 14:16:32 -04003437 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003438 if (context)
3439 {
3440 if (index >= gl::MAX_VERTEX_ATTRIBS)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003441 {
Geoff Langb1196682014-07-23 13:47:29 -04003442 context->recordError(gl::Error(GL_INVALID_VALUE));
3443 return;
daniel@transgaming.come0078962010-04-15 20:45:08 +00003444 }
Geoff Langbfdea662014-07-23 14:16:32 -04003445
3446 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3447 {
Geoff Langb1196682014-07-23 13:47:29 -04003448 context->recordError(gl::Error(GL_INVALID_ENUM));
3449 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003450 }
3451
3452 *pointer = const_cast<GLvoid*>(context->getState().getVertexAttribPointer(index));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003453 }
3454}
3455
Kenneth Russell67ea1902014-10-06 16:44:50 -07003456void GL_APIENTRY glHint(GLenum target, GLenum mode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003458 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003459
Geoff Langbfdea662014-07-23 14:16:32 -04003460 gl::Context *context = gl::getNonLostContext();
Geoff Langb1196682014-07-23 13:47:29 -04003461 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003462 {
Geoff Langb1196682014-07-23 13:47:29 -04003463 switch (mode)
3464 {
3465 case GL_FASTEST:
3466 case GL_NICEST:
3467 case GL_DONT_CARE:
3468 break;
3469
3470 default:
3471 context->recordError(gl::Error(GL_INVALID_ENUM));
3472 return;
3473 }
3474
3475 switch (target)
3476 {
3477 case GL_GENERATE_MIPMAP_HINT:
3478 context->getState().setGenerateMipmapHint(mode);
3479 break;
3480
3481 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
3482 context->getState().setFragmentShaderDerivativeHint(mode);
3483 break;
3484
3485 default:
3486 context->recordError(gl::Error(GL_INVALID_ENUM));
3487 return;
3488 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003489 }
3490}
3491
Kenneth Russell67ea1902014-10-06 16:44:50 -07003492GLboolean GL_APIENTRY glIsBuffer(GLuint buffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003493{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003494 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003495
Geoff Langbfdea662014-07-23 14:16:32 -04003496 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003497 if (context && buffer)
3498 {
3499 gl::Buffer *bufferObject = context->getBuffer(buffer);
3500
3501 if (bufferObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003502 {
Geoff Langbfdea662014-07-23 14:16:32 -04003503 return GL_TRUE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003504 }
3505 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003506
3507 return GL_FALSE;
3508}
3509
Kenneth Russell67ea1902014-10-06 16:44:50 -07003510GLboolean GL_APIENTRY glIsEnabled(GLenum cap)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003511{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003512 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003513
Geoff Langbfdea662014-07-23 14:16:32 -04003514 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003515 if (context)
3516 {
3517 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003518 {
Geoff Langb1196682014-07-23 13:47:29 -04003519 context->recordError(gl::Error(GL_INVALID_ENUM));
3520 return GL_FALSE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003521 }
Geoff Langbfdea662014-07-23 14:16:32 -04003522
3523 return context->getState().getEnableFeature(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003524 }
3525
3526 return false;
3527}
3528
Kenneth Russell67ea1902014-10-06 16:44:50 -07003529GLboolean GL_APIENTRY glIsFenceNV(GLuint fence)
daniel@transgaming.comfe208882010-09-01 15:47:57 +00003530{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003531 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003532
Geoff Langbfdea662014-07-23 14:16:32 -04003533 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003534 if (context)
3535 {
3536 gl::FenceNV *fenceObject = context->getFenceNV(fence);
3537
3538 if (fenceObject == NULL)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003539 {
Geoff Langbfdea662014-07-23 14:16:32 -04003540 return GL_FALSE;
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003541 }
Geoff Langbfdea662014-07-23 14:16:32 -04003542
3543 return fenceObject->isFence();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003544 }
3545
3546 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00003547}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003548
Kenneth Russell67ea1902014-10-06 16:44:50 -07003549GLboolean GL_APIENTRY glIsFramebuffer(GLuint framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003550{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003551 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003552
Geoff Langbfdea662014-07-23 14:16:32 -04003553 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003554 if (context && framebuffer)
3555 {
3556 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
3557
3558 if (framebufferObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003559 {
Geoff Langbfdea662014-07-23 14:16:32 -04003560 return GL_TRUE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003561 }
3562 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003563
3564 return GL_FALSE;
3565}
3566
Kenneth Russell67ea1902014-10-06 16:44:50 -07003567GLboolean GL_APIENTRY glIsProgram(GLuint program)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003568{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003569 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003570
Geoff Langbfdea662014-07-23 14:16:32 -04003571 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003572 if (context && program)
3573 {
3574 gl::Program *programObject = context->getProgram(program);
3575
3576 if (programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003577 {
Geoff Langbfdea662014-07-23 14:16:32 -04003578 return GL_TRUE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003579 }
3580 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003581
3582 return GL_FALSE;
3583}
3584
Kenneth Russell67ea1902014-10-06 16:44:50 -07003585GLboolean GL_APIENTRY glIsQueryEXT(GLuint id)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003586{
3587 EVENT("(GLuint id = %d)", id);
3588
Geoff Langbfdea662014-07-23 14:16:32 -04003589 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003590 if (context)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003591 {
Geoff Langbfdea662014-07-23 14:16:32 -04003592 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003593 }
3594
3595 return GL_FALSE;
3596}
3597
Kenneth Russell67ea1902014-10-06 16:44:50 -07003598GLboolean GL_APIENTRY glIsRenderbuffer(GLuint renderbuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003599{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003600 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003601
Geoff Langbfdea662014-07-23 14:16:32 -04003602 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003603 if (context && renderbuffer)
3604 {
3605 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
3606
3607 if (renderbufferObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003608 {
Geoff Langbfdea662014-07-23 14:16:32 -04003609 return GL_TRUE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003610 }
3611 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003612
3613 return GL_FALSE;
3614}
3615
Kenneth Russell67ea1902014-10-06 16:44:50 -07003616GLboolean GL_APIENTRY glIsShader(GLuint shader)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003617{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003618 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003619
Geoff Langbfdea662014-07-23 14:16:32 -04003620 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003621 if (context && shader)
3622 {
3623 gl::Shader *shaderObject = context->getShader(shader);
3624
3625 if (shaderObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003626 {
Geoff Langbfdea662014-07-23 14:16:32 -04003627 return GL_TRUE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003628 }
3629 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003630
3631 return GL_FALSE;
3632}
3633
Kenneth Russell67ea1902014-10-06 16:44:50 -07003634GLboolean GL_APIENTRY glIsTexture(GLuint texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003635{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003636 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003637
Geoff Langbfdea662014-07-23 14:16:32 -04003638 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003639 if (context && texture)
3640 {
3641 gl::Texture *textureObject = context->getTexture(texture);
3642
3643 if (textureObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003644 {
Geoff Langbfdea662014-07-23 14:16:32 -04003645 return GL_TRUE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003646 }
3647 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003648
3649 return GL_FALSE;
3650}
3651
Kenneth Russell67ea1902014-10-06 16:44:50 -07003652void GL_APIENTRY glLineWidth(GLfloat width)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003653{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003654 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003655
Geoff Langbfdea662014-07-23 14:16:32 -04003656 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003657 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003658 {
Geoff Langb1196682014-07-23 13:47:29 -04003659 if (width <= 0.0f)
3660 {
3661 context->recordError(gl::Error(GL_INVALID_VALUE));
3662 return;
3663 }
3664
Geoff Langbfdea662014-07-23 14:16:32 -04003665 context->getState().setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003666 }
3667}
3668
Kenneth Russell67ea1902014-10-06 16:44:50 -07003669void GL_APIENTRY glLinkProgram(GLuint program)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003670{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003671 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003672
Geoff Langbfdea662014-07-23 14:16:32 -04003673 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003674 if (context)
3675 {
3676 gl::Program *programObject = context->getProgram(program);
3677
3678 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003679 {
Geoff Langbfdea662014-07-23 14:16:32 -04003680 if (context->getShader(program))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003681 {
Geoff Langb1196682014-07-23 13:47:29 -04003682 context->recordError(gl::Error(GL_INVALID_OPERATION));
3683 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003684 }
Geoff Langbfdea662014-07-23 14:16:32 -04003685 else
3686 {
Geoff Langb1196682014-07-23 13:47:29 -04003687 context->recordError(gl::Error(GL_INVALID_VALUE));
3688 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003689 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003690 }
Geoff Langbfdea662014-07-23 14:16:32 -04003691
Geoff Langb543aff2014-09-30 14:52:54 -04003692 gl::Error error = context->linkProgram(program);
3693 if (error.isError())
3694 {
3695 context->recordError(error);
3696 return;
3697 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003698 }
3699}
3700
Kenneth Russell67ea1902014-10-06 16:44:50 -07003701void GL_APIENTRY glPixelStorei(GLenum pname, GLint param)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003702{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003703 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003704
Geoff Langbfdea662014-07-23 14:16:32 -04003705 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003706 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003707 {
Geoff Langbfdea662014-07-23 14:16:32 -04003708 switch (pname)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003709 {
Geoff Langbfdea662014-07-23 14:16:32 -04003710 case GL_UNPACK_ALIGNMENT:
3711 if (param != 1 && param != 2 && param != 4 && param != 8)
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003712 {
Geoff Langb1196682014-07-23 13:47:29 -04003713 context->recordError(gl::Error(GL_INVALID_VALUE));
3714 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003715 }
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003716
Geoff Langbfdea662014-07-23 14:16:32 -04003717 context->getState().setUnpackAlignment(param);
3718 break;
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003719
Geoff Langbfdea662014-07-23 14:16:32 -04003720 case GL_PACK_ALIGNMENT:
3721 if (param != 1 && param != 2 && param != 4 && param != 8)
3722 {
Geoff Langb1196682014-07-23 13:47:29 -04003723 context->recordError(gl::Error(GL_INVALID_VALUE));
3724 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003725 }
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003726
Geoff Langbfdea662014-07-23 14:16:32 -04003727 context->getState().setPackAlignment(param);
3728 break;
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003729
Geoff Langbfdea662014-07-23 14:16:32 -04003730 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
3731 context->getState().setPackReverseRowOrder(param != 0);
3732 break;
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00003733
Geoff Langbfdea662014-07-23 14:16:32 -04003734 case GL_UNPACK_IMAGE_HEIGHT:
3735 case GL_UNPACK_SKIP_IMAGES:
3736 case GL_UNPACK_ROW_LENGTH:
3737 case GL_UNPACK_SKIP_ROWS:
3738 case GL_UNPACK_SKIP_PIXELS:
3739 case GL_PACK_ROW_LENGTH:
3740 case GL_PACK_SKIP_ROWS:
3741 case GL_PACK_SKIP_PIXELS:
3742 if (context->getClientVersion() < 3)
3743 {
Geoff Langb1196682014-07-23 13:47:29 -04003744 context->recordError(gl::Error(GL_INVALID_ENUM));
3745 return;
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003746 }
Geoff Langbfdea662014-07-23 14:16:32 -04003747 UNIMPLEMENTED();
3748 break;
3749
3750 default:
Geoff Langb1196682014-07-23 13:47:29 -04003751 context->recordError(gl::Error(GL_INVALID_ENUM));
3752 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003753 }
3754 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003755}
3756
Kenneth Russell67ea1902014-10-06 16:44:50 -07003757void GL_APIENTRY glPolygonOffset(GLfloat factor, GLfloat units)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003758{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003759 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003760
Geoff Langbfdea662014-07-23 14:16:32 -04003761 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003762 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003763 {
Geoff Langbfdea662014-07-23 14:16:32 -04003764 context->getState().setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003765 }
3766}
3767
Kenneth Russell67ea1902014-10-06 16:44:50 -07003768void GL_APIENTRY glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00003769 GLenum format, GLenum type, GLsizei bufSize,
3770 GLvoid *data)
3771{
3772 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
3773 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
3774 x, y, width, height, format, type, bufSize, data);
3775
Geoff Langbfdea662014-07-23 14:16:32 -04003776 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003777 if (context)
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00003778 {
Geoff Langb1196682014-07-23 13:47:29 -04003779 if (width < 0 || height < 0 || bufSize < 0)
3780 {
3781 context->recordError(gl::Error(GL_INVALID_VALUE));
3782 return;
3783 }
3784
Geoff Langbfdea662014-07-23 14:16:32 -04003785 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
3786 format, type, &bufSize, data))
3787 {
3788 return;
3789 }
3790
Geoff Lang63d2fc72014-07-25 14:51:41 -04003791 gl::Error error = context->readPixels(x, y, width, height, format, type, &bufSize, data);
3792 if (error.isError())
3793 {
3794 context->recordError(error);
3795 return;
3796 }
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00003797 }
3798}
3799
Kenneth Russell67ea1902014-10-06 16:44:50 -07003800void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00003801 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003802{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003803 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003804 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003805 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003806
Geoff Langbfdea662014-07-23 14:16:32 -04003807 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003808 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003809 {
Geoff Langb1196682014-07-23 13:47:29 -04003810 if (width < 0 || height < 0)
3811 {
3812 context->recordError(gl::Error(GL_INVALID_VALUE));
3813 return;
3814 }
3815
Geoff Langbfdea662014-07-23 14:16:32 -04003816 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
3817 format, type, NULL, pixels))
3818 {
3819 return;
3820 }
3821
Geoff Lang63d2fc72014-07-25 14:51:41 -04003822 gl::Error error = context->readPixels(x, y, width, height, format, type, NULL, pixels);
3823 if (error.isError())
3824 {
3825 context->recordError(error);
3826 return;
3827 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003828 }
3829}
3830
Kenneth Russell67ea1902014-10-06 16:44:50 -07003831void GL_APIENTRY glReleaseShaderCompiler(void)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003832{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003833 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003834
Brandon Jonesf05cdee2014-08-27 15:24:07 -07003835 gl::Context *context = gl::getNonLostContext();
3836
3837 if (context)
3838 {
3839 context->releaseShaderCompiler();
3840 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003841}
3842
Kenneth Russell67ea1902014-10-06 16:44:50 -07003843void GL_APIENTRY glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003844{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003845 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 +00003846 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003847
Geoff Langbfdea662014-07-23 14:16:32 -04003848 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003849 if (context)
3850 {
3851 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
3852 width, height, true))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003853 {
Geoff Langbfdea662014-07-23 14:16:32 -04003854 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003855 }
Geoff Langbfdea662014-07-23 14:16:32 -04003856
3857 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003858 }
3859}
3860
Kenneth Russell67ea1902014-10-06 16:44:50 -07003861void GL_APIENTRY glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003862{
3863 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
3864}
3865
Kenneth Russell67ea1902014-10-06 16:44:50 -07003866void GL_APIENTRY glSampleCoverage(GLclampf value, GLboolean invert)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003867{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00003868 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003869
Geoff Langbfdea662014-07-23 14:16:32 -04003870 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003871
Geoff Langbfdea662014-07-23 14:16:32 -04003872 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003873 {
Geoff Langbfdea662014-07-23 14:16:32 -04003874 context->getState().setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003875 }
3876}
3877
Kenneth Russell67ea1902014-10-06 16:44:50 -07003878void GL_APIENTRY glSetFenceNV(GLuint fence, GLenum condition)
daniel@transgaming.comfe208882010-09-01 15:47:57 +00003879{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003880 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003881
Geoff Langbfdea662014-07-23 14:16:32 -04003882 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003883 if (context)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003884 {
Geoff Langb1196682014-07-23 13:47:29 -04003885 if (condition != GL_ALL_COMPLETED_NV)
3886 {
3887 context->recordError(gl::Error(GL_INVALID_ENUM));
3888 return;
3889 }
3890
Geoff Langbfdea662014-07-23 14:16:32 -04003891 gl::FenceNV *fenceObject = context->getFenceNV(fence);
3892
3893 if (fenceObject == NULL)
3894 {
Geoff Langb1196682014-07-23 13:47:29 -04003895 context->recordError(gl::Error(GL_INVALID_OPERATION));
3896 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003897 }
3898
Geoff Lang882033e2014-09-30 11:26:07 -04003899 gl::Error error = fenceObject->setFence(condition);
3900 if (error.isError())
3901 {
3902 context->recordError(error);
3903 return;
3904 }
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003905 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00003906}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003907
Kenneth Russell67ea1902014-10-06 16:44:50 -07003908void GL_APIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003910 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 +00003911
Geoff Langbfdea662014-07-23 14:16:32 -04003912 gl::Context* context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003913 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003914 {
Geoff Langb1196682014-07-23 13:47:29 -04003915 if (width < 0 || height < 0)
3916 {
3917 context->recordError(gl::Error(GL_INVALID_VALUE));
3918 return;
3919 }
3920
Geoff Langbfdea662014-07-23 14:16:32 -04003921 context->getState().setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003922 }
3923}
3924
Kenneth Russell67ea1902014-10-06 16:44:50 -07003925void GL_APIENTRY glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003926{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003927 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003928 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003929 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003930
Geoff Lang900013c2014-07-07 11:32:19 -04003931 gl::Context* context = gl::getNonLostContext();
3932 if (context)
3933 {
3934 const std::vector<GLenum> &shaderBinaryFormats = context->getCaps().shaderBinaryFormats;
3935 if (std::find(shaderBinaryFormats.begin(), shaderBinaryFormats.end(), binaryformat) == shaderBinaryFormats.end())
3936 {
Geoff Langb1196682014-07-23 13:47:29 -04003937 context->recordError(gl::Error(GL_INVALID_ENUM));
3938 return;
Geoff Lang900013c2014-07-07 11:32:19 -04003939 }
3940
3941 // No binary shader formats are supported.
3942 UNIMPLEMENTED();
3943 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003944}
3945
Kenneth Russell67ea1902014-10-06 16:44:50 -07003946void GL_APIENTRY glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003947{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003948 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 +00003949 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003950
Geoff Langbfdea662014-07-23 14:16:32 -04003951 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003952 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003953 {
Geoff Langb1196682014-07-23 13:47:29 -04003954 if (count < 0)
3955 {
3956 context->recordError(gl::Error(GL_INVALID_VALUE));
3957 return;
3958 }
3959
Geoff Langbfdea662014-07-23 14:16:32 -04003960 gl::Shader *shaderObject = context->getShader(shader);
3961
3962 if (!shaderObject)
3963 {
3964 if (context->getProgram(shader))
3965 {
Geoff Langb1196682014-07-23 13:47:29 -04003966 context->recordError(gl::Error(GL_INVALID_OPERATION));
3967 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003968 }
3969 else
3970 {
Geoff Langb1196682014-07-23 13:47:29 -04003971 context->recordError(gl::Error(GL_INVALID_VALUE));
3972 return;
Geoff Langbfdea662014-07-23 14:16:32 -04003973 }
3974 }
3975
3976 shaderObject->setSource(count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003977 }
3978}
3979
Kenneth Russell67ea1902014-10-06 16:44:50 -07003980void GL_APIENTRY glStencilFunc(GLenum func, GLint ref, GLuint mask)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003981{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003982 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003983}
3984
Kenneth Russell67ea1902014-10-06 16:44:50 -07003985void GL_APIENTRY glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003986{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003987 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 +00003988
Geoff Langbfdea662014-07-23 14:16:32 -04003989 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04003990 if (context)
3991 {
Geoff Langb1196682014-07-23 13:47:29 -04003992 switch (face)
3993 {
3994 case GL_FRONT:
3995 case GL_BACK:
3996 case GL_FRONT_AND_BACK:
3997 break;
3998
3999 default:
4000 context->recordError(gl::Error(GL_INVALID_ENUM));
4001 return;
4002 }
4003
4004 switch (func)
4005 {
4006 case GL_NEVER:
4007 case GL_ALWAYS:
4008 case GL_LESS:
4009 case GL_LEQUAL:
4010 case GL_EQUAL:
4011 case GL_GEQUAL:
4012 case GL_GREATER:
4013 case GL_NOTEQUAL:
4014 break;
4015
4016 default:
4017 context->recordError(gl::Error(GL_INVALID_ENUM));
4018 return;
4019 }
4020
Geoff Langbfdea662014-07-23 14:16:32 -04004021 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4022 {
4023 context->getState().setStencilParams(func, ref, mask);
4024 }
4025
4026 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4027 {
4028 context->getState().setStencilBackParams(func, ref, mask);
4029 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004030 }
4031}
4032
Kenneth Russell67ea1902014-10-06 16:44:50 -07004033void GL_APIENTRY glStencilMask(GLuint mask)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004034{
4035 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4036}
4037
Kenneth Russell67ea1902014-10-06 16:44:50 -07004038void GL_APIENTRY glStencilMaskSeparate(GLenum face, GLuint mask)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004039{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004040 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004041
Geoff Langbfdea662014-07-23 14:16:32 -04004042 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004043 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004044 {
Geoff Langb1196682014-07-23 13:47:29 -04004045 switch (face)
4046 {
4047 case GL_FRONT:
4048 case GL_BACK:
4049 case GL_FRONT_AND_BACK:
4050 break;
4051
4052 default:
4053 context->recordError(gl::Error(GL_INVALID_ENUM));
4054 return;
4055 }
4056
Geoff Langbfdea662014-07-23 14:16:32 -04004057 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4058 {
4059 context->getState().setStencilWritemask(mask);
4060 }
4061
4062 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4063 {
4064 context->getState().setStencilBackWritemask(mask);
4065 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004066 }
4067}
4068
Kenneth Russell67ea1902014-10-06 16:44:50 -07004069void GL_APIENTRY glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004070{
4071 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4072}
4073
Kenneth Russell67ea1902014-10-06 16:44:50 -07004074void GL_APIENTRY glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004075{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004076 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 +00004077 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004078
Geoff Langbfdea662014-07-23 14:16:32 -04004079 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004080 if (context)
4081 {
Geoff Langb1196682014-07-23 13:47:29 -04004082 switch (face)
4083 {
4084 case GL_FRONT:
4085 case GL_BACK:
4086 case GL_FRONT_AND_BACK:
4087 break;
4088
4089 default:
4090 context->recordError(gl::Error(GL_INVALID_ENUM));
4091 return;
4092 }
4093
4094 switch (fail)
4095 {
4096 case GL_ZERO:
4097 case GL_KEEP:
4098 case GL_REPLACE:
4099 case GL_INCR:
4100 case GL_DECR:
4101 case GL_INVERT:
4102 case GL_INCR_WRAP:
4103 case GL_DECR_WRAP:
4104 break;
4105
4106 default:
4107 context->recordError(gl::Error(GL_INVALID_ENUM));
4108 return;
4109 }
4110
4111 switch (zfail)
4112 {
4113 case GL_ZERO:
4114 case GL_KEEP:
4115 case GL_REPLACE:
4116 case GL_INCR:
4117 case GL_DECR:
4118 case GL_INVERT:
4119 case GL_INCR_WRAP:
4120 case GL_DECR_WRAP:
4121 break;
4122
4123 default:
4124 context->recordError(gl::Error(GL_INVALID_ENUM));
4125 return;
4126 }
4127
4128 switch (zpass)
4129 {
4130 case GL_ZERO:
4131 case GL_KEEP:
4132 case GL_REPLACE:
4133 case GL_INCR:
4134 case GL_DECR:
4135 case GL_INVERT:
4136 case GL_INCR_WRAP:
4137 case GL_DECR_WRAP:
4138 break;
4139
4140 default:
4141 context->recordError(gl::Error(GL_INVALID_ENUM));
4142 return;
4143 }
4144
Geoff Langbfdea662014-07-23 14:16:32 -04004145 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4146 {
4147 context->getState().setStencilOperations(fail, zfail, zpass);
4148 }
4149
4150 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4151 {
4152 context->getState().setStencilBackOperations(fail, zfail, zpass);
4153 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004154 }
4155}
4156
Kenneth Russell67ea1902014-10-06 16:44:50 -07004157GLboolean GL_APIENTRY glTestFenceNV(GLuint fence)
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004158{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004159 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004160
Geoff Langbfdea662014-07-23 14:16:32 -04004161 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004162 if (context)
4163 {
4164 gl::FenceNV *fenceObject = context->getFenceNV(fence);
4165
4166 if (fenceObject == NULL)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004167 {
Geoff Langb1196682014-07-23 13:47:29 -04004168 context->recordError(gl::Error(GL_INVALID_OPERATION));
4169 return GL_TRUE;
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004170 }
Geoff Langbfdea662014-07-23 14:16:32 -04004171
4172 if (fenceObject->isFence() != GL_TRUE)
4173 {
Geoff Langb1196682014-07-23 13:47:29 -04004174 context->recordError(gl::Error(GL_INVALID_OPERATION));
4175 return GL_TRUE;
Geoff Langbfdea662014-07-23 14:16:32 -04004176 }
4177
Geoff Lang882033e2014-09-30 11:26:07 -04004178 GLboolean result;
4179 gl::Error error = fenceObject->testFence(&result);
4180 if (error.isError())
4181 {
4182 context->recordError(error);
4183 return GL_TRUE;
4184 }
4185
4186 return result;
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004187 }
Geoff Langbfdea662014-07-23 14:16:32 -04004188
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004189 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004190}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004191
Kenneth Russell67ea1902014-10-06 16:44:50 -07004192void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004193 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004194{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004195 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004196 "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 +00004197 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004198
Geoff Langbfdea662014-07-23 14:16:32 -04004199 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004200 if (context)
4201 {
4202 if (context->getClientVersion() < 3 &&
4203 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
4204 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004205 {
Geoff Langbfdea662014-07-23 14:16:32 -04004206 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004207 }
Geoff Langbfdea662014-07-23 14:16:32 -04004208
4209 if (context->getClientVersion() >= 3 &&
4210 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
4211 0, 0, 0, width, height, 1, border, format, type, pixels))
4212 {
4213 return;
4214 }
4215
4216 switch (target)
4217 {
4218 case GL_TEXTURE_2D:
4219 {
4220 gl::Texture2D *texture = context->getTexture2D();
Geoff Lang1ba6b8d2014-08-28 10:57:31 -04004221 gl::Error error = texture->setImage(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
4222 if (error.isError())
4223 {
4224 context->recordError(error);
4225 return;
4226 }
Geoff Langbfdea662014-07-23 14:16:32 -04004227 }
4228 break;
Geoff Lang8376cea2014-09-02 11:47:07 -04004229
Geoff Langbfdea662014-07-23 14:16:32 -04004230 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
Geoff Langbfdea662014-07-23 14:16:32 -04004231 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
Geoff Langbfdea662014-07-23 14:16:32 -04004232 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
Geoff Langbfdea662014-07-23 14:16:32 -04004233 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
Geoff Langbfdea662014-07-23 14:16:32 -04004234 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
Geoff Langbfdea662014-07-23 14:16:32 -04004235 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4236 {
4237 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Geoff Lang8376cea2014-09-02 11:47:07 -04004238 gl::Error error = texture->setImage(target, level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
Geoff Lang1ba6b8d2014-08-28 10:57:31 -04004239 if (error.isError())
4240 {
4241 context->recordError(error);
4242 return;
4243 }
Geoff Langbfdea662014-07-23 14:16:32 -04004244 }
4245 break;
Geoff Lang8376cea2014-09-02 11:47:07 -04004246
Geoff Langbfdea662014-07-23 14:16:32 -04004247 default: UNREACHABLE();
4248 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004249 }
4250}
4251
Kenneth Russell67ea1902014-10-06 16:44:50 -07004252void GL_APIENTRY glTexParameterf(GLenum target, GLenum pname, GLfloat param)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004253{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004254 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4255
Geoff Langbfdea662014-07-23 14:16:32 -04004256 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004257 if (context)
4258 {
4259 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004260 {
Geoff Langbfdea662014-07-23 14:16:32 -04004261 return;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004262 }
Geoff Langbfdea662014-07-23 14:16:32 -04004263
4264 gl::Texture *texture = context->getTargetTexture(target);
4265
4266 if (!texture)
4267 {
Geoff Langb1196682014-07-23 13:47:29 -04004268 context->recordError(gl::Error(GL_INVALID_ENUM));
4269 return;
Geoff Langbfdea662014-07-23 14:16:32 -04004270 }
4271
4272 switch (pname)
4273 {
4274 case GL_TEXTURE_WRAP_S: texture->getSamplerState().wrapS = gl::uiround<GLenum>(param); break;
4275 case GL_TEXTURE_WRAP_T: texture->getSamplerState().wrapT = gl::uiround<GLenum>(param); break;
4276 case GL_TEXTURE_WRAP_R: texture->getSamplerState().wrapR = gl::uiround<GLenum>(param); break;
4277 case GL_TEXTURE_MIN_FILTER: texture->getSamplerState().minFilter = gl::uiround<GLenum>(param); break;
4278 case GL_TEXTURE_MAG_FILTER: texture->getSamplerState().magFilter = gl::uiround<GLenum>(param); break;
4279 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
4280 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->getSamplerState().maxAnisotropy = std::min(param, context->getExtensions().maxTextureAnisotropy); break;
4281 case GL_TEXTURE_COMPARE_MODE: texture->getSamplerState().compareMode = gl::uiround<GLenum>(param); break;
4282 case GL_TEXTURE_COMPARE_FUNC: texture->getSamplerState().compareFunc = gl::uiround<GLenum>(param); break;
4283 case GL_TEXTURE_SWIZZLE_R: texture->getSamplerState().swizzleRed = gl::uiround<GLenum>(param); break;
4284 case GL_TEXTURE_SWIZZLE_G: texture->getSamplerState().swizzleGreen = gl::uiround<GLenum>(param); break;
4285 case GL_TEXTURE_SWIZZLE_B: texture->getSamplerState().swizzleBlue = gl::uiround<GLenum>(param); break;
4286 case GL_TEXTURE_SWIZZLE_A: texture->getSamplerState().swizzleAlpha = gl::uiround<GLenum>(param); break;
4287 case GL_TEXTURE_BASE_LEVEL: texture->getSamplerState().baseLevel = gl::iround<GLint>(param); break;
4288 case GL_TEXTURE_MAX_LEVEL: texture->getSamplerState().maxLevel = gl::iround<GLint>(param); break;
4289 case GL_TEXTURE_MIN_LOD: texture->getSamplerState().minLod = param; break;
4290 case GL_TEXTURE_MAX_LOD: texture->getSamplerState().maxLod = param; break;
4291 default: UNREACHABLE(); break;
4292 }
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004293 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004294}
4295
Kenneth Russell67ea1902014-10-06 16:44:50 -07004296void GL_APIENTRY glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004297{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004298 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004299}
4300
Kenneth Russell67ea1902014-10-06 16:44:50 -07004301void GL_APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004302{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004303 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004304
Geoff Langbfdea662014-07-23 14:16:32 -04004305 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004306 if (context)
4307 {
4308 if (!ValidateTexParamParameters(context, pname, param))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004309 {
Geoff Langbfdea662014-07-23 14:16:32 -04004310 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004311 }
Geoff Langbfdea662014-07-23 14:16:32 -04004312
4313 gl::Texture *texture = context->getTargetTexture(target);
4314
4315 if (!texture)
4316 {
Geoff Langb1196682014-07-23 13:47:29 -04004317 context->recordError(gl::Error(GL_INVALID_ENUM));
4318 return;
Geoff Langbfdea662014-07-23 14:16:32 -04004319 }
4320
4321 switch (pname)
4322 {
4323 case GL_TEXTURE_WRAP_S: texture->getSamplerState().wrapS = (GLenum)param; break;
4324 case GL_TEXTURE_WRAP_T: texture->getSamplerState().wrapT = (GLenum)param; break;
4325 case GL_TEXTURE_WRAP_R: texture->getSamplerState().wrapR = (GLenum)param; break;
4326 case GL_TEXTURE_MIN_FILTER: texture->getSamplerState().minFilter = (GLenum)param; break;
4327 case GL_TEXTURE_MAG_FILTER: texture->getSamplerState().magFilter = (GLenum)param; break;
4328 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
4329 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->getSamplerState().maxAnisotropy = std::min((float)param, context->getExtensions().maxTextureAnisotropy); break;
4330 case GL_TEXTURE_COMPARE_MODE: texture->getSamplerState().compareMode = (GLenum)param; break;
4331 case GL_TEXTURE_COMPARE_FUNC: texture->getSamplerState().compareFunc = (GLenum)param; break;
4332 case GL_TEXTURE_SWIZZLE_R: texture->getSamplerState().swizzleRed = (GLenum)param; break;
4333 case GL_TEXTURE_SWIZZLE_G: texture->getSamplerState().swizzleGreen = (GLenum)param; break;
4334 case GL_TEXTURE_SWIZZLE_B: texture->getSamplerState().swizzleBlue = (GLenum)param; break;
4335 case GL_TEXTURE_SWIZZLE_A: texture->getSamplerState().swizzleAlpha = (GLenum)param; break;
4336 case GL_TEXTURE_BASE_LEVEL: texture->getSamplerState().baseLevel = param; break;
4337 case GL_TEXTURE_MAX_LEVEL: texture->getSamplerState().maxLevel = param; break;
4338 case GL_TEXTURE_MIN_LOD: texture->getSamplerState().minLod = (GLfloat)param; break;
4339 case GL_TEXTURE_MAX_LOD: texture->getSamplerState().maxLod = (GLfloat)param; break;
4340 default: UNREACHABLE(); break;
4341 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004342 }
4343}
4344
Kenneth Russell67ea1902014-10-06 16:44:50 -07004345void GL_APIENTRY glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004346{
4347 glTexParameteri(target, pname, *params);
4348}
4349
Kenneth Russell67ea1902014-10-06 16:44:50 -07004350void GL_APIENTRY glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00004351{
4352 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
4353 target, levels, internalformat, width, height);
4354
Geoff Langbfdea662014-07-23 14:16:32 -04004355 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004356 if (context)
4357 {
4358 if (!context->getExtensions().textureStorage)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00004359 {
Geoff Langb1196682014-07-23 13:47:29 -04004360 context->recordError(gl::Error(GL_INVALID_OPERATION));
4361 return;
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00004362 }
Geoff Langbfdea662014-07-23 14:16:32 -04004363
4364 if (context->getClientVersion() < 3 &&
4365 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
4366 {
4367 return;
4368 }
4369
4370 if (context->getClientVersion() >= 3 &&
4371 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
4372 {
4373 return;
4374 }
4375
4376 switch (target)
4377 {
4378 case GL_TEXTURE_2D:
4379 {
4380 gl::Texture2D *texture2d = context->getTexture2D();
4381 texture2d->storage(levels, internalformat, width, height);
4382 }
4383 break;
4384
4385 case GL_TEXTURE_CUBE_MAP:
4386 {
4387 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
4388 textureCube->storage(levels, internalformat, width);
4389 }
4390 break;
4391
4392 default:
Geoff Langb1196682014-07-23 13:47:29 -04004393 context->recordError(gl::Error(GL_INVALID_ENUM));
4394 return;
Geoff Langbfdea662014-07-23 14:16:32 -04004395 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00004396 }
4397}
4398
Kenneth Russell67ea1902014-10-06 16:44:50 -07004399void GL_APIENTRY glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004400 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004401{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004402 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004403 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004404 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004405 target, level, xoffset, yoffset, width, height, format, type, pixels);
4406
Geoff Langbfdea662014-07-23 14:16:32 -04004407 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004408 if (context)
4409 {
4410 if (context->getClientVersion() < 3 &&
4411 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
4412 xoffset, yoffset, width, height, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00004413 {
Geoff Langbfdea662014-07-23 14:16:32 -04004414 return;
daniel@transgaming.com00c75962010-03-11 20:36:15 +00004415 }
Geoff Langbfdea662014-07-23 14:16:32 -04004416
4417 if (context->getClientVersion() >= 3 &&
4418 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
4419 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
4420 {
4421 return;
4422 }
4423
4424 // Zero sized uploads are valid but no-ops
4425 if (width == 0 || height == 0)
4426 {
4427 return;
4428 }
4429
4430 switch (target)
4431 {
4432 case GL_TEXTURE_2D:
4433 {
4434 gl::Texture2D *texture = context->getTexture2D();
Geoff Lang1ba6b8d2014-08-28 10:57:31 -04004435 gl::Error error = texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getState().getUnpackState(), pixels);
4436 if (error.isError())
4437 {
4438 context->recordError(error);
4439 return;
4440 }
Geoff Langbfdea662014-07-23 14:16:32 -04004441 }
4442 break;
4443
4444 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
4445 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4446 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4447 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4448 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4449 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4450 {
4451 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Geoff Lang1ba6b8d2014-08-28 10:57:31 -04004452 gl::Error error = texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getState().getUnpackState(), pixels);
4453 if (error.isError())
4454 {
4455 context->recordError(error);
4456 return;
4457 }
Geoff Langbfdea662014-07-23 14:16:32 -04004458 }
4459 break;
4460
4461 default:
4462 UNREACHABLE();
4463 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004464 }
4465}
4466
Kenneth Russell67ea1902014-10-06 16:44:50 -07004467void GL_APIENTRY glUniform1f(GLint location, GLfloat x)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004468{
4469 glUniform1fv(location, 1, &x);
4470}
4471
Kenneth Russell67ea1902014-10-06 16:44:50 -07004472void GL_APIENTRY glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004474 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004475
Geoff Langbfdea662014-07-23 14:16:32 -04004476 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004477 if (context)
4478 {
4479 if (!ValidateUniform(context, GL_FLOAT, location, count))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004480 {
Geoff Langbfdea662014-07-23 14:16:32 -04004481 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004482 }
Geoff Langbfdea662014-07-23 14:16:32 -04004483
4484 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4485 programBinary->setUniform1fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004486 }
4487}
4488
Kenneth Russell67ea1902014-10-06 16:44:50 -07004489void GL_APIENTRY glUniform1i(GLint location, GLint x)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004490{
4491 glUniform1iv(location, 1, &x);
4492}
4493
Kenneth Russell67ea1902014-10-06 16:44:50 -07004494void GL_APIENTRY glUniform1iv(GLint location, GLsizei count, const GLint* v)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004495{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004496 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004497
Geoff Langbfdea662014-07-23 14:16:32 -04004498 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004499 if (context)
4500 {
4501 if (!ValidateUniform(context, GL_INT, location, count))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004502 {
Geoff Langbfdea662014-07-23 14:16:32 -04004503 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004504 }
Geoff Langbfdea662014-07-23 14:16:32 -04004505
4506 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4507 programBinary->setUniform1iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004508 }
4509}
4510
Kenneth Russell67ea1902014-10-06 16:44:50 -07004511void GL_APIENTRY glUniform2f(GLint location, GLfloat x, GLfloat y)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004512{
4513 GLfloat xy[2] = {x, y};
4514
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004515 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004516}
4517
Kenneth Russell67ea1902014-10-06 16:44:50 -07004518void GL_APIENTRY glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004519{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004520 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004521
Geoff Langbfdea662014-07-23 14:16:32 -04004522 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004523 if (context)
4524 {
4525 if (!ValidateUniform(context, GL_FLOAT_VEC2, location, count))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004526 {
Geoff Langbfdea662014-07-23 14:16:32 -04004527 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004528 }
Geoff Langbfdea662014-07-23 14:16:32 -04004529
4530 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4531 programBinary->setUniform2fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004532 }
4533}
4534
Kenneth Russell67ea1902014-10-06 16:44:50 -07004535void GL_APIENTRY glUniform2i(GLint location, GLint x, GLint y)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004536{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004537 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004538
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004539 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004540}
4541
Kenneth Russell67ea1902014-10-06 16:44:50 -07004542void GL_APIENTRY glUniform2iv(GLint location, GLsizei count, const GLint* v)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004543{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004544 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545
Geoff Langbfdea662014-07-23 14:16:32 -04004546 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004547 if (context)
4548 {
4549 if (!ValidateUniform(context, GL_INT_VEC2, location, count))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004550 {
Geoff Langbfdea662014-07-23 14:16:32 -04004551 return;
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004552 }
Geoff Langbfdea662014-07-23 14:16:32 -04004553
4554 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4555 programBinary->setUniform2iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004556 }
4557}
4558
Kenneth Russell67ea1902014-10-06 16:44:50 -07004559void GL_APIENTRY glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004560{
4561 GLfloat xyz[3] = {x, y, z};
4562
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004563 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004564}
4565
Kenneth Russell67ea1902014-10-06 16:44:50 -07004566void GL_APIENTRY glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004567{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004568 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004569
Geoff Langbfdea662014-07-23 14:16:32 -04004570 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004571 if (context)
4572 {
4573 if (!ValidateUniform(context, GL_FLOAT_VEC3, location, count))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004574 {
Geoff Langbfdea662014-07-23 14:16:32 -04004575 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004576 }
Geoff Langbfdea662014-07-23 14:16:32 -04004577
4578 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4579 programBinary->setUniform3fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004580 }
4581}
4582
Kenneth Russell67ea1902014-10-06 16:44:50 -07004583void GL_APIENTRY glUniform3i(GLint location, GLint x, GLint y, GLint z)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004584{
4585 GLint xyz[3] = {x, y, z};
4586
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004587 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004588}
4589
Kenneth Russell67ea1902014-10-06 16:44:50 -07004590void GL_APIENTRY glUniform3iv(GLint location, GLsizei count, const GLint* v)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004591{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004592 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593
Geoff Langbfdea662014-07-23 14:16:32 -04004594 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004595 if (context)
4596 {
4597 if (!ValidateUniform(context, GL_INT_VEC3, location, count))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004598 {
Geoff Langbfdea662014-07-23 14:16:32 -04004599 return;
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004600 }
Geoff Langbfdea662014-07-23 14:16:32 -04004601
4602 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4603 programBinary->setUniform3iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004604 }
4605}
4606
Kenneth Russell67ea1902014-10-06 16:44:50 -07004607void GL_APIENTRY glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004608{
4609 GLfloat xyzw[4] = {x, y, z, w};
4610
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004611 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004612}
4613
Kenneth Russell67ea1902014-10-06 16:44:50 -07004614void GL_APIENTRY glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004615{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004616 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004617
Geoff Langbfdea662014-07-23 14:16:32 -04004618 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004619 if (context)
4620 {
4621 if (!ValidateUniform(context, GL_FLOAT_VEC4, location, count))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004622 {
Geoff Langbfdea662014-07-23 14:16:32 -04004623 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004624 }
Geoff Langbfdea662014-07-23 14:16:32 -04004625
4626 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4627 programBinary->setUniform4fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004628 }
4629}
4630
Kenneth Russell67ea1902014-10-06 16:44:50 -07004631void GL_APIENTRY glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004632{
4633 GLint xyzw[4] = {x, y, z, w};
4634
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05004635 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004636}
4637
Kenneth Russell67ea1902014-10-06 16:44:50 -07004638void GL_APIENTRY glUniform4iv(GLint location, GLsizei count, const GLint* v)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004639{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004640 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004641
Geoff Langbfdea662014-07-23 14:16:32 -04004642 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004643 if (context)
4644 {
4645 if (!ValidateUniform(context, GL_INT_VEC4, location, count))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004646 {
Geoff Langbfdea662014-07-23 14:16:32 -04004647 return;
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004648 }
Geoff Langbfdea662014-07-23 14:16:32 -04004649
4650 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4651 programBinary->setUniform4iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004652 }
4653}
4654
Kenneth Russell67ea1902014-10-06 16:44:50 -07004655void GL_APIENTRY glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004656{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004657 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004658 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004659
Geoff Langbfdea662014-07-23 14:16:32 -04004660 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004661 if (context)
4662 {
4663 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004664 {
Geoff Langbfdea662014-07-23 14:16:32 -04004665 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004666 }
Geoff Langbfdea662014-07-23 14:16:32 -04004667
4668 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4669 programBinary->setUniformMatrix2fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004670 }
4671}
4672
Kenneth Russell67ea1902014-10-06 16:44:50 -07004673void GL_APIENTRY glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004674{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004675 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004676 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004677
Geoff Langbfdea662014-07-23 14:16:32 -04004678 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004679 if (context)
4680 {
4681 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004682 {
Geoff Langbfdea662014-07-23 14:16:32 -04004683 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004684 }
Geoff Langbfdea662014-07-23 14:16:32 -04004685
4686 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4687 programBinary->setUniformMatrix3fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004688 }
4689}
4690
Kenneth Russell67ea1902014-10-06 16:44:50 -07004691void GL_APIENTRY glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004692{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004693 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004694 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004695
Geoff Langbfdea662014-07-23 14:16:32 -04004696 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004697 if (context)
4698 {
4699 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004700 {
Geoff Langbfdea662014-07-23 14:16:32 -04004701 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004702 }
Geoff Langbfdea662014-07-23 14:16:32 -04004703
4704 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
4705 programBinary->setUniformMatrix4fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004706 }
4707}
4708
Kenneth Russell67ea1902014-10-06 16:44:50 -07004709void GL_APIENTRY glUseProgram(GLuint program)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004710{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004711 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004712
Geoff Langbfdea662014-07-23 14:16:32 -04004713 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004714 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004715 {
Geoff Langbfdea662014-07-23 14:16:32 -04004716 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004717
Geoff Langbfdea662014-07-23 14:16:32 -04004718 if (!programObject && program != 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004719 {
Geoff Langbfdea662014-07-23 14:16:32 -04004720 if (context->getShader(program))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004721 {
Geoff Langb1196682014-07-23 13:47:29 -04004722 context->recordError(gl::Error(GL_INVALID_OPERATION));
4723 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004724 }
Geoff Langbfdea662014-07-23 14:16:32 -04004725 else
4726 {
Geoff Langb1196682014-07-23 13:47:29 -04004727 context->recordError(gl::Error(GL_INVALID_VALUE));
4728 return;
Geoff Langbfdea662014-07-23 14:16:32 -04004729 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004730 }
Geoff Langbfdea662014-07-23 14:16:32 -04004731
4732 if (program != 0 && !programObject->isLinked())
4733 {
Geoff Langb1196682014-07-23 13:47:29 -04004734 context->recordError(gl::Error(GL_INVALID_OPERATION));
4735 return;
Geoff Langbfdea662014-07-23 14:16:32 -04004736 }
4737
4738 context->useProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004739 }
4740}
4741
Kenneth Russell67ea1902014-10-06 16:44:50 -07004742void GL_APIENTRY glValidateProgram(GLuint program)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004743{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004744 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004745
Geoff Langbfdea662014-07-23 14:16:32 -04004746 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004747 if (context)
4748 {
4749 gl::Program *programObject = context->getProgram(program);
4750
4751 if (!programObject)
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004752 {
Geoff Langbfdea662014-07-23 14:16:32 -04004753 if (context->getShader(program))
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004754 {
Geoff Langb1196682014-07-23 13:47:29 -04004755 context->recordError(gl::Error(GL_INVALID_OPERATION));
4756 return;
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004757 }
Geoff Langbfdea662014-07-23 14:16:32 -04004758 else
4759 {
Geoff Langb1196682014-07-23 13:47:29 -04004760 context->recordError(gl::Error(GL_INVALID_VALUE));
4761 return;
Geoff Langbfdea662014-07-23 14:16:32 -04004762 }
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004763 }
Geoff Langbfdea662014-07-23 14:16:32 -04004764
Brandon Jones43a53e22014-08-28 16:23:22 -07004765 programObject->validate(context->getCaps());
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004766 }
4767}
4768
Kenneth Russell67ea1902014-10-06 16:44:50 -07004769void GL_APIENTRY glVertexAttrib1f(GLuint index, GLfloat x)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004770{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004771 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004772
Geoff Langbfdea662014-07-23 14:16:32 -04004773 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004774 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004775 {
Geoff Langb1196682014-07-23 13:47:29 -04004776 if (index >= gl::MAX_VERTEX_ATTRIBS)
4777 {
4778 context->recordError(gl::Error(GL_INVALID_VALUE));
4779 return;
4780 }
4781
Geoff Langbfdea662014-07-23 14:16:32 -04004782 GLfloat vals[4] = { x, 0, 0, 1 };
4783 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004784 }
4785}
4786
Kenneth Russell67ea1902014-10-06 16:44:50 -07004787void GL_APIENTRY glVertexAttrib1fv(GLuint index, const GLfloat* values)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004788{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004789 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004790
Geoff Langbfdea662014-07-23 14:16:32 -04004791 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004792 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004793 {
Geoff Langb1196682014-07-23 13:47:29 -04004794 if (index >= gl::MAX_VERTEX_ATTRIBS)
4795 {
4796 context->recordError(gl::Error(GL_INVALID_VALUE));
4797 return;
4798 }
4799
Geoff Langbfdea662014-07-23 14:16:32 -04004800 GLfloat vals[4] = { values[0], 0, 0, 1 };
4801 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004802 }
4803}
4804
Kenneth Russell67ea1902014-10-06 16:44:50 -07004805void GL_APIENTRY glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004806{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004807 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004808
Geoff Langbfdea662014-07-23 14:16:32 -04004809 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004810 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004811 {
Geoff Langb1196682014-07-23 13:47:29 -04004812 if (index >= gl::MAX_VERTEX_ATTRIBS)
4813 {
4814 context->recordError(gl::Error(GL_INVALID_VALUE));
4815 return;
4816 }
4817
Geoff Langbfdea662014-07-23 14:16:32 -04004818 GLfloat vals[4] = { x, y, 0, 1 };
4819 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004820 }
4821}
4822
Kenneth Russell67ea1902014-10-06 16:44:50 -07004823void GL_APIENTRY glVertexAttrib2fv(GLuint index, const GLfloat* values)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004824{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004825 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004826
Geoff Langbfdea662014-07-23 14:16:32 -04004827 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004828 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004829 {
Geoff Langb1196682014-07-23 13:47:29 -04004830 if (index >= gl::MAX_VERTEX_ATTRIBS)
4831 {
4832 context->recordError(gl::Error(GL_INVALID_VALUE));
4833 return;
4834 }
4835
Geoff Langbfdea662014-07-23 14:16:32 -04004836 GLfloat vals[4] = { values[0], values[1], 0, 1 };
4837 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004838 }
4839}
4840
Kenneth Russell67ea1902014-10-06 16:44:50 -07004841void GL_APIENTRY glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004842{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004843 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 +00004844
Geoff Langbfdea662014-07-23 14:16:32 -04004845 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004846 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004847 {
Geoff Langb1196682014-07-23 13:47:29 -04004848 if (index >= gl::MAX_VERTEX_ATTRIBS)
4849 {
4850 context->recordError(gl::Error(GL_INVALID_VALUE));
4851 return;
4852 }
4853
Geoff Langbfdea662014-07-23 14:16:32 -04004854 GLfloat vals[4] = { x, y, z, 1 };
4855 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004856 }
4857}
4858
Kenneth Russell67ea1902014-10-06 16:44:50 -07004859void GL_APIENTRY glVertexAttrib3fv(GLuint index, const GLfloat* values)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004860{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004861 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004862
Geoff Langbfdea662014-07-23 14:16:32 -04004863 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004864 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004865 {
Geoff Langb1196682014-07-23 13:47:29 -04004866 if (index >= gl::MAX_VERTEX_ATTRIBS)
4867 {
4868 context->recordError(gl::Error(GL_INVALID_VALUE));
4869 return;
4870 }
4871
Geoff Langbfdea662014-07-23 14:16:32 -04004872 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
4873 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004874 }
4875}
4876
Kenneth Russell67ea1902014-10-06 16:44:50 -07004877void GL_APIENTRY glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004878{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004879 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 +00004880
Geoff Langbfdea662014-07-23 14:16:32 -04004881 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004882 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004883 {
Geoff Langb1196682014-07-23 13:47:29 -04004884 if (index >= gl::MAX_VERTEX_ATTRIBS)
4885 {
4886 context->recordError(gl::Error(GL_INVALID_VALUE));
4887 return;
4888 }
4889
Geoff Langbfdea662014-07-23 14:16:32 -04004890 GLfloat vals[4] = { x, y, z, w };
4891 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004892 }
4893}
4894
Kenneth Russell67ea1902014-10-06 16:44:50 -07004895void GL_APIENTRY glVertexAttrib4fv(GLuint index, const GLfloat* values)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004896{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004897 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004898
Geoff Langbfdea662014-07-23 14:16:32 -04004899 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004900 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004901 {
Geoff Langb1196682014-07-23 13:47:29 -04004902 if (index >= gl::MAX_VERTEX_ATTRIBS)
4903 {
4904 context->recordError(gl::Error(GL_INVALID_VALUE));
4905 return;
4906 }
4907
Geoff Langbfdea662014-07-23 14:16:32 -04004908 context->getState().setVertexAttribf(index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004909 }
4910}
4911
Kenneth Russell67ea1902014-10-06 16:44:50 -07004912void GL_APIENTRY glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004913{
4914 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
4915
Geoff Langbfdea662014-07-23 14:16:32 -04004916 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004917 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004918 {
Geoff Langb1196682014-07-23 13:47:29 -04004919 if (index >= gl::MAX_VERTEX_ATTRIBS)
4920 {
4921 context->recordError(gl::Error(GL_INVALID_VALUE));
4922 return;
4923 }
4924
Geoff Langbfdea662014-07-23 14:16:32 -04004925 context->setVertexAttribDivisor(index, divisor);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004926 }
4927}
4928
Kenneth Russell67ea1902014-10-06 16:44:50 -07004929void GL_APIENTRY glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004930{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004931 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004932 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004933 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004934
Geoff Langbfdea662014-07-23 14:16:32 -04004935 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04004936 if (context)
4937 {
Geoff Langb1196682014-07-23 13:47:29 -04004938 if (index >= gl::MAX_VERTEX_ATTRIBS)
4939 {
4940 context->recordError(gl::Error(GL_INVALID_VALUE));
4941 return;
4942 }
4943
4944 if (size < 1 || size > 4)
4945 {
4946 context->recordError(gl::Error(GL_INVALID_VALUE));
4947 return;
4948 }
4949
4950 switch (type)
4951 {
4952 case GL_BYTE:
4953 case GL_UNSIGNED_BYTE:
4954 case GL_SHORT:
4955 case GL_UNSIGNED_SHORT:
4956 case GL_FIXED:
4957 case GL_FLOAT:
4958 break;
4959
4960 case GL_HALF_FLOAT:
4961 case GL_INT:
4962 case GL_UNSIGNED_INT:
4963 case GL_INT_2_10_10_10_REV:
4964 case GL_UNSIGNED_INT_2_10_10_10_REV:
4965 if (context->getClientVersion() < 3)
4966 {
4967 context->recordError(gl::Error(GL_INVALID_ENUM));
4968 return;
4969 }
4970 break;
4971
4972 default:
4973 context->recordError(gl::Error(GL_INVALID_ENUM));
4974 return;
4975 }
4976
4977 if (stride < 0)
4978 {
4979 context->recordError(gl::Error(GL_INVALID_VALUE));
4980 return;
4981 }
4982
4983 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
4984 {
4985 context->recordError(gl::Error(GL_INVALID_OPERATION));
4986 return;
4987 }
4988
Geoff Langbfdea662014-07-23 14:16:32 -04004989 // [OpenGL ES 3.0.2] Section 2.8 page 24:
4990 // An INVALID_OPERATION error is generated when a non-zero vertex array object
4991 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
4992 // and the pointer argument is not NULL.
4993 if (context->getState().getVertexArray()->id() != 0 && context->getState().getArrayBufferId() == 0 && ptr != NULL)
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00004994 {
Geoff Langb1196682014-07-23 13:47:29 -04004995 context->recordError(gl::Error(GL_INVALID_OPERATION));
4996 return;
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00004997 }
4998
Geoff Langbfdea662014-07-23 14:16:32 -04004999 context->getState().setVertexAttribState(index, context->getState().getTargetBuffer(GL_ARRAY_BUFFER), size, type,
5000 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005001 }
5002}
5003
Kenneth Russell67ea1902014-10-06 16:44:50 -07005004void GL_APIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005005{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005006 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 +00005007
Geoff Langbfdea662014-07-23 14:16:32 -04005008 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005009 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005010 {
Geoff Langb1196682014-07-23 13:47:29 -04005011 if (width < 0 || height < 0)
5012 {
5013 context->recordError(gl::Error(GL_INVALID_VALUE));
5014 return;
5015 }
5016
Geoff Langbfdea662014-07-23 14:16:32 -04005017 context->getState().setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005018 }
5019}
5020
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005021// OpenGL ES 3.0 functions
5022
Kenneth Russell67ea1902014-10-06 16:44:50 -07005023void GL_APIENTRY glReadBuffer(GLenum mode)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005024{
5025 EVENT("(GLenum mode = 0x%X)", mode);
5026
Geoff Langbfdea662014-07-23 14:16:32 -04005027 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005028 if (context)
5029 {
5030 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005031 {
Geoff Langb1196682014-07-23 13:47:29 -04005032 context->recordError(gl::Error(GL_INVALID_OPERATION));
5033 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005034 }
Geoff Langbfdea662014-07-23 14:16:32 -04005035
5036 // glReadBuffer
5037 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005038 }
5039}
5040
Kenneth Russell67ea1902014-10-06 16:44:50 -07005041void GL_APIENTRY glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005042{
5043 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
5044 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
5045
Geoff Langbfdea662014-07-23 14:16:32 -04005046 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005047 if (context)
5048 {
5049 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005050 {
Geoff Langb1196682014-07-23 13:47:29 -04005051 context->recordError(gl::Error(GL_INVALID_OPERATION));
5052 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005053 }
Geoff Langbfdea662014-07-23 14:16:32 -04005054
5055 // glDrawRangeElements
5056 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005057 }
5058}
5059
Kenneth Russell67ea1902014-10-06 16:44:50 -07005060void GL_APIENTRY glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005061{
5062 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
5063 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
5064 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5065 target, level, internalformat, width, height, depth, border, format, type, pixels);
5066
Geoff Langbfdea662014-07-23 14:16:32 -04005067 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005068 if (context)
5069 {
5070 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005071 {
Geoff Langb1196682014-07-23 13:47:29 -04005072 context->recordError(gl::Error(GL_INVALID_OPERATION));
5073 return;
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005074 }
Geoff Langbfdea662014-07-23 14:16:32 -04005075
5076 // validateES3TexImageFormat sets the error code if there is an error
5077 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
5078 0, 0, 0, width, height, depth, border, format, type, pixels))
5079 {
5080 return;
5081 }
5082
5083 switch(target)
5084 {
5085 case GL_TEXTURE_3D:
5086 {
5087 gl::Texture3D *texture = context->getTexture3D();
Geoff Lang1ba6b8d2014-08-28 10:57:31 -04005088 gl::Error error = texture->setImage(level, width, height, depth, internalformat, format, type, context->getState().getUnpackState(), pixels);
5089 if (error.isError())
5090 {
5091 context->recordError(error);
5092 return;
5093 }
Geoff Langbfdea662014-07-23 14:16:32 -04005094 }
5095 break;
5096
5097 case GL_TEXTURE_2D_ARRAY:
5098 {
5099 gl::Texture2DArray *texture = context->getTexture2DArray();
Geoff Lang1ba6b8d2014-08-28 10:57:31 -04005100 gl::Error error = texture->setImage(level, width, height, depth, internalformat, format, type, context->getState().getUnpackState(), pixels);
5101 if (error.isError())
5102 {
5103 context->recordError(error);
5104 return;
5105 }
Geoff Langbfdea662014-07-23 14:16:32 -04005106 }
5107 break;
5108
5109 default:
Geoff Langb1196682014-07-23 13:47:29 -04005110 context->recordError(gl::Error(GL_INVALID_ENUM));
5111 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005112 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005113 }
5114}
5115
Kenneth Russell67ea1902014-10-06 16:44:50 -07005116void GL_APIENTRY glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005117{
5118 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
5119 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
5120 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5121 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
5122
Geoff Langbfdea662014-07-23 14:16:32 -04005123 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005124 if (context)
5125 {
5126 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005127 {
Geoff Langb1196682014-07-23 13:47:29 -04005128 context->recordError(gl::Error(GL_INVALID_OPERATION));
5129 return;
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005130 }
Geoff Langbfdea662014-07-23 14:16:32 -04005131
5132 // validateES3TexImageFormat sets the error code if there is an error
5133 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
5134 xoffset, yoffset, zoffset, width, height, depth, 0,
5135 format, type, pixels))
5136 {
5137 return;
5138 }
5139
5140 // Zero sized uploads are valid but no-ops
5141 if (width == 0 || height == 0 || depth == 0)
5142 {
5143 return;
5144 }
5145
5146 switch(target)
5147 {
5148 case GL_TEXTURE_3D:
5149 {
5150 gl::Texture3D *texture = context->getTexture3D();
Geoff Lang1ba6b8d2014-08-28 10:57:31 -04005151 gl::Error error = texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getState().getUnpackState(), pixels);
5152 if (error.isError())
5153 {
5154 context->recordError(error);
5155 return;
5156 }
Geoff Langbfdea662014-07-23 14:16:32 -04005157 }
5158 break;
5159
5160 case GL_TEXTURE_2D_ARRAY:
5161 {
5162 gl::Texture2DArray *texture = context->getTexture2DArray();
Geoff Lang1ba6b8d2014-08-28 10:57:31 -04005163 gl::Error error = texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getState().getUnpackState(), pixels);
5164 if (error.isError())
5165 {
5166 context->recordError(error);
5167 return;
5168 }
Geoff Langbfdea662014-07-23 14:16:32 -04005169 }
5170 break;
5171
5172 default:
Geoff Langb1196682014-07-23 13:47:29 -04005173 context->recordError(gl::Error(GL_INVALID_ENUM));
5174 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005175 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005176 }
5177}
5178
Kenneth Russell67ea1902014-10-06 16:44:50 -07005179void GL_APIENTRY glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005180{
5181 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
5182 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
5183 target, level, xoffset, yoffset, zoffset, x, y, width, height);
5184
Geoff Langbfdea662014-07-23 14:16:32 -04005185 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005186 if (context)
5187 {
5188 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005189 {
Geoff Langb1196682014-07-23 13:47:29 -04005190 context->recordError(gl::Error(GL_INVALID_OPERATION));
5191 return;
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005192 }
Geoff Langbfdea662014-07-23 14:16:32 -04005193
5194 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset, yoffset, zoffset,
5195 x, y, width, height, 0))
5196 {
5197 return;
5198 }
5199
5200 gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
5201 gl::Texture *texture = NULL;
5202 switch (target)
5203 {
5204 case GL_TEXTURE_3D:
5205 texture = context->getTexture3D();
5206 break;
5207
5208 case GL_TEXTURE_2D_ARRAY:
5209 texture = context->getTexture2DArray();
5210 break;
5211
5212 default:
Geoff Langb1196682014-07-23 13:47:29 -04005213 context->recordError(gl::Error(GL_INVALID_ENUM));
5214 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005215 }
5216
Geoff Langef7b0162014-09-04 13:29:23 -04005217 gl::Error error = texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
5218 if (error.isError())
5219 {
5220 context->recordError(error);
5221 return;
5222 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005223 }
5224}
5225
Kenneth Russell67ea1902014-10-06 16:44:50 -07005226void GL_APIENTRY glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005227{
Geoff Langeef52cc2013-10-16 15:07:39 -04005228 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 +00005229 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
5230 "const GLvoid* data = 0x%0.8p)",
5231 target, level, internalformat, width, height, depth, border, imageSize, data);
5232
Geoff Langbfdea662014-07-23 14:16:32 -04005233 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005234 if (context)
5235 {
5236 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005237 {
Geoff Langb1196682014-07-23 13:47:29 -04005238 context->recordError(gl::Error(GL_INVALID_OPERATION));
5239 return;
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005240 }
Geoff Langbfdea662014-07-23 14:16:32 -04005241
Geoff Lang5d601382014-07-22 15:14:06 -04005242 const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalformat);
5243 if (imageSize < 0 || static_cast<GLuint>(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
Geoff Langbfdea662014-07-23 14:16:32 -04005244 {
Geoff Langb1196682014-07-23 13:47:29 -04005245 context->recordError(gl::Error(GL_INVALID_VALUE));
5246 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005247 }
5248
5249 // validateES3TexImageFormat sets the error code if there is an error
5250 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
5251 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
5252 {
5253 return;
5254 }
5255
5256 switch(target)
5257 {
5258 case GL_TEXTURE_3D:
5259 {
5260 gl::Texture3D *texture = context->getTexture3D();
Geoff Langb5348332014-09-02 13:16:34 -04005261 gl::Error error = texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
5262 if (error.isError())
5263 {
5264 context->recordError(error);
5265 return;
5266 }
Geoff Langbfdea662014-07-23 14:16:32 -04005267 }
5268 break;
5269
5270 case GL_TEXTURE_2D_ARRAY:
5271 {
5272 gl::Texture2DArray *texture = context->getTexture2DArray();
Geoff Langb5348332014-09-02 13:16:34 -04005273 gl::Error error = texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
5274 if (error.isError())
5275 {
5276 context->recordError(error);
5277 return;
5278 }
Geoff Langbfdea662014-07-23 14:16:32 -04005279 }
5280 break;
5281
5282 default:
Geoff Langb1196682014-07-23 13:47:29 -04005283 context->recordError(gl::Error(GL_INVALID_ENUM));
5284 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005285 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005286 }
5287}
5288
Kenneth Russell67ea1902014-10-06 16:44:50 -07005289void GL_APIENTRY glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005290{
5291 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
5292 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
5293 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
5294 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
5295
Geoff Langbfdea662014-07-23 14:16:32 -04005296 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005297 if (context)
5298 {
5299 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005300 {
Geoff Langb1196682014-07-23 13:47:29 -04005301 context->recordError(gl::Error(GL_INVALID_OPERATION));
5302 return;
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005303 }
Geoff Langbfdea662014-07-23 14:16:32 -04005304
Geoff Lang5d601382014-07-22 15:14:06 -04005305 const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(format);
5306 if (imageSize < 0 || static_cast<GLuint>(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
Geoff Langbfdea662014-07-23 14:16:32 -04005307 {
Geoff Langb1196682014-07-23 13:47:29 -04005308 context->recordError(gl::Error(GL_INVALID_VALUE));
5309 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005310 }
5311
5312 if (!data)
5313 {
Geoff Langb1196682014-07-23 13:47:29 -04005314 context->recordError(gl::Error(GL_INVALID_VALUE));
5315 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005316 }
5317
5318 // validateES3TexImageFormat sets the error code if there is an error
5319 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
5320 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
5321 {
5322 return;
5323 }
5324
5325 // Zero sized uploads are valid but no-ops
5326 if (width == 0 || height == 0)
5327 {
5328 return;
5329 }
5330
5331 switch(target)
5332 {
5333 case GL_TEXTURE_3D:
5334 {
5335 gl::Texture3D *texture = context->getTexture3D();
Geoff Langb5348332014-09-02 13:16:34 -04005336 gl::Error error = texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
5337 format, imageSize, data);
5338 if (error.isError())
5339 {
5340 context->recordError(error);
5341 return;
5342 }
Geoff Langbfdea662014-07-23 14:16:32 -04005343 }
5344 break;
5345
5346 case GL_TEXTURE_2D_ARRAY:
5347 {
5348 gl::Texture2DArray *texture = context->getTexture2DArray();
Geoff Langb5348332014-09-02 13:16:34 -04005349 gl::Error error = texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
5350 format, imageSize, data);
5351 if (error.isError())
5352 {
5353 context->recordError(error);
5354 return;
5355 }
Geoff Langbfdea662014-07-23 14:16:32 -04005356 }
5357 break;
5358
Geoff Langb1196682014-07-23 13:47:29 -04005359 default:
5360 context->recordError(gl::Error(GL_INVALID_ENUM));
5361 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005362 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005363 }
5364}
5365
Kenneth Russell67ea1902014-10-06 16:44:50 -07005366void GL_APIENTRY glGenQueries(GLsizei n, GLuint* ids)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005367{
5368 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
5369
Geoff Langbfdea662014-07-23 14:16:32 -04005370 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005371 if (context)
5372 {
5373 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005374 {
Geoff Langb1196682014-07-23 13:47:29 -04005375 context->recordError(gl::Error(GL_INVALID_OPERATION));
5376 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005377 }
Geoff Langbfdea662014-07-23 14:16:32 -04005378
5379 if (n < 0)
5380 {
Geoff Langb1196682014-07-23 13:47:29 -04005381 context->recordError(gl::Error(GL_INVALID_VALUE));
5382 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005383 }
5384
5385 for (GLsizei i = 0; i < n; i++)
5386 {
5387 ids[i] = context->createQuery();
5388 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005389 }
5390}
5391
Kenneth Russell67ea1902014-10-06 16:44:50 -07005392void GL_APIENTRY glDeleteQueries(GLsizei n, const GLuint* ids)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005393{
5394 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
5395
Geoff Langbfdea662014-07-23 14:16:32 -04005396 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005397 if (context)
5398 {
5399 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005400 {
Geoff Langb1196682014-07-23 13:47:29 -04005401 context->recordError(gl::Error(GL_INVALID_OPERATION));
5402 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005403 }
Geoff Langbfdea662014-07-23 14:16:32 -04005404
5405 if (n < 0)
5406 {
Geoff Langb1196682014-07-23 13:47:29 -04005407 context->recordError(gl::Error(GL_INVALID_VALUE));
5408 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005409 }
5410
5411 for (GLsizei i = 0; i < n; i++)
5412 {
5413 context->deleteQuery(ids[i]);
5414 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005415 }
5416}
5417
Kenneth Russell67ea1902014-10-06 16:44:50 -07005418GLboolean GL_APIENTRY glIsQuery(GLuint id)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005419{
5420 EVENT("(GLuint id = %u)", id);
5421
Geoff Langbfdea662014-07-23 14:16:32 -04005422 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005423 if (context)
5424 {
5425 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005426 {
Geoff Langb1196682014-07-23 13:47:29 -04005427 context->recordError(gl::Error(GL_INVALID_OPERATION));
5428 return GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005429 }
Geoff Langbfdea662014-07-23 14:16:32 -04005430
5431 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005432 }
5433
5434 return GL_FALSE;
5435}
5436
Kenneth Russell67ea1902014-10-06 16:44:50 -07005437void GL_APIENTRY glBeginQuery(GLenum target, GLuint id)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005438{
5439 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
5440
Geoff Langbfdea662014-07-23 14:16:32 -04005441 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005442 if (context)
5443 {
5444 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005445 {
Geoff Langb1196682014-07-23 13:47:29 -04005446 context->recordError(gl::Error(GL_INVALID_OPERATION));
5447 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005448 }
Geoff Langbfdea662014-07-23 14:16:32 -04005449
5450 if (!ValidateBeginQuery(context, target, id))
5451 {
5452 return;
5453 }
Geoff Lang5aad9672014-09-08 11:10:42 -04005454
5455 gl::Error error = context->beginQuery(target, id);
5456 if (error.isError())
5457 {
5458 context->recordError(error);
5459 return;
5460 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005461 }
5462}
5463
Kenneth Russell67ea1902014-10-06 16:44:50 -07005464void GL_APIENTRY glEndQuery(GLenum target)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005465{
5466 EVENT("(GLenum target = 0x%X)", target);
5467
Geoff Langbfdea662014-07-23 14:16:32 -04005468 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005469 if (context)
5470 {
5471 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005472 {
Geoff Langb1196682014-07-23 13:47:29 -04005473 context->recordError(gl::Error(GL_INVALID_OPERATION));
5474 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005475 }
Geoff Langbfdea662014-07-23 14:16:32 -04005476
5477 if (!ValidateEndQuery(context, target))
5478 {
5479 return;
5480 }
5481
Geoff Lang5aad9672014-09-08 11:10:42 -04005482 gl::Error error = context->endQuery(target);
5483 if (error.isError())
5484 {
5485 context->recordError(error);
5486 return;
5487 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005488 }
5489}
5490
Kenneth Russell67ea1902014-10-06 16:44:50 -07005491void GL_APIENTRY glGetQueryiv(GLenum target, GLenum pname, GLint* params)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005492{
5493 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
5494
Geoff Langbfdea662014-07-23 14:16:32 -04005495 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005496 if (context)
5497 {
5498 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005499 {
Geoff Langb1196682014-07-23 13:47:29 -04005500 context->recordError(gl::Error(GL_INVALID_OPERATION));
5501 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005502 }
Geoff Langbfdea662014-07-23 14:16:32 -04005503
5504 if (!ValidQueryType(context, target))
5505 {
Geoff Langb1196682014-07-23 13:47:29 -04005506 context->recordError(gl::Error(GL_INVALID_ENUM));
5507 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005508 }
5509
5510 switch (pname)
5511 {
5512 case GL_CURRENT_QUERY:
5513 params[0] = static_cast<GLint>(context->getState().getActiveQueryId(target));
5514 break;
5515
5516 default:
Geoff Langb1196682014-07-23 13:47:29 -04005517 context->recordError(gl::Error(GL_INVALID_ENUM));
5518 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005519 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005520 }
5521}
5522
Kenneth Russell67ea1902014-10-06 16:44:50 -07005523void GL_APIENTRY glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005524{
5525 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
5526
Geoff Langbfdea662014-07-23 14:16:32 -04005527 gl::Context *context = gl::getNonLostContext();
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 Langb1196682014-07-23 13:47:29 -04005532 context->recordError(gl::Error(GL_INVALID_OPERATION));
5533 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005534 }
Geoff Langbfdea662014-07-23 14:16:32 -04005535
5536 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
5537
5538 if (!queryObject)
5539 {
Geoff Langb1196682014-07-23 13:47:29 -04005540 context->recordError(gl::Error(GL_INVALID_OPERATION));
5541 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005542 }
5543
5544 if (context->getState().getActiveQueryId(queryObject->getType()) == id)
5545 {
Geoff Langb1196682014-07-23 13:47:29 -04005546 context->recordError(gl::Error(GL_INVALID_OPERATION));
5547 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005548 }
5549
5550 switch(pname)
5551 {
Geoff Lang5aad9672014-09-08 11:10:42 -04005552 case GL_QUERY_RESULT_EXT:
5553 {
5554 gl::Error error = queryObject->getResult(params);
5555 if (error.isError())
5556 {
5557 context->recordError(error);
5558 return;
5559 }
5560 }
Geoff Langbfdea662014-07-23 14:16:32 -04005561 break;
Geoff Langb1196682014-07-23 13:47:29 -04005562
Geoff Lang5aad9672014-09-08 11:10:42 -04005563 case GL_QUERY_RESULT_AVAILABLE_EXT:
5564 {
5565 gl::Error error = queryObject->isResultAvailable(params);
5566 if (error.isError())
5567 {
5568 context->recordError(error);
5569 return;
5570 }
5571 }
Geoff Langbfdea662014-07-23 14:16:32 -04005572 break;
Geoff Langb1196682014-07-23 13:47:29 -04005573
Geoff Langbfdea662014-07-23 14:16:32 -04005574 default:
Geoff Langb1196682014-07-23 13:47:29 -04005575 context->recordError(gl::Error(GL_INVALID_ENUM));
5576 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005577 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005578 }
5579}
5580
Kenneth Russell67ea1902014-10-06 16:44:50 -07005581GLboolean GL_APIENTRY glUnmapBuffer(GLenum target)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005582{
5583 EVENT("(GLenum target = 0x%X)", target);
5584
Geoff Langbfdea662014-07-23 14:16:32 -04005585 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005586 if (context)
5587 {
5588 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005589 {
Geoff Langb1196682014-07-23 13:47:29 -04005590 context->recordError(gl::Error(GL_INVALID_OPERATION));
5591 return GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005592 }
Geoff Langbfdea662014-07-23 14:16:32 -04005593
5594 return glUnmapBufferOES(target);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005595 }
5596
5597 return GL_FALSE;
5598}
5599
Kenneth Russell67ea1902014-10-06 16:44:50 -07005600void GL_APIENTRY glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005601{
5602 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
5603
Geoff Langbfdea662014-07-23 14:16:32 -04005604 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005605 if (context)
5606 {
5607 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005608 {
Geoff Langb1196682014-07-23 13:47:29 -04005609 context->recordError(gl::Error(GL_INVALID_OPERATION));
5610 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005611 }
Geoff Langbfdea662014-07-23 14:16:32 -04005612
5613 glGetBufferPointervOES(target, pname, params);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005614 }
5615}
5616
Kenneth Russell67ea1902014-10-06 16:44:50 -07005617void GL_APIENTRY glDrawBuffers(GLsizei n, const GLenum* bufs)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005618{
Geoff Langbfdea662014-07-23 14:16:32 -04005619 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005620 if (context)
5621 {
5622 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005623 {
Geoff Langb1196682014-07-23 13:47:29 -04005624 context->recordError(gl::Error(GL_INVALID_OPERATION));
5625 return;
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00005626 }
Geoff Langbfdea662014-07-23 14:16:32 -04005627
5628 glDrawBuffersEXT(n, bufs);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005629 }
5630}
5631
Kenneth Russell67ea1902014-10-06 16:44:50 -07005632void GL_APIENTRY glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005633{
5634 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5635 location, count, transpose, value);
5636
Geoff Langbfdea662014-07-23 14:16:32 -04005637 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005638 if (context)
5639 {
5640 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005641 {
Geoff Langbfdea662014-07-23 14:16:32 -04005642 return;
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00005643 }
Geoff Langbfdea662014-07-23 14:16:32 -04005644
5645 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
5646 programBinary->setUniformMatrix2x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005647 }
5648}
5649
Kenneth Russell67ea1902014-10-06 16:44:50 -07005650void GL_APIENTRY glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005651{
5652 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5653 location, count, transpose, value);
5654
Geoff Langbfdea662014-07-23 14:16:32 -04005655 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005656 if (context)
5657 {
5658 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005659 {
Geoff Langbfdea662014-07-23 14:16:32 -04005660 return;
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00005661 }
Geoff Langbfdea662014-07-23 14:16:32 -04005662
5663 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
5664 programBinary->setUniformMatrix3x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005665 }
5666}
5667
Kenneth Russell67ea1902014-10-06 16:44:50 -07005668void GL_APIENTRY glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005669{
5670 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5671 location, count, transpose, value);
5672
Geoff Langbfdea662014-07-23 14:16:32 -04005673 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005674 if (context)
5675 {
5676 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005677 {
Geoff Langbfdea662014-07-23 14:16:32 -04005678 return;
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00005679 }
Geoff Langbfdea662014-07-23 14:16:32 -04005680
5681 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
5682 programBinary->setUniformMatrix2x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005683 }
5684}
5685
Kenneth Russell67ea1902014-10-06 16:44:50 -07005686void GL_APIENTRY glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005687{
5688 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5689 location, count, transpose, value);
5690
Geoff Langbfdea662014-07-23 14:16:32 -04005691 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005692 if (context)
5693 {
5694 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005695 {
Geoff Langbfdea662014-07-23 14:16:32 -04005696 return;
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00005697 }
Geoff Langbfdea662014-07-23 14:16:32 -04005698
5699 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
5700 programBinary->setUniformMatrix4x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005701 }
5702}
5703
Kenneth Russell67ea1902014-10-06 16:44:50 -07005704void GL_APIENTRY glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005705{
5706 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5707 location, count, transpose, value);
5708
Geoff Langbfdea662014-07-23 14:16:32 -04005709 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005710 if (context)
5711 {
5712 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005713 {
Geoff Langbfdea662014-07-23 14:16:32 -04005714 return;
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00005715 }
Geoff Langbfdea662014-07-23 14:16:32 -04005716
5717 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
5718 programBinary->setUniformMatrix3x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005719 }
5720}
5721
Kenneth Russell67ea1902014-10-06 16:44:50 -07005722void GL_APIENTRY glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005723{
5724 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5725 location, count, transpose, value);
5726
Geoff Langbfdea662014-07-23 14:16:32 -04005727 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005728 if (context)
5729 {
5730 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005731 {
Geoff Langbfdea662014-07-23 14:16:32 -04005732 return;
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00005733 }
Geoff Langbfdea662014-07-23 14:16:32 -04005734
5735 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
5736 programBinary->setUniformMatrix4x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005737 }
5738}
5739
Kenneth Russell67ea1902014-10-06 16:44:50 -07005740void GL_APIENTRY glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005741{
5742 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
5743 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
5744 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
5745
Geoff Langbfdea662014-07-23 14:16:32 -04005746 gl::Context *context = gl::getNonLostContext();
5747 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005748 {
Geoff Langbfdea662014-07-23 14:16:32 -04005749 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005750 {
Geoff Langb1196682014-07-23 13:47:29 -04005751 context->recordError(gl::Error(GL_INVALID_OPERATION));
5752 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005753 }
Geoff Langbfdea662014-07-23 14:16:32 -04005754
5755 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
5756 dstX0, dstY0, dstX1, dstY1, mask, filter,
5757 false))
5758 {
5759 return;
5760 }
5761
Geoff Lang64839152014-08-26 16:23:25 -04005762 gl::Error error = context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
5763 mask, filter);
5764 if (error.isError())
5765 {
5766 context->recordError(error);
5767 return;
5768 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005769 }
5770}
5771
Kenneth Russell67ea1902014-10-06 16:44:50 -07005772void GL_APIENTRY glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005773{
5774 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5775 target, samples, internalformat, width, height);
5776
Geoff Langbfdea662014-07-23 14:16:32 -04005777 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005778 if (context)
5779 {
5780 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005781 {
Geoff Langb1196682014-07-23 13:47:29 -04005782 context->recordError(gl::Error(GL_INVALID_OPERATION));
5783 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005784 }
Geoff Langbfdea662014-07-23 14:16:32 -04005785
5786 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
5787 width, height, false))
5788 {
5789 return;
5790 }
5791
5792 context->setRenderbufferStorage(width, height, internalformat, samples);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005793 }
5794}
5795
Kenneth Russell67ea1902014-10-06 16:44:50 -07005796void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005797{
5798 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
5799 target, attachment, texture, level, layer);
5800
Geoff Langbfdea662014-07-23 14:16:32 -04005801 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005802 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005803 {
Geoff Langbfdea662014-07-23 14:16:32 -04005804 if (!ValidateFramebufferTextureLayer(context, target, attachment, texture,
5805 level, layer))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005806 {
Geoff Langbfdea662014-07-23 14:16:32 -04005807 return;
5808 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04005809
Geoff Langbfdea662014-07-23 14:16:32 -04005810 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
5811 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04005812
Geoff Langbfdea662014-07-23 14:16:32 -04005813 gl::Texture *textureObject = context->getTexture(texture);
5814 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
Geoff Lang3ed0c482013-07-25 17:03:18 -04005815
Geoff Langbfdea662014-07-23 14:16:32 -04005816 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
5817 {
5818 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
5819 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
5820 }
5821 else
5822 {
5823 switch (attachment)
Geoff Lang3ed0c482013-07-25 17:03:18 -04005824 {
Geoff Langbfdea662014-07-23 14:16:32 -04005825 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
5826 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
5827 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
Geoff Lang3ed0c482013-07-25 17:03:18 -04005828 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005829 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005830 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005831}
5832
Kenneth Russell67ea1902014-10-06 16:44:50 -07005833GLvoid* GL_APIENTRY glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005834{
5835 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
5836 target, offset, length, access);
5837
Geoff Langbfdea662014-07-23 14:16:32 -04005838 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005839 if (context)
5840 {
5841 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005842 {
Geoff Langb1196682014-07-23 13:47:29 -04005843 context->recordError(gl::Error(GL_INVALID_OPERATION));
5844 return NULL;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005845 }
Geoff Langbfdea662014-07-23 14:16:32 -04005846
5847 return glMapBufferRangeEXT(target, offset, length, access);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005848 }
5849
5850 return NULL;
5851}
5852
Kenneth Russell67ea1902014-10-06 16:44:50 -07005853void GL_APIENTRY glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005854{
5855 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
5856
Geoff Langbfdea662014-07-23 14:16:32 -04005857 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005858 if (context)
5859 {
5860 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005861 {
Geoff Langb1196682014-07-23 13:47:29 -04005862 context->recordError(gl::Error(GL_INVALID_OPERATION));
5863 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005864 }
Geoff Langbfdea662014-07-23 14:16:32 -04005865
5866 glFlushMappedBufferRangeEXT(target, offset, length);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005867 }
5868}
5869
Kenneth Russell67ea1902014-10-06 16:44:50 -07005870void GL_APIENTRY glBindVertexArray(GLuint array)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005871{
5872 EVENT("(GLuint array = %u)", array);
5873
Geoff Langbfdea662014-07-23 14:16:32 -04005874 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005875 if (context)
5876 {
5877 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005878 {
Geoff Langb1196682014-07-23 13:47:29 -04005879 context->recordError(gl::Error(GL_INVALID_OPERATION));
5880 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005881 }
Geoff Langbfdea662014-07-23 14:16:32 -04005882
5883 gl::VertexArray *vao = context->getVertexArray(array);
5884
5885 if (!vao)
5886 {
5887 // The default VAO should always exist
5888 ASSERT(array != 0);
Geoff Langb1196682014-07-23 13:47:29 -04005889 context->recordError(gl::Error(GL_INVALID_OPERATION));
5890 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005891 }
5892
5893 context->bindVertexArray(array);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005894 }
5895}
5896
Kenneth Russell67ea1902014-10-06 16:44:50 -07005897void GL_APIENTRY glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005898{
5899 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
5900
Geoff Langbfdea662014-07-23 14:16:32 -04005901 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005902 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005903 {
Geoff Langbfdea662014-07-23 14:16:32 -04005904 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005905 {
Geoff Langb1196682014-07-23 13:47:29 -04005906 context->recordError(gl::Error(GL_INVALID_OPERATION));
5907 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005908 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005909
Geoff Langbfdea662014-07-23 14:16:32 -04005910 if (n < 0)
5911 {
Geoff Langb1196682014-07-23 13:47:29 -04005912 context->recordError(gl::Error(GL_INVALID_VALUE));
5913 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005914 }
Jamie Madilld1028542013-07-02 11:57:04 -04005915
Geoff Langbfdea662014-07-23 14:16:32 -04005916 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5917 {
5918 if (arrays[arrayIndex] != 0)
Jamie Madilld1028542013-07-02 11:57:04 -04005919 {
Geoff Langbfdea662014-07-23 14:16:32 -04005920 context->deleteVertexArray(arrays[arrayIndex]);
Jamie Madilld1028542013-07-02 11:57:04 -04005921 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005922 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005924}
5925
Kenneth Russell67ea1902014-10-06 16:44:50 -07005926void GL_APIENTRY glGenVertexArrays(GLsizei n, GLuint* arrays)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005927{
5928 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
5929
Geoff Langbfdea662014-07-23 14:16:32 -04005930 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005931 if (context)
5932 {
5933 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005934 {
Geoff Langb1196682014-07-23 13:47:29 -04005935 context->recordError(gl::Error(GL_INVALID_OPERATION));
5936 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005937 }
Geoff Langbfdea662014-07-23 14:16:32 -04005938
5939 if (n < 0)
5940 {
Geoff Langb1196682014-07-23 13:47:29 -04005941 context->recordError(gl::Error(GL_INVALID_VALUE));
5942 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005943 }
5944
5945 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5946 {
5947 arrays[arrayIndex] = context->createVertexArray();
5948 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005949 }
5950}
5951
Kenneth Russell67ea1902014-10-06 16:44:50 -07005952GLboolean GL_APIENTRY glIsVertexArray(GLuint array)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005953{
5954 EVENT("(GLuint array = %u)", array);
5955
Geoff Langbfdea662014-07-23 14:16:32 -04005956 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005957 if (context)
5958 {
5959 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005960 {
Geoff Langb1196682014-07-23 13:47:29 -04005961 context->recordError(gl::Error(GL_INVALID_OPERATION));
5962 return GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005963 }
Geoff Langbfdea662014-07-23 14:16:32 -04005964
5965 if (array == 0)
5966 {
5967 return GL_FALSE;
5968 }
5969
5970 gl::VertexArray *vao = context->getVertexArray(array);
5971
5972 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005973 }
5974
5975 return GL_FALSE;
5976}
5977
Kenneth Russell67ea1902014-10-06 16:44:50 -07005978void GL_APIENTRY glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005979{
5980 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
5981 target, index, data);
5982
Geoff Langbfdea662014-07-23 14:16:32 -04005983 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04005984 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005985 {
Geoff Langbfdea662014-07-23 14:16:32 -04005986 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005987 {
Geoff Langb1196682014-07-23 13:47:29 -04005988 context->recordError(gl::Error(GL_INVALID_OPERATION));
5989 return;
Geoff Langbfdea662014-07-23 14:16:32 -04005990 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005991
Geoff Lang3a61c322014-07-10 13:01:54 -04005992 const gl::Caps &caps = context->getCaps();
Geoff Langbfdea662014-07-23 14:16:32 -04005993 switch (target)
5994 {
5995 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
5996 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
5997 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
Geoff Lang05881a02014-07-10 14:05:30 -04005998 if (index >= caps.maxTransformFeedbackSeparateAttributes)
5999 {
Geoff Langb1196682014-07-23 13:47:29 -04006000 context->recordError(gl::Error(GL_INVALID_VALUE));
6001 return;
Geoff Lang05881a02014-07-10 14:05:30 -04006002 }
Geoff Langbfdea662014-07-23 14:16:32 -04006003 break;
Geoff Langb1196682014-07-23 13:47:29 -04006004
Geoff Langbfdea662014-07-23 14:16:32 -04006005 case GL_UNIFORM_BUFFER_START:
6006 case GL_UNIFORM_BUFFER_SIZE:
6007 case GL_UNIFORM_BUFFER_BINDING:
Geoff Lang3a61c322014-07-10 13:01:54 -04006008 if (index >= caps.maxCombinedUniformBlocks)
6009 {
Geoff Langb1196682014-07-23 13:47:29 -04006010 context->recordError(gl::Error(GL_INVALID_VALUE));
6011 return;
Geoff Lang3a61c322014-07-10 13:01:54 -04006012 }
Geoff Langbfdea662014-07-23 14:16:32 -04006013 break;
Geoff Langb1196682014-07-23 13:47:29 -04006014
Geoff Langbfdea662014-07-23 14:16:32 -04006015 default:
Geoff Langb1196682014-07-23 13:47:29 -04006016 context->recordError(gl::Error(GL_INVALID_ENUM));
6017 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006018 }
6019
6020 if (!(context->getIndexedIntegerv(target, index, data)))
6021 {
6022 GLenum nativeType;
6023 unsigned int numParams = 0;
6024 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
Geoff Langb1196682014-07-23 13:47:29 -04006025 {
6026 context->recordError(gl::Error(GL_INVALID_ENUM));
6027 return;
6028 }
Shannon Woods15934d52013-08-19 14:28:49 -04006029
Geoff Langbfdea662014-07-23 14:16:32 -04006030 if (numParams == 0)
Geoff Langb1196682014-07-23 13:47:29 -04006031 {
Geoff Langbfdea662014-07-23 14:16:32 -04006032 return; // it is known that pname is valid, but there are no parameters to return
Geoff Langb1196682014-07-23 13:47:29 -04006033 }
Geoff Langbfdea662014-07-23 14:16:32 -04006034
6035 if (nativeType == GL_INT_64_ANGLEX)
Shannon Woods15934d52013-08-19 14:28:49 -04006036 {
Geoff Langbfdea662014-07-23 14:16:32 -04006037 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
6038 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
6039 GLint64 *int64Params = new GLint64[numParams];
Shannon Woods15934d52013-08-19 14:28:49 -04006040
Geoff Langbfdea662014-07-23 14:16:32 -04006041 context->getIndexedInteger64v(target, index, int64Params);
Shannon Woods15934d52013-08-19 14:28:49 -04006042
Geoff Langbfdea662014-07-23 14:16:32 -04006043 for (unsigned int i = 0; i < numParams; ++i)
Shannon Woods15934d52013-08-19 14:28:49 -04006044 {
Geoff Langbfdea662014-07-23 14:16:32 -04006045 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
6046 data[i] = static_cast<GLint>(clampedValue);
Shannon Woods15934d52013-08-19 14:28:49 -04006047 }
Geoff Langbfdea662014-07-23 14:16:32 -04006048
6049 delete [] int64Params;
6050 }
6051 else
6052 {
6053 UNREACHABLE();
Shannon Woods15934d52013-08-19 14:28:49 -04006054 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006055 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006056 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006057}
6058
Kenneth Russell67ea1902014-10-06 16:44:50 -07006059void GL_APIENTRY glBeginTransformFeedback(GLenum primitiveMode)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006060{
6061 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
6062
Geoff Langbfdea662014-07-23 14:16:32 -04006063 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006064 if (context)
6065 {
6066 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006067 {
Geoff Langb1196682014-07-23 13:47:29 -04006068 context->recordError(gl::Error(GL_INVALID_OPERATION));
6069 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006070 }
Geoff Langbfdea662014-07-23 14:16:32 -04006071
6072 switch (primitiveMode)
6073 {
6074 case GL_TRIANGLES:
6075 case GL_LINES:
6076 case GL_POINTS:
6077 break;
Geoff Langb1196682014-07-23 13:47:29 -04006078
Geoff Langbfdea662014-07-23 14:16:32 -04006079 default:
Geoff Langb1196682014-07-23 13:47:29 -04006080 context->recordError(gl::Error(GL_INVALID_ENUM));
6081 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006082 }
6083
6084 gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
6085 ASSERT(transformFeedback != NULL);
6086
6087 if (transformFeedback->isStarted())
6088 {
Geoff Langb1196682014-07-23 13:47:29 -04006089 context->recordError(gl::Error(GL_INVALID_OPERATION));
6090 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006091 }
6092
6093 if (transformFeedback->isPaused())
6094 {
6095 transformFeedback->resume();
6096 }
6097 else
6098 {
6099 transformFeedback->start(primitiveMode);
6100 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006101 }
6102}
6103
Kenneth Russell67ea1902014-10-06 16:44:50 -07006104void GL_APIENTRY glEndTransformFeedback(void)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006105{
6106 EVENT("(void)");
6107
Geoff Langbfdea662014-07-23 14:16:32 -04006108 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006109 if (context)
6110 {
6111 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006112 {
Geoff Langb1196682014-07-23 13:47:29 -04006113 context->recordError(gl::Error(GL_INVALID_OPERATION));
6114 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006115 }
Geoff Langbfdea662014-07-23 14:16:32 -04006116
6117 gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
6118 ASSERT(transformFeedback != NULL);
6119
6120 if (!transformFeedback->isStarted())
6121 {
Geoff Langb1196682014-07-23 13:47:29 -04006122 context->recordError(gl::Error(GL_INVALID_OPERATION));
6123 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006124 }
6125
6126 transformFeedback->stop();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006127 }
6128}
6129
Kenneth Russell67ea1902014-10-06 16:44:50 -07006130void GL_APIENTRY glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006131{
6132 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
6133 target, index, buffer, offset, size);
6134
Geoff Langbfdea662014-07-23 14:16:32 -04006135 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006136 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006137 {
Geoff Langbfdea662014-07-23 14:16:32 -04006138 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006139 {
Geoff Langb1196682014-07-23 13:47:29 -04006140 context->recordError(gl::Error(GL_INVALID_OPERATION));
6141 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006142 }
6143
Geoff Lang3a61c322014-07-10 13:01:54 -04006144 const gl::Caps &caps = context->getCaps();
Geoff Langbfdea662014-07-23 14:16:32 -04006145 switch (target)
6146 {
6147 case GL_TRANSFORM_FEEDBACK_BUFFER:
Geoff Lang05881a02014-07-10 14:05:30 -04006148 if (index >= caps.maxTransformFeedbackSeparateAttributes)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006149 {
Geoff Langb1196682014-07-23 13:47:29 -04006150 context->recordError(gl::Error(GL_INVALID_VALUE));
6151 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006152 }
Geoff Langbfdea662014-07-23 14:16:32 -04006153 break;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006154
Geoff Langbfdea662014-07-23 14:16:32 -04006155 case GL_UNIFORM_BUFFER:
Geoff Lang3a61c322014-07-10 13:01:54 -04006156 if (index >= caps.maxUniformBufferBindings)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00006157 {
Geoff Langb1196682014-07-23 13:47:29 -04006158 context->recordError(gl::Error(GL_INVALID_VALUE));
6159 return;
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00006160 }
Geoff Langbfdea662014-07-23 14:16:32 -04006161 break;
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00006162
Geoff Langbfdea662014-07-23 14:16:32 -04006163 default:
Geoff Langb1196682014-07-23 13:47:29 -04006164 context->recordError(gl::Error(GL_INVALID_ENUM));
6165 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006166 }
6167
6168 if (buffer != 0 && size <= 0)
6169 {
Geoff Langb1196682014-07-23 13:47:29 -04006170 context->recordError(gl::Error(GL_INVALID_VALUE));
6171 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006172 }
6173
6174 switch (target)
6175 {
6176 case GL_TRANSFORM_FEEDBACK_BUFFER:
6177
6178 // size and offset must be a multiple of 4
6179 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00006180 {
Geoff Langb1196682014-07-23 13:47:29 -04006181 context->recordError(gl::Error(GL_INVALID_VALUE));
6182 return;
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00006183 }
6184
Geoff Langbfdea662014-07-23 14:16:32 -04006185 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
6186 context->bindGenericTransformFeedbackBuffer(buffer);
6187 break;
6188
6189 case GL_UNIFORM_BUFFER:
6190
6191 // it is an error to bind an offset not a multiple of the alignment
Geoff Lang3a61c322014-07-10 13:01:54 -04006192 if (buffer != 0 && (offset % caps.uniformBufferOffsetAlignment) != 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00006193 {
Geoff Langb1196682014-07-23 13:47:29 -04006194 context->recordError(gl::Error(GL_INVALID_VALUE));
6195 return;
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00006196 }
Geoff Langbfdea662014-07-23 14:16:32 -04006197
6198 context->bindIndexedUniformBuffer(buffer, index, offset, size);
6199 context->bindGenericUniformBuffer(buffer);
6200 break;
6201
6202 default:
6203 UNREACHABLE();
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00006204 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006205 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006206}
6207
Kenneth Russell67ea1902014-10-06 16:44:50 -07006208void GL_APIENTRY glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006209{
6210 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
6211 target, index, buffer);
6212
Geoff Langbfdea662014-07-23 14:16:32 -04006213 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006214 if (context)
6215 {
6216 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006217 {
Geoff Langb1196682014-07-23 13:47:29 -04006218 context->recordError(gl::Error(GL_INVALID_OPERATION));
6219 return;
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00006220 }
Geoff Langbfdea662014-07-23 14:16:32 -04006221
Geoff Lang3a61c322014-07-10 13:01:54 -04006222 const gl::Caps &caps = context->getCaps();
Geoff Langbfdea662014-07-23 14:16:32 -04006223 switch (target)
6224 {
6225 case GL_TRANSFORM_FEEDBACK_BUFFER:
Geoff Lang05881a02014-07-10 14:05:30 -04006226 if (index >= caps.maxTransformFeedbackSeparateAttributes)
Geoff Langbfdea662014-07-23 14:16:32 -04006227 {
Geoff Langb1196682014-07-23 13:47:29 -04006228 context->recordError(gl::Error(GL_INVALID_VALUE));
6229 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006230 }
6231 break;
6232
6233 case GL_UNIFORM_BUFFER:
Geoff Lang3a61c322014-07-10 13:01:54 -04006234 if (index >= caps.maxUniformBufferBindings)
Geoff Langbfdea662014-07-23 14:16:32 -04006235 {
Geoff Langb1196682014-07-23 13:47:29 -04006236 context->recordError(gl::Error(GL_INVALID_VALUE));
6237 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006238 }
6239 break;
6240
6241 default:
Geoff Langb1196682014-07-23 13:47:29 -04006242 context->recordError(gl::Error(GL_INVALID_ENUM));
6243 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006244 }
6245
6246 switch (target)
6247 {
6248 case GL_TRANSFORM_FEEDBACK_BUFFER:
6249 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
6250 context->bindGenericTransformFeedbackBuffer(buffer);
6251 break;
6252
6253 case GL_UNIFORM_BUFFER:
6254 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
6255 context->bindGenericUniformBuffer(buffer);
6256 break;
6257
6258 default:
6259 UNREACHABLE();
6260 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006261 }
6262}
6263
Kenneth Russell67ea1902014-10-06 16:44:50 -07006264void GL_APIENTRY glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006265{
6266 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
6267 program, count, varyings, bufferMode);
6268
Geoff Langbfdea662014-07-23 14:16:32 -04006269 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006270 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006271 {
Geoff Langbfdea662014-07-23 14:16:32 -04006272 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006273 {
Geoff Langb1196682014-07-23 13:47:29 -04006274 context->recordError(gl::Error(GL_INVALID_OPERATION));
6275 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006276 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006277
Geoff Langbfdea662014-07-23 14:16:32 -04006278 if (count < 0)
6279 {
Geoff Langb1196682014-07-23 13:47:29 -04006280 context->recordError(gl::Error(GL_INVALID_VALUE));
6281 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006282 }
6283
Geoff Lang05881a02014-07-10 14:05:30 -04006284 const gl::Caps &caps = context->getCaps();
Geoff Langbfdea662014-07-23 14:16:32 -04006285 switch (bufferMode)
6286 {
6287 case GL_INTERLEAVED_ATTRIBS:
6288 break;
6289 case GL_SEPARATE_ATTRIBS:
Geoff Lang05881a02014-07-10 14:05:30 -04006290 if (static_cast<GLuint>(count) > caps.maxTransformFeedbackSeparateAttributes)
Geoff Lang48dcae72014-02-05 16:28:24 -05006291 {
Geoff Langb1196682014-07-23 13:47:29 -04006292 context->recordError(gl::Error(GL_INVALID_VALUE));
6293 return;
Geoff Lang48dcae72014-02-05 16:28:24 -05006294 }
Geoff Langbfdea662014-07-23 14:16:32 -04006295 break;
6296 default:
Geoff Langb1196682014-07-23 13:47:29 -04006297 context->recordError(gl::Error(GL_INVALID_ENUM));
6298 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006299 }
Geoff Langbfdea662014-07-23 14:16:32 -04006300
6301 if (!gl::ValidProgram(context, program))
6302 {
6303 return;
6304 }
6305
6306 gl::Program *programObject = context->getProgram(program);
6307 ASSERT(programObject);
6308
6309 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006310 }
6311}
6312
Kenneth Russell67ea1902014-10-06 16:44:50 -07006313void GL_APIENTRY glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006314{
6315 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
6316 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
6317 program, index, bufSize, length, size, type, name);
6318
Geoff Langbfdea662014-07-23 14:16:32 -04006319 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006320 if (context)
6321 {
6322 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006323 {
Geoff Langb1196682014-07-23 13:47:29 -04006324 context->recordError(gl::Error(GL_INVALID_OPERATION));
6325 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006326 }
Geoff Langbfdea662014-07-23 14:16:32 -04006327
6328 if (bufSize < 0)
6329 {
Geoff Langb1196682014-07-23 13:47:29 -04006330 context->recordError(gl::Error(GL_INVALID_VALUE));
6331 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006332 }
6333
6334 if (!gl::ValidProgram(context, program))
6335 {
6336 return;
6337 }
6338
6339 gl::Program *programObject = context->getProgram(program);
6340 ASSERT(programObject);
6341
6342 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
6343 {
Geoff Langb1196682014-07-23 13:47:29 -04006344 context->recordError(gl::Error(GL_INVALID_VALUE));
6345 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006346 }
6347
6348 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006349 }
6350}
6351
Kenneth Russell67ea1902014-10-06 16:44:50 -07006352void GL_APIENTRY glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006353{
6354 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
6355 index, size, type, stride, pointer);
6356
Geoff Langbfdea662014-07-23 14:16:32 -04006357 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006358 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006359 {
Geoff Langbfdea662014-07-23 14:16:32 -04006360 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006361 {
Geoff Langb1196682014-07-23 13:47:29 -04006362 context->recordError(gl::Error(GL_INVALID_OPERATION));
6363 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006364 }
6365
Geoff Langb1196682014-07-23 13:47:29 -04006366 if (index >= gl::MAX_VERTEX_ATTRIBS)
6367 {
6368 context->recordError(gl::Error(GL_INVALID_VALUE));
6369 return;
6370 }
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006371
Geoff Langb1196682014-07-23 13:47:29 -04006372 if (size < 1 || size > 4)
6373 {
6374 context->recordError(gl::Error(GL_INVALID_VALUE));
6375 return;
6376 }
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006377
Geoff Langb1196682014-07-23 13:47:29 -04006378 switch (type)
6379 {
6380 case GL_BYTE:
6381 case GL_UNSIGNED_BYTE:
6382 case GL_SHORT:
6383 case GL_UNSIGNED_SHORT:
6384 case GL_INT:
6385 case GL_UNSIGNED_INT:
6386 case GL_INT_2_10_10_10_REV:
6387 case GL_UNSIGNED_INT_2_10_10_10_REV:
6388 break;
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006389
Geoff Langb1196682014-07-23 13:47:29 -04006390 default:
6391 context->recordError(gl::Error(GL_INVALID_ENUM));
6392 return;
6393 }
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006394
Geoff Langb1196682014-07-23 13:47:29 -04006395 if (stride < 0)
6396 {
6397 context->recordError(gl::Error(GL_INVALID_VALUE));
6398 return;
6399 }
Geoff Langbfdea662014-07-23 14:16:32 -04006400
Geoff Langb1196682014-07-23 13:47:29 -04006401 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6402 {
6403 context->recordError(gl::Error(GL_INVALID_OPERATION));
6404 return;
6405 }
6406
Geoff Langbfdea662014-07-23 14:16:32 -04006407 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6408 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6409 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6410 // and the pointer argument is not NULL.
6411 if (context->getState().getVertexArray()->id() != 0 && context->getState().getArrayBufferId() == 0 && pointer != NULL)
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006412 {
Geoff Langb1196682014-07-23 13:47:29 -04006413 context->recordError(gl::Error(GL_INVALID_OPERATION));
6414 return;
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006415 }
6416
Geoff Langbfdea662014-07-23 14:16:32 -04006417 context->getState().setVertexAttribState(index, context->getState().getTargetBuffer(GL_ARRAY_BUFFER), size, type, false, true,
6418 stride, pointer);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006419 }
6420}
6421
Kenneth Russell67ea1902014-10-06 16:44:50 -07006422void GL_APIENTRY glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006423{
6424 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
6425 index, pname, params);
6426
Geoff Langbfdea662014-07-23 14:16:32 -04006427 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006428 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006429 {
Geoff Langbfdea662014-07-23 14:16:32 -04006430 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006431 {
Geoff Langb1196682014-07-23 13:47:29 -04006432 context->recordError(gl::Error(GL_INVALID_OPERATION));
6433 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006434 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006435
Geoff Langbfdea662014-07-23 14:16:32 -04006436 if (index >= gl::MAX_VERTEX_ATTRIBS)
6437 {
Geoff Langb1196682014-07-23 13:47:29 -04006438 context->recordError(gl::Error(GL_INVALID_VALUE));
6439 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006440 }
Jamie Madilla7d05862013-07-02 11:57:06 -04006441
Geoff Langbfdea662014-07-23 14:16:32 -04006442 const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index);
Jamie Madilla7d05862013-07-02 11:57:06 -04006443
Geoff Langb1196682014-07-23 13:47:29 -04006444 if (!gl::ValidateGetVertexAttribParameters(context, pname))
Geoff Langbfdea662014-07-23 14:16:32 -04006445 {
6446 return;
6447 }
Jamie Madilla7d05862013-07-02 11:57:06 -04006448
Geoff Langbfdea662014-07-23 14:16:32 -04006449 if (pname == GL_CURRENT_VERTEX_ATTRIB)
6450 {
6451 const gl::VertexAttribCurrentValueData &currentValueData = context->getState().getVertexAttribCurrentValue(index);
6452 for (int i = 0; i < 4; ++i)
Jamie Madilla7d05862013-07-02 11:57:06 -04006453 {
Geoff Langbfdea662014-07-23 14:16:32 -04006454 params[i] = currentValueData.IntValues[i];
Jamie Madilla7d05862013-07-02 11:57:06 -04006455 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006456 }
Geoff Langbfdea662014-07-23 14:16:32 -04006457 else
6458 {
6459 *params = gl::QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
6460 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006461 }
6462}
6463
Kenneth Russell67ea1902014-10-06 16:44:50 -07006464void GL_APIENTRY glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006465{
6466 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
6467 index, pname, params);
6468
Geoff Langbfdea662014-07-23 14:16:32 -04006469 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006470 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006471 {
Geoff Langbfdea662014-07-23 14:16:32 -04006472 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006473 {
Geoff Langb1196682014-07-23 13:47:29 -04006474 context->recordError(gl::Error(GL_INVALID_OPERATION));
6475 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006476 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006477
Geoff Langbfdea662014-07-23 14:16:32 -04006478 if (index >= gl::MAX_VERTEX_ATTRIBS)
6479 {
Geoff Langb1196682014-07-23 13:47:29 -04006480 context->recordError(gl::Error(GL_INVALID_VALUE));
6481 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006482 }
Jamie Madilla7d05862013-07-02 11:57:06 -04006483
Geoff Langbfdea662014-07-23 14:16:32 -04006484 const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index);
Jamie Madilla7d05862013-07-02 11:57:06 -04006485
Geoff Langb1196682014-07-23 13:47:29 -04006486 if (!gl::ValidateGetVertexAttribParameters(context, pname))
Geoff Langbfdea662014-07-23 14:16:32 -04006487 {
6488 return;
6489 }
Jamie Madilla7d05862013-07-02 11:57:06 -04006490
Geoff Langbfdea662014-07-23 14:16:32 -04006491 if (pname == GL_CURRENT_VERTEX_ATTRIB)
6492 {
6493 const gl::VertexAttribCurrentValueData &currentValueData = context->getState().getVertexAttribCurrentValue(index);
6494 for (int i = 0; i < 4; ++i)
Jamie Madilla7d05862013-07-02 11:57:06 -04006495 {
Geoff Langbfdea662014-07-23 14:16:32 -04006496 params[i] = currentValueData.UnsignedIntValues[i];
Jamie Madilla7d05862013-07-02 11:57:06 -04006497 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006498 }
Geoff Langbfdea662014-07-23 14:16:32 -04006499 else
6500 {
6501 *params = gl::QuerySingleVertexAttributeParameter<GLuint>(attribState, pname);
6502 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006503 }
6504}
6505
Kenneth Russell67ea1902014-10-06 16:44:50 -07006506void GL_APIENTRY glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006507{
6508 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
6509 index, x, y, z, w);
6510
Geoff Langbfdea662014-07-23 14:16:32 -04006511 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006512 if (context)
6513 {
6514 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006515 {
Geoff Langb1196682014-07-23 13:47:29 -04006516 context->recordError(gl::Error(GL_INVALID_OPERATION));
6517 return;
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006518 }
Geoff Langbfdea662014-07-23 14:16:32 -04006519
6520 if (index >= gl::MAX_VERTEX_ATTRIBS)
6521 {
Geoff Langb1196682014-07-23 13:47:29 -04006522 context->recordError(gl::Error(GL_INVALID_VALUE));
6523 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006524 }
6525
6526 GLint vals[4] = { x, y, z, w };
6527 context->getState().setVertexAttribi(index, vals);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006528 }
6529}
6530
Kenneth Russell67ea1902014-10-06 16:44:50 -07006531void GL_APIENTRY glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006532{
6533 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
6534 index, x, y, z, w);
6535
Geoff Langbfdea662014-07-23 14:16:32 -04006536 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006537 if (context)
6538 {
6539 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006540 {
Geoff Langb1196682014-07-23 13:47:29 -04006541 context->recordError(gl::Error(GL_INVALID_OPERATION));
6542 return;
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006543 }
Geoff Langbfdea662014-07-23 14:16:32 -04006544
6545 if (index >= gl::MAX_VERTEX_ATTRIBS)
6546 {
Geoff Langb1196682014-07-23 13:47:29 -04006547 context->recordError(gl::Error(GL_INVALID_VALUE));
6548 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006549 }
6550
6551 GLuint vals[4] = { x, y, z, w };
6552 context->getState().setVertexAttribu(index, vals);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006553 }
6554}
6555
Kenneth Russell67ea1902014-10-06 16:44:50 -07006556void GL_APIENTRY glVertexAttribI4iv(GLuint index, const GLint* v)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006557{
6558 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
6559
Geoff Langbfdea662014-07-23 14:16:32 -04006560 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006561 if (context)
6562 {
6563 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006564 {
Geoff Langb1196682014-07-23 13:47:29 -04006565 context->recordError(gl::Error(GL_INVALID_OPERATION));
6566 return;
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006567 }
Geoff Langbfdea662014-07-23 14:16:32 -04006568
6569 if (index >= gl::MAX_VERTEX_ATTRIBS)
6570 {
Geoff Langb1196682014-07-23 13:47:29 -04006571 context->recordError(gl::Error(GL_INVALID_VALUE));
6572 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006573 }
6574
6575 context->getState().setVertexAttribi(index, v);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006576 }
6577}
6578
Kenneth Russell67ea1902014-10-06 16:44:50 -07006579void GL_APIENTRY glVertexAttribI4uiv(GLuint index, const GLuint* v)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006580{
6581 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
6582
Geoff Langbfdea662014-07-23 14:16:32 -04006583 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006584 if (context)
6585 {
6586 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006587 {
Geoff Langb1196682014-07-23 13:47:29 -04006588 context->recordError(gl::Error(GL_INVALID_OPERATION));
6589 return;
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006590 }
Geoff Langbfdea662014-07-23 14:16:32 -04006591
6592 if (index >= gl::MAX_VERTEX_ATTRIBS)
6593 {
Geoff Langb1196682014-07-23 13:47:29 -04006594 context->recordError(gl::Error(GL_INVALID_VALUE));
6595 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006596 }
6597
6598 context->getState().setVertexAttribu(index, v);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006599 }
6600}
6601
Kenneth Russell67ea1902014-10-06 16:44:50 -07006602void GL_APIENTRY glGetUniformuiv(GLuint program, GLint location, GLuint* params)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006603{
6604 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
6605 program, location, params);
6606
Geoff Langbfdea662014-07-23 14:16:32 -04006607 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006608 if (context)
6609 {
Jamie Madill0063c512014-08-25 15:47:53 -04006610 if (!ValidateGetUniformuiv(context, program, location, params))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006611 {
Jamie Madill0063c512014-08-25 15:47:53 -04006612 return;
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00006613 }
Geoff Langbfdea662014-07-23 14:16:32 -04006614
Jamie Madilla502c742014-08-28 17:19:13 -04006615 gl::Program *programObject = context->getProgram(program);
6616 ASSERT(programObject);
6617 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
Jamie Madill0063c512014-08-25 15:47:53 -04006618 ASSERT(programBinary);
Geoff Langbfdea662014-07-23 14:16:32 -04006619
Jamie Madill99a1e982014-08-25 15:47:54 -04006620 programBinary->getUniformuiv(location, params);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006621 }
6622}
6623
Kenneth Russell67ea1902014-10-06 16:44:50 -07006624GLint GL_APIENTRY glGetFragDataLocation(GLuint program, const GLchar *name)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006625{
6626 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
6627 program, name);
6628
Geoff Langbfdea662014-07-23 14:16:32 -04006629 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006630 if (context)
6631 {
6632 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006633 {
Geoff Langb1196682014-07-23 13:47:29 -04006634 context->recordError(gl::Error(GL_INVALID_OPERATION));
6635 return -1;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006636 }
Geoff Langbfdea662014-07-23 14:16:32 -04006637
6638 if (program == 0)
6639 {
Geoff Langb1196682014-07-23 13:47:29 -04006640 context->recordError(gl::Error(GL_INVALID_VALUE));
6641 return -1;
Geoff Langbfdea662014-07-23 14:16:32 -04006642 }
6643
6644 gl::Program *programObject = context->getProgram(program);
6645
6646 if (!programObject || !programObject->isLinked())
6647 {
Geoff Langb1196682014-07-23 13:47:29 -04006648 context->recordError(gl::Error(GL_INVALID_OPERATION));
6649 return -1;
Geoff Langbfdea662014-07-23 14:16:32 -04006650 }
6651
6652 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6653 if (!programBinary)
6654 {
Geoff Langb1196682014-07-23 13:47:29 -04006655 context->recordError(gl::Error(GL_INVALID_OPERATION));
6656 return -1;
Geoff Langbfdea662014-07-23 14:16:32 -04006657 }
6658
6659 return programBinary->getFragDataLocation(name);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006660 }
6661
6662 return 0;
6663}
6664
Kenneth Russell67ea1902014-10-06 16:44:50 -07006665void GL_APIENTRY glUniform1ui(GLint location, GLuint v0)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006666{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00006667 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006668}
6669
Kenneth Russell67ea1902014-10-06 16:44:50 -07006670void GL_APIENTRY glUniform2ui(GLint location, GLuint v0, GLuint v1)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006671{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00006672 const GLuint xy[] = { v0, v1 };
6673 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006674}
6675
Kenneth Russell67ea1902014-10-06 16:44:50 -07006676void GL_APIENTRY glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006677{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00006678 const GLuint xyz[] = { v0, v1, v2 };
6679 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006680}
6681
Kenneth Russell67ea1902014-10-06 16:44:50 -07006682void GL_APIENTRY glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006683{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00006684 const GLuint xyzw[] = { v0, v1, v2, v3 };
6685 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006686}
6687
Kenneth Russell67ea1902014-10-06 16:44:50 -07006688void GL_APIENTRY glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006689{
6690 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
6691 location, count, value);
6692
Geoff Langbfdea662014-07-23 14:16:32 -04006693 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006694 if (context)
6695 {
6696 if (!ValidateUniform(context, GL_UNSIGNED_INT, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006697 {
Geoff Langbfdea662014-07-23 14:16:32 -04006698 return;
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00006699 }
Geoff Langbfdea662014-07-23 14:16:32 -04006700
6701 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
6702 programBinary->setUniform1uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006703 }
6704}
6705
Kenneth Russell67ea1902014-10-06 16:44:50 -07006706void GL_APIENTRY glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006707{
6708 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
6709 location, count, value);
6710
Geoff Langbfdea662014-07-23 14:16:32 -04006711 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006712 if (context)
6713 {
6714 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC2, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006715 {
Geoff Langbfdea662014-07-23 14:16:32 -04006716 return;
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00006717 }
Geoff Langbfdea662014-07-23 14:16:32 -04006718
6719 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
6720 programBinary->setUniform2uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006721 }
6722}
6723
Kenneth Russell67ea1902014-10-06 16:44:50 -07006724void GL_APIENTRY glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006725{
6726 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
6727 location, count, value);
6728
Geoff Langbfdea662014-07-23 14:16:32 -04006729 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006730 if (context)
6731 {
6732 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC3, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006733 {
Geoff Langbfdea662014-07-23 14:16:32 -04006734 return;
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00006735 }
Geoff Langbfdea662014-07-23 14:16:32 -04006736
6737 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
6738 programBinary->setUniform3uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006739 }
6740}
6741
Kenneth Russell67ea1902014-10-06 16:44:50 -07006742void GL_APIENTRY glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006743{
6744 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
6745 location, count, value);
6746
Geoff Langbfdea662014-07-23 14:16:32 -04006747 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006748 if (context)
6749 {
6750 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC4, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006751 {
Geoff Langbfdea662014-07-23 14:16:32 -04006752 return;
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00006753 }
Geoff Langbfdea662014-07-23 14:16:32 -04006754
6755 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
6756 programBinary->setUniform4uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006757 }
6758}
6759
Kenneth Russell67ea1902014-10-06 16:44:50 -07006760void GL_APIENTRY glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006761{
6762 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
6763 buffer, drawbuffer, value);
6764
Geoff Langbfdea662014-07-23 14:16:32 -04006765 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006766 if (context)
6767 {
6768 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006769 {
Geoff Langbfdea662014-07-23 14:16:32 -04006770 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006771 }
Geoff Langbfdea662014-07-23 14:16:32 -04006772
6773 switch (buffer)
6774 {
6775 case GL_COLOR:
6776 if (drawbuffer < 0 || static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers)
6777 {
Geoff Langb1196682014-07-23 13:47:29 -04006778 context->recordError(gl::Error(GL_INVALID_VALUE));
6779 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006780 }
6781 break;
Geoff Langb1196682014-07-23 13:47:29 -04006782
Geoff Langbfdea662014-07-23 14:16:32 -04006783 case GL_STENCIL:
6784 if (drawbuffer != 0)
6785 {
Geoff Langb1196682014-07-23 13:47:29 -04006786 context->recordError(gl::Error(GL_INVALID_VALUE));
6787 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006788 }
6789 break;
Geoff Langb1196682014-07-23 13:47:29 -04006790
Geoff Langbfdea662014-07-23 14:16:32 -04006791 default:
Geoff Langb1196682014-07-23 13:47:29 -04006792 context->recordError(gl::Error(GL_INVALID_ENUM));
6793 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006794 }
6795
Geoff Langcc79b8c2014-07-25 13:48:02 -04006796 gl::Error error = context->clearBufferiv(buffer, drawbuffer, value);
6797 if (error.isError())
6798 {
6799 context->recordError(error);
6800 return;
6801 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006802 }
6803}
6804
Kenneth Russell67ea1902014-10-06 16:44:50 -07006805void GL_APIENTRY glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006806{
6807 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
6808 buffer, drawbuffer, value);
6809
Geoff Langbfdea662014-07-23 14:16:32 -04006810 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006811 if (context)
6812 {
6813 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006814 {
Geoff Langbfdea662014-07-23 14:16:32 -04006815 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006816 }
Geoff Langbfdea662014-07-23 14:16:32 -04006817
6818 switch (buffer)
6819 {
6820 case GL_COLOR:
6821 if (drawbuffer < 0 || static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers)
6822 {
Geoff Langb1196682014-07-23 13:47:29 -04006823 context->recordError(gl::Error(GL_INVALID_VALUE));
6824 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006825 }
6826 break;
Geoff Langb1196682014-07-23 13:47:29 -04006827
Geoff Langbfdea662014-07-23 14:16:32 -04006828 default:
Geoff Langb1196682014-07-23 13:47:29 -04006829 context->recordError(gl::Error(GL_INVALID_ENUM));
6830 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006831 }
6832
Geoff Langcc79b8c2014-07-25 13:48:02 -04006833 gl::Error error = context->clearBufferuiv(buffer, drawbuffer, value);
6834 if (error.isError())
6835 {
6836 context->recordError(error);
6837 return;
6838 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006839 }
6840}
6841
Kenneth Russell67ea1902014-10-06 16:44:50 -07006842void GL_APIENTRY glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006843{
6844 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
6845 buffer, drawbuffer, value);
6846
Geoff Langbfdea662014-07-23 14:16:32 -04006847 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006848 if (context)
6849 {
6850 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006851 {
Geoff Langbfdea662014-07-23 14:16:32 -04006852 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006853 }
Geoff Langbfdea662014-07-23 14:16:32 -04006854
6855 switch (buffer)
6856 {
6857 case GL_COLOR:
6858 if (drawbuffer < 0 || static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers)
6859 {
Geoff Langb1196682014-07-23 13:47:29 -04006860 context->recordError(gl::Error(GL_INVALID_VALUE));
6861 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006862 }
6863 break;
Geoff Langb1196682014-07-23 13:47:29 -04006864
Geoff Langbfdea662014-07-23 14:16:32 -04006865 case GL_DEPTH:
6866 if (drawbuffer != 0)
6867 {
Geoff Langb1196682014-07-23 13:47:29 -04006868 context->recordError(gl::Error(GL_INVALID_VALUE));
6869 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006870 }
6871 break;
Geoff Langb1196682014-07-23 13:47:29 -04006872
Geoff Langbfdea662014-07-23 14:16:32 -04006873 default:
Geoff Langb1196682014-07-23 13:47:29 -04006874 context->recordError(gl::Error(GL_INVALID_ENUM));
6875 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006876 }
6877
Geoff Langcc79b8c2014-07-25 13:48:02 -04006878 gl::Error error = context->clearBufferfv(buffer, drawbuffer, value);
6879 if (error.isError())
6880 {
6881 context->recordError(error);
6882 return;
6883 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006884 }
6885}
6886
Kenneth Russell67ea1902014-10-06 16:44:50 -07006887void GL_APIENTRY glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006888{
6889 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
6890 buffer, drawbuffer, depth, stencil);
6891
Geoff Langbfdea662014-07-23 14:16:32 -04006892 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006893 if (context)
6894 {
6895 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006896 {
Geoff Langbfdea662014-07-23 14:16:32 -04006897 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006898 }
Geoff Langbfdea662014-07-23 14:16:32 -04006899
6900 switch (buffer)
6901 {
6902 case GL_DEPTH_STENCIL:
6903 if (drawbuffer != 0)
6904 {
Geoff Langb1196682014-07-23 13:47:29 -04006905 context->recordError(gl::Error(GL_INVALID_VALUE));
6906 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006907 }
6908 break;
Geoff Langb1196682014-07-23 13:47:29 -04006909
Geoff Langbfdea662014-07-23 14:16:32 -04006910 default:
Geoff Langb1196682014-07-23 13:47:29 -04006911 context->recordError(gl::Error(GL_INVALID_ENUM));
6912 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006913 }
6914
Geoff Langcc79b8c2014-07-25 13:48:02 -04006915 gl::Error error = context->clearBufferfi(buffer, drawbuffer, depth, stencil);
6916 if (error.isError())
6917 {
6918 context->recordError(error);
6919 return;
6920 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006921 }
6922}
6923
Kenneth Russell67ea1902014-10-06 16:44:50 -07006924const GLubyte* GL_APIENTRY glGetStringi(GLenum name, GLuint index)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006925{
6926 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
6927
Geoff Langbfdea662014-07-23 14:16:32 -04006928 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006929 if (context)
6930 {
6931 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006932 {
Geoff Langb1196682014-07-23 13:47:29 -04006933 context->recordError(gl::Error(GL_INVALID_OPERATION));
6934 return NULL;
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00006935 }
Geoff Langbfdea662014-07-23 14:16:32 -04006936
6937 if (name != GL_EXTENSIONS)
6938 {
Geoff Langb1196682014-07-23 13:47:29 -04006939 context->recordError(gl::Error(GL_INVALID_ENUM));
6940 return NULL;
Geoff Langbfdea662014-07-23 14:16:32 -04006941 }
6942
6943 if (index >= context->getExtensionStringCount())
6944 {
Geoff Langb1196682014-07-23 13:47:29 -04006945 context->recordError(gl::Error(GL_INVALID_VALUE));
6946 return NULL;
Geoff Langbfdea662014-07-23 14:16:32 -04006947 }
6948
6949 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index).c_str());
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006950 }
6951
6952 return NULL;
6953}
6954
Kenneth Russell67ea1902014-10-06 16:44:50 -07006955void GL_APIENTRY glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006956{
6957 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
6958 readTarget, writeTarget, readOffset, writeOffset, size);
6959
Geoff Langbfdea662014-07-23 14:16:32 -04006960 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04006961 if (context)
6962 {
6963 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006964 {
Geoff Langb1196682014-07-23 13:47:29 -04006965 context->recordError(gl::Error(GL_INVALID_OPERATION));
6966 return;
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00006967 }
Geoff Langbfdea662014-07-23 14:16:32 -04006968
6969 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
6970 {
Geoff Langb1196682014-07-23 13:47:29 -04006971 context->recordError(gl::Error(GL_INVALID_ENUM));
6972 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006973 }
6974
6975 gl::Buffer *readBuffer = context->getState().getTargetBuffer(readTarget);
6976 gl::Buffer *writeBuffer = context->getState().getTargetBuffer(writeTarget);
6977
6978 if (!readBuffer || !writeBuffer)
6979 {
Geoff Langb1196682014-07-23 13:47:29 -04006980 context->recordError(gl::Error(GL_INVALID_OPERATION));
6981 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006982 }
6983
Jamie Madillcfaaf722014-07-31 10:47:54 -04006984 // Verify that readBuffer and writeBuffer are not currently mapped
Geoff Langbfdea662014-07-23 14:16:32 -04006985 if (readBuffer->isMapped() || writeBuffer->isMapped())
6986 {
Geoff Langb1196682014-07-23 13:47:29 -04006987 context->recordError(gl::Error(GL_INVALID_OPERATION));
6988 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006989 }
6990
6991 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
6992 static_cast<unsigned int>(readOffset + size) > readBuffer->getSize() ||
6993 static_cast<unsigned int>(writeOffset + size) > writeBuffer->getSize())
6994 {
Geoff Langb1196682014-07-23 13:47:29 -04006995 context->recordError(gl::Error(GL_INVALID_VALUE));
6996 return;
Geoff Langbfdea662014-07-23 14:16:32 -04006997 }
6998
Kenneth Russell67ea1902014-10-06 16:44:50 -07006999 if (readBuffer == writeBuffer && std::abs(readOffset - writeOffset) < size)
Geoff Langbfdea662014-07-23 14:16:32 -04007000 {
Geoff Langb1196682014-07-23 13:47:29 -04007001 context->recordError(gl::Error(GL_INVALID_VALUE));
7002 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007003 }
7004
Geoff Langbfdea662014-07-23 14:16:32 -04007005 // if size is zero, the copy is a successful no-op
7006 if (size > 0)
7007 {
Geoff Lang2a1c15a2014-07-25 11:43:00 -04007008 gl::Error error = writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
7009 if (error.isError())
7010 {
7011 context->recordError(error);
7012 return;
7013 }
Geoff Langbfdea662014-07-23 14:16:32 -04007014 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007015 }
7016}
7017
Kenneth Russell67ea1902014-10-06 16:44:50 -07007018void GL_APIENTRY glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007019{
7020 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
7021 program, uniformCount, uniformNames, uniformIndices);
7022
Geoff Langbfdea662014-07-23 14:16:32 -04007023 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007024 if (context)
7025 {
7026 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007027 {
Geoff Langb1196682014-07-23 13:47:29 -04007028 context->recordError(gl::Error(GL_INVALID_OPERATION));
7029 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007030 }
7031
7032 if (uniformCount < 0)
7033 {
Geoff Langb1196682014-07-23 13:47:29 -04007034 context->recordError(gl::Error(GL_INVALID_VALUE));
7035 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007036 }
7037
7038 gl::Program *programObject = context->getProgram(program);
7039
7040 if (!programObject)
7041 {
7042 if (context->getShader(program))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007043 {
Geoff Langb1196682014-07-23 13:47:29 -04007044 context->recordError(gl::Error(GL_INVALID_OPERATION));
7045 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007046 }
Geoff Langbfdea662014-07-23 14:16:32 -04007047 else
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00007048 {
Geoff Langb1196682014-07-23 13:47:29 -04007049 context->recordError(gl::Error(GL_INVALID_VALUE));
7050 return;
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00007051 }
Geoff Langbfdea662014-07-23 14:16:32 -04007052 }
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00007053
Geoff Langbfdea662014-07-23 14:16:32 -04007054 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7055 if (!programObject->isLinked() || !programBinary)
7056 {
7057 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00007058 {
Geoff Langbfdea662014-07-23 14:16:32 -04007059 uniformIndices[uniformId] = GL_INVALID_INDEX;
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00007060 }
7061 }
Geoff Langbfdea662014-07-23 14:16:32 -04007062 else
7063 {
7064 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
7065 {
7066 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
7067 }
7068 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007069 }
7070}
7071
Kenneth Russell67ea1902014-10-06 16:44:50 -07007072void GL_APIENTRY glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007073{
7074 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7075 program, uniformCount, uniformIndices, pname, params);
7076
Geoff Langbfdea662014-07-23 14:16:32 -04007077 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007078 if (context)
7079 {
7080 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007081 {
Geoff Langb1196682014-07-23 13:47:29 -04007082 context->recordError(gl::Error(GL_INVALID_OPERATION));
7083 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007084 }
7085
7086 if (uniformCount < 0)
7087 {
Geoff Langb1196682014-07-23 13:47:29 -04007088 context->recordError(gl::Error(GL_INVALID_VALUE));
7089 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007090 }
7091
7092 gl::Program *programObject = context->getProgram(program);
7093
7094 if (!programObject)
7095 {
7096 if (context->getShader(program))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007097 {
Geoff Langb1196682014-07-23 13:47:29 -04007098 context->recordError(gl::Error(GL_INVALID_OPERATION));
7099 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007100 }
Geoff Langbfdea662014-07-23 14:16:32 -04007101 else
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00007102 {
Geoff Langb1196682014-07-23 13:47:29 -04007103 context->recordError(gl::Error(GL_INVALID_VALUE));
7104 return;
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00007105 }
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00007106 }
Geoff Langbfdea662014-07-23 14:16:32 -04007107
7108 switch (pname)
7109 {
7110 case GL_UNIFORM_TYPE:
7111 case GL_UNIFORM_SIZE:
7112 case GL_UNIFORM_NAME_LENGTH:
7113 case GL_UNIFORM_BLOCK_INDEX:
7114 case GL_UNIFORM_OFFSET:
7115 case GL_UNIFORM_ARRAY_STRIDE:
7116 case GL_UNIFORM_MATRIX_STRIDE:
7117 case GL_UNIFORM_IS_ROW_MAJOR:
7118 break;
Geoff Langb1196682014-07-23 13:47:29 -04007119
Geoff Langbfdea662014-07-23 14:16:32 -04007120 default:
Geoff Langb1196682014-07-23 13:47:29 -04007121 context->recordError(gl::Error(GL_INVALID_ENUM));
7122 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007123 }
7124
7125 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7126
7127 if (!programBinary && uniformCount > 0)
7128 {
Geoff Langb1196682014-07-23 13:47:29 -04007129 context->recordError(gl::Error(GL_INVALID_VALUE));
7130 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007131 }
7132
7133 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
7134 {
7135 const GLuint index = uniformIndices[uniformId];
7136
7137 if (index >= (GLuint)programBinary->getActiveUniformCount())
7138 {
Geoff Langb1196682014-07-23 13:47:29 -04007139 context->recordError(gl::Error(GL_INVALID_VALUE));
7140 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007141 }
7142 }
7143
7144 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
7145 {
7146 const GLuint index = uniformIndices[uniformId];
7147 params[uniformId] = programBinary->getActiveUniformi(index, pname);
7148 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007149 }
7150}
7151
Kenneth Russell67ea1902014-10-06 16:44:50 -07007152GLuint GL_APIENTRY glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007153{
7154 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
7155
Geoff Langbfdea662014-07-23 14:16:32 -04007156 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007157 if (context)
7158 {
7159 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007160 {
Geoff Langb1196682014-07-23 13:47:29 -04007161 context->recordError(gl::Error(GL_INVALID_OPERATION));
7162 return GL_INVALID_INDEX;
Geoff Langbfdea662014-07-23 14:16:32 -04007163 }
7164
7165 gl::Program *programObject = context->getProgram(program);
7166
7167 if (!programObject)
7168 {
7169 if (context->getShader(program))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007170 {
Geoff Langb1196682014-07-23 13:47:29 -04007171 context->recordError(gl::Error(GL_INVALID_OPERATION));
7172 return GL_INVALID_INDEX;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007173 }
Geoff Langbfdea662014-07-23 14:16:32 -04007174 else
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00007175 {
Geoff Langb1196682014-07-23 13:47:29 -04007176 context->recordError(gl::Error(GL_INVALID_VALUE));
7177 return GL_INVALID_INDEX;
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00007178 }
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00007179 }
Geoff Langbfdea662014-07-23 14:16:32 -04007180
7181 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7182 if (!programBinary)
7183 {
7184 return GL_INVALID_INDEX;
7185 }
7186
7187 return programBinary->getUniformBlockIndex(uniformBlockName);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007188 }
7189
7190 return 0;
7191}
7192
Kenneth Russell67ea1902014-10-06 16:44:50 -07007193void GL_APIENTRY glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007194{
7195 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7196 program, uniformBlockIndex, pname, params);
7197
Geoff Langbfdea662014-07-23 14:16:32 -04007198 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007199 if (context)
7200 {
7201 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007202 {
Geoff Langb1196682014-07-23 13:47:29 -04007203 context->recordError(gl::Error(GL_INVALID_OPERATION));
7204 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007205 }
7206 gl::Program *programObject = context->getProgram(program);
7207
7208 if (!programObject)
7209 {
7210 if (context->getShader(program))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007211 {
Geoff Langb1196682014-07-23 13:47:29 -04007212 context->recordError(gl::Error(GL_INVALID_OPERATION));
7213 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007214 }
Geoff Langbfdea662014-07-23 14:16:32 -04007215 else
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00007216 {
Geoff Langb1196682014-07-23 13:47:29 -04007217 context->recordError(gl::Error(GL_INVALID_VALUE));
7218 return;
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00007219 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00007220 }
Geoff Langbfdea662014-07-23 14:16:32 -04007221
7222 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7223
7224 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
7225 {
Geoff Langb1196682014-07-23 13:47:29 -04007226 context->recordError(gl::Error(GL_INVALID_VALUE));
7227 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007228 }
7229
7230 switch (pname)
7231 {
7232 case GL_UNIFORM_BLOCK_BINDING:
7233 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
7234 break;
7235
7236 case GL_UNIFORM_BLOCK_DATA_SIZE:
7237 case GL_UNIFORM_BLOCK_NAME_LENGTH:
7238 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
7239 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
7240 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
7241 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
7242 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
7243 break;
7244
7245 default:
Geoff Langb1196682014-07-23 13:47:29 -04007246 context->recordError(gl::Error(GL_INVALID_ENUM));
7247 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007248 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007249 }
7250}
7251
Kenneth Russell67ea1902014-10-06 16:44:50 -07007252void GL_APIENTRY glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007253{
7254 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
7255 program, uniformBlockIndex, bufSize, length, uniformBlockName);
7256
Geoff Langbfdea662014-07-23 14:16:32 -04007257 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007258 if (context)
7259 {
7260 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007261 {
Geoff Langb1196682014-07-23 13:47:29 -04007262 context->recordError(gl::Error(GL_INVALID_OPERATION));
7263 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007264 }
7265
7266 gl::Program *programObject = context->getProgram(program);
7267
7268 if (!programObject)
7269 {
7270 if (context->getShader(program))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007271 {
Geoff Langb1196682014-07-23 13:47:29 -04007272 context->recordError(gl::Error(GL_INVALID_OPERATION));
7273 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007274 }
Geoff Langbfdea662014-07-23 14:16:32 -04007275 else
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00007276 {
Geoff Langb1196682014-07-23 13:47:29 -04007277 context->recordError(gl::Error(GL_INVALID_VALUE));
7278 return;
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00007279 }
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00007280 }
Geoff Langbfdea662014-07-23 14:16:32 -04007281
7282 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7283
7284 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
7285 {
Geoff Langb1196682014-07-23 13:47:29 -04007286 context->recordError(gl::Error(GL_INVALID_VALUE));
7287 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007288 }
7289
7290 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007291 }
7292}
7293
Kenneth Russell67ea1902014-10-06 16:44:50 -07007294void GL_APIENTRY glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007295{
7296 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
7297 program, uniformBlockIndex, uniformBlockBinding);
7298
Geoff Langbfdea662014-07-23 14:16:32 -04007299 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007300 if (context)
7301 {
7302 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007303 {
Geoff Langb1196682014-07-23 13:47:29 -04007304 context->recordError(gl::Error(GL_INVALID_OPERATION));
7305 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007306 }
7307
Geoff Lang3a61c322014-07-10 13:01:54 -04007308 if (uniformBlockBinding >= context->getCaps().maxUniformBufferBindings)
Geoff Langbfdea662014-07-23 14:16:32 -04007309 {
Geoff Langb1196682014-07-23 13:47:29 -04007310 context->recordError(gl::Error(GL_INVALID_VALUE));
7311 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007312 }
7313
7314 gl::Program *programObject = context->getProgram(program);
7315
7316 if (!programObject)
7317 {
7318 if (context->getShader(program))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007319 {
Geoff Langb1196682014-07-23 13:47:29 -04007320 context->recordError(gl::Error(GL_INVALID_OPERATION));
7321 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007322 }
Geoff Langbfdea662014-07-23 14:16:32 -04007323 else
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00007324 {
Geoff Langb1196682014-07-23 13:47:29 -04007325 context->recordError(gl::Error(GL_INVALID_VALUE));
7326 return;
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00007327 }
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00007328 }
Geoff Langbfdea662014-07-23 14:16:32 -04007329
7330 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7331
7332 // if never linked, there won't be any uniform blocks
7333 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
7334 {
Geoff Langb1196682014-07-23 13:47:29 -04007335 context->recordError(gl::Error(GL_INVALID_VALUE));
7336 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007337 }
7338
7339 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007340 }
7341}
7342
Kenneth Russell67ea1902014-10-06 16:44:50 -07007343void GL_APIENTRY glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007344{
7345 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
7346 mode, first, count, instanceCount);
7347
Geoff Langbfdea662014-07-23 14:16:32 -04007348 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007349 if (context)
7350 {
7351 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007352 {
Geoff Langb1196682014-07-23 13:47:29 -04007353 context->recordError(gl::Error(GL_INVALID_OPERATION));
7354 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007355 }
Geoff Langbfdea662014-07-23 14:16:32 -04007356
7357 // glDrawArraysInstanced
7358 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007359 }
7360}
7361
Kenneth Russell67ea1902014-10-06 16:44:50 -07007362void GL_APIENTRY glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007363{
7364 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
7365 mode, count, type, indices, instanceCount);
7366
Geoff Langbfdea662014-07-23 14:16:32 -04007367 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007368 if (context)
7369 {
7370 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007371 {
Geoff Langb1196682014-07-23 13:47:29 -04007372 context->recordError(gl::Error(GL_INVALID_OPERATION));
7373 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007374 }
Geoff Langbfdea662014-07-23 14:16:32 -04007375
7376 // glDrawElementsInstanced
7377 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007378 }
7379}
7380
Kenneth Russell67ea1902014-10-06 16:44:50 -07007381GLsync GL_APIENTRY glFenceSync(GLenum condition, GLbitfield flags)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007382{
7383 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
7384
Geoff Langbfdea662014-07-23 14:16:32 -04007385 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007386 if (context)
7387 {
7388 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007389 {
Geoff Langb1196682014-07-23 13:47:29 -04007390 context->recordError(gl::Error(GL_INVALID_OPERATION));
7391 return 0;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007392 }
Geoff Langbfdea662014-07-23 14:16:32 -04007393
7394 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
7395 {
Geoff Langb1196682014-07-23 13:47:29 -04007396 context->recordError(gl::Error(GL_INVALID_ENUM));
7397 return 0;
Geoff Langbfdea662014-07-23 14:16:32 -04007398 }
7399
7400 if (flags != 0)
7401 {
Geoff Langb1196682014-07-23 13:47:29 -04007402 context->recordError(gl::Error(GL_INVALID_VALUE));
7403 return 0;
Geoff Langbfdea662014-07-23 14:16:32 -04007404 }
7405
Geoff Lang882033e2014-09-30 11:26:07 -04007406 GLsync fenceSync = context->createFenceSync();
7407
7408 gl::FenceSync *fenceSyncObject = context->getFenceSync(fenceSync);
7409 gl::Error error = fenceSyncObject->set(condition);
7410 if (error.isError())
7411 {
7412 context->deleteFenceSync(fenceSync);
7413 context->recordError(error);
7414 return NULL;
7415 }
7416
7417 return fenceSync;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007418 }
7419
7420 return NULL;
7421}
7422
Kenneth Russell67ea1902014-10-06 16:44:50 -07007423GLboolean GL_APIENTRY glIsSync(GLsync sync)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007424{
7425 EVENT("(GLsync sync = 0x%0.8p)", sync);
7426
Geoff Langbfdea662014-07-23 14:16:32 -04007427 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007428 if (context)
7429 {
7430 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007431 {
Geoff Langb1196682014-07-23 13:47:29 -04007432 context->recordError(gl::Error(GL_INVALID_OPERATION));
7433 return GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007434 }
Geoff Langbfdea662014-07-23 14:16:32 -04007435
7436 return (context->getFenceSync(sync) != NULL);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007437 }
7438
7439 return GL_FALSE;
7440}
7441
Kenneth Russell67ea1902014-10-06 16:44:50 -07007442void GL_APIENTRY glDeleteSync(GLsync sync)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007443{
7444 EVENT("(GLsync sync = 0x%0.8p)", sync);
7445
Geoff Langbfdea662014-07-23 14:16:32 -04007446 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007447 if (context)
7448 {
7449 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007450 {
Geoff Langb1196682014-07-23 13:47:29 -04007451 context->recordError(gl::Error(GL_INVALID_OPERATION));
7452 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007453 }
Geoff Langbfdea662014-07-23 14:16:32 -04007454
7455 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
7456 {
Geoff Langb1196682014-07-23 13:47:29 -04007457 context->recordError(gl::Error(GL_INVALID_VALUE));
7458 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007459 }
7460
7461 context->deleteFenceSync(sync);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007462 }
7463}
7464
Kenneth Russell67ea1902014-10-06 16:44:50 -07007465GLenum GL_APIENTRY glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007466{
7467 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
7468 sync, flags, timeout);
7469
Geoff Langbfdea662014-07-23 14:16:32 -04007470 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007471 if (context)
7472 {
7473 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007474 {
Geoff Langb1196682014-07-23 13:47:29 -04007475 context->recordError(gl::Error(GL_INVALID_OPERATION));
7476 return GL_WAIT_FAILED;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007477 }
Geoff Langbfdea662014-07-23 14:16:32 -04007478
7479 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
7480 {
Geoff Langb1196682014-07-23 13:47:29 -04007481 context->recordError(gl::Error(GL_INVALID_VALUE));
7482 return GL_WAIT_FAILED;
Geoff Langbfdea662014-07-23 14:16:32 -04007483 }
7484
7485 gl::FenceSync *fenceSync = context->getFenceSync(sync);
7486
7487 if (!fenceSync)
7488 {
Geoff Langb1196682014-07-23 13:47:29 -04007489 context->recordError(gl::Error(GL_INVALID_VALUE));
7490 return GL_WAIT_FAILED;
Geoff Langbfdea662014-07-23 14:16:32 -04007491 }
7492
Geoff Lang882033e2014-09-30 11:26:07 -04007493 GLenum result = GL_WAIT_FAILED;
7494 gl::Error error = fenceSync->clientWait(flags, timeout, &result);
7495 if (error.isError())
7496 {
7497 context->recordError(error);
7498 return GL_WAIT_FAILED;
7499 }
7500
7501 return result;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007502 }
7503
7504 return GL_FALSE;
7505}
7506
Kenneth Russell67ea1902014-10-06 16:44:50 -07007507void GL_APIENTRY glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007508{
7509 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
7510 sync, flags, timeout);
7511
Geoff Langbfdea662014-07-23 14:16:32 -04007512 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007513 if (context)
7514 {
7515 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007516 {
Geoff Langb1196682014-07-23 13:47:29 -04007517 context->recordError(gl::Error(GL_INVALID_OPERATION));
7518 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007519 }
Geoff Langbfdea662014-07-23 14:16:32 -04007520
7521 if (flags != 0)
7522 {
Geoff Langb1196682014-07-23 13:47:29 -04007523 context->recordError(gl::Error(GL_INVALID_VALUE));
7524 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007525 }
7526
7527 if (timeout != GL_TIMEOUT_IGNORED)
7528 {
Geoff Langb1196682014-07-23 13:47:29 -04007529 context->recordError(gl::Error(GL_INVALID_VALUE));
7530 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007531 }
7532
7533 gl::FenceSync *fenceSync = context->getFenceSync(sync);
7534
7535 if (!fenceSync)
7536 {
Geoff Langb1196682014-07-23 13:47:29 -04007537 context->recordError(gl::Error(GL_INVALID_VALUE));
7538 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007539 }
7540
Geoff Lang882033e2014-09-30 11:26:07 -04007541 gl::Error error = fenceSync->serverWait();
7542 if (error.isError())
7543 {
7544 context->recordError(error);
7545 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007546 }
7547}
7548
Kenneth Russell67ea1902014-10-06 16:44:50 -07007549void GL_APIENTRY glGetInteger64v(GLenum pname, GLint64* params)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007550{
7551 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
7552 pname, params);
7553
Geoff Langbfdea662014-07-23 14:16:32 -04007554 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007555 if (context)
7556 {
7557 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007558 {
Geoff Langb1196682014-07-23 13:47:29 -04007559 context->recordError(gl::Error(GL_INVALID_OPERATION));
7560 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007561 }
Geoff Langbfdea662014-07-23 14:16:32 -04007562
7563 GLenum nativeType;
7564 unsigned int numParams = 0;
7565 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
7566 {
7567 return;
7568 }
7569
7570 if (nativeType == GL_INT_64_ANGLEX)
7571 {
7572 context->getInteger64v(pname, params);
7573 }
7574 else
7575 {
7576 CastStateValues(context, nativeType, pname, numParams, params);
7577 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007578 }
7579}
7580
Kenneth Russell67ea1902014-10-06 16:44:50 -07007581void GL_APIENTRY glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007582{
7583 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
7584 sync, pname, bufSize, length, values);
7585
Geoff Langbfdea662014-07-23 14:16:32 -04007586 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007587 if (context)
7588 {
7589 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007590 {
Geoff Langb1196682014-07-23 13:47:29 -04007591 context->recordError(gl::Error(GL_INVALID_OPERATION));
7592 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007593 }
Geoff Langbfdea662014-07-23 14:16:32 -04007594
7595 if (bufSize < 0)
7596 {
Geoff Langb1196682014-07-23 13:47:29 -04007597 context->recordError(gl::Error(GL_INVALID_VALUE));
7598 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007599 }
7600
7601 gl::FenceSync *fenceSync = context->getFenceSync(sync);
7602
7603 if (!fenceSync)
7604 {
Geoff Langb1196682014-07-23 13:47:29 -04007605 context->recordError(gl::Error(GL_INVALID_VALUE));
7606 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007607 }
7608
7609 switch (pname)
7610 {
7611 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
Geoff Langbfdea662014-07-23 14:16:32 -04007612 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
7613 case GL_SYNC_FLAGS: values[0] = 0; break;
7614
Geoff Lang882033e2014-09-30 11:26:07 -04007615 case GL_SYNC_STATUS:
7616 {
7617 gl::Error error = fenceSync->getStatus(values);
7618 if (error.isError())
7619 {
7620 context->recordError(error);
7621 return;
7622 }
7623 break;
7624 }
7625
Geoff Langbfdea662014-07-23 14:16:32 -04007626 default:
Geoff Langb1196682014-07-23 13:47:29 -04007627 context->recordError(gl::Error(GL_INVALID_ENUM));
7628 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007629 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007630 }
7631}
7632
Kenneth Russell67ea1902014-10-06 16:44:50 -07007633void GL_APIENTRY glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007634{
7635 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
7636 target, index, data);
7637
Geoff Langbfdea662014-07-23 14:16:32 -04007638 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007639 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007640 {
Geoff Langbfdea662014-07-23 14:16:32 -04007641 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007642 {
Geoff Langb1196682014-07-23 13:47:29 -04007643 context->recordError(gl::Error(GL_INVALID_OPERATION));
7644 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007645 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007646
Geoff Lang3a61c322014-07-10 13:01:54 -04007647 const gl::Caps &caps = context->getCaps();
Geoff Langbfdea662014-07-23 14:16:32 -04007648 switch (target)
7649 {
7650 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7651 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7652 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
Geoff Lang05881a02014-07-10 14:05:30 -04007653 if (index >= caps.maxTransformFeedbackSeparateAttributes)
7654 {
Geoff Langb1196682014-07-23 13:47:29 -04007655 context->recordError(gl::Error(GL_INVALID_VALUE));
7656 return;
Geoff Lang05881a02014-07-10 14:05:30 -04007657 }
Geoff Langbfdea662014-07-23 14:16:32 -04007658 break;
Geoff Langb1196682014-07-23 13:47:29 -04007659
Geoff Langbfdea662014-07-23 14:16:32 -04007660 case GL_UNIFORM_BUFFER_START:
7661 case GL_UNIFORM_BUFFER_SIZE:
7662 case GL_UNIFORM_BUFFER_BINDING:
Geoff Lang3a61c322014-07-10 13:01:54 -04007663 if (index >= caps.maxUniformBufferBindings)
7664 {
Geoff Langb1196682014-07-23 13:47:29 -04007665 context->recordError(gl::Error(GL_INVALID_VALUE));
7666 return;
Geoff Lang3a61c322014-07-10 13:01:54 -04007667 }
Geoff Langbfdea662014-07-23 14:16:32 -04007668 break;
Geoff Langb1196682014-07-23 13:47:29 -04007669
Geoff Langbfdea662014-07-23 14:16:32 -04007670 default:
Geoff Langb1196682014-07-23 13:47:29 -04007671 context->recordError(gl::Error(GL_INVALID_ENUM));
7672 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007673 }
7674
7675 if (!(context->getIndexedInteger64v(target, index, data)))
7676 {
7677 GLenum nativeType;
7678 unsigned int numParams = 0;
7679 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
Geoff Langb1196682014-07-23 13:47:29 -04007680 {
7681 context->recordError(gl::Error(GL_INVALID_ENUM));
7682 return;
7683 }
Shannon Woods15934d52013-08-19 14:28:49 -04007684
Geoff Langbfdea662014-07-23 14:16:32 -04007685 if (numParams == 0)
7686 return; // it is known that pname is valid, but there are no parameters to return
7687
7688 if (nativeType == GL_INT)
Shannon Woods15934d52013-08-19 14:28:49 -04007689 {
Geoff Langbfdea662014-07-23 14:16:32 -04007690 GLint *intParams = new GLint[numParams];
Shannon Woods15934d52013-08-19 14:28:49 -04007691
Geoff Langbfdea662014-07-23 14:16:32 -04007692 context->getIndexedIntegerv(target, index, intParams);
Shannon Woods15934d52013-08-19 14:28:49 -04007693
Geoff Langbfdea662014-07-23 14:16:32 -04007694 for (unsigned int i = 0; i < numParams; ++i)
Shannon Woods15934d52013-08-19 14:28:49 -04007695 {
Geoff Langbfdea662014-07-23 14:16:32 -04007696 data[i] = static_cast<GLint64>(intParams[i]);
Shannon Woods15934d52013-08-19 14:28:49 -04007697 }
Geoff Langbfdea662014-07-23 14:16:32 -04007698
7699 delete [] intParams;
7700 }
7701 else
7702 {
7703 UNREACHABLE();
Shannon Woods15934d52013-08-19 14:28:49 -04007704 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007705 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007706 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007707}
7708
Kenneth Russell67ea1902014-10-06 16:44:50 -07007709void GL_APIENTRY glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007710{
7711 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
7712 target, pname, params);
7713
Geoff Langbfdea662014-07-23 14:16:32 -04007714 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007715 if (context)
7716 {
7717 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007718 {
Geoff Langb1196682014-07-23 13:47:29 -04007719 context->recordError(gl::Error(GL_INVALID_OPERATION));
7720 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007721 }
Geoff Langbfdea662014-07-23 14:16:32 -04007722
7723 if (!gl::ValidBufferTarget(context, target))
7724 {
Geoff Langb1196682014-07-23 13:47:29 -04007725 context->recordError(gl::Error(GL_INVALID_ENUM));
7726 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007727 }
7728
7729 if (!gl::ValidBufferParameter(context, pname))
7730 {
Geoff Langb1196682014-07-23 13:47:29 -04007731 context->recordError(gl::Error(GL_INVALID_ENUM));
7732 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007733 }
7734
7735 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
7736
7737 if (!buffer)
7738 {
7739 // A null buffer means that "0" is bound to the requested buffer target
Geoff Langb1196682014-07-23 13:47:29 -04007740 context->recordError(gl::Error(GL_INVALID_OPERATION));
7741 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007742 }
7743
7744 switch (pname)
7745 {
7746 case GL_BUFFER_USAGE:
7747 *params = static_cast<GLint64>(buffer->getUsage());
7748 break;
7749 case GL_BUFFER_SIZE:
7750 *params = buffer->getSize();
7751 break;
7752 case GL_BUFFER_ACCESS_FLAGS:
7753 *params = static_cast<GLint64>(buffer->getAccessFlags());
7754 break;
7755 case GL_BUFFER_MAPPED:
7756 *params = static_cast<GLint64>(buffer->isMapped());
7757 break;
7758 case GL_BUFFER_MAP_OFFSET:
7759 *params = buffer->getMapOffset();
7760 break;
7761 case GL_BUFFER_MAP_LENGTH:
7762 *params = buffer->getMapLength();
7763 break;
7764 default: UNREACHABLE(); break;
7765 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007766 }
7767}
7768
Kenneth Russell67ea1902014-10-06 16:44:50 -07007769void GL_APIENTRY glGenSamplers(GLsizei count, GLuint* samplers)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007770{
7771 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
7772
Geoff Langbfdea662014-07-23 14:16:32 -04007773 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007774 if (context)
7775 {
7776 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007777 {
Geoff Langb1196682014-07-23 13:47:29 -04007778 context->recordError(gl::Error(GL_INVALID_OPERATION));
7779 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007780 }
Geoff Langbfdea662014-07-23 14:16:32 -04007781
7782 if (count < 0)
7783 {
Geoff Langb1196682014-07-23 13:47:29 -04007784 context->recordError(gl::Error(GL_INVALID_VALUE));
7785 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007786 }
7787
7788 for (int i = 0; i < count; i++)
7789 {
7790 samplers[i] = context->createSampler();
7791 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007792 }
7793}
7794
Kenneth Russell67ea1902014-10-06 16:44:50 -07007795void GL_APIENTRY glDeleteSamplers(GLsizei count, const GLuint* samplers)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007796{
7797 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
7798
Geoff Langbfdea662014-07-23 14:16:32 -04007799 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007800 if (context)
7801 {
7802 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007803 {
Geoff Langb1196682014-07-23 13:47:29 -04007804 context->recordError(gl::Error(GL_INVALID_OPERATION));
7805 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007806 }
Geoff Langbfdea662014-07-23 14:16:32 -04007807
7808 if (count < 0)
7809 {
Geoff Langb1196682014-07-23 13:47:29 -04007810 context->recordError(gl::Error(GL_INVALID_VALUE));
7811 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007812 }
7813
7814 for (int i = 0; i < count; i++)
7815 {
7816 context->deleteSampler(samplers[i]);
7817 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007818 }
7819}
7820
Kenneth Russell67ea1902014-10-06 16:44:50 -07007821GLboolean GL_APIENTRY glIsSampler(GLuint sampler)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007822{
7823 EVENT("(GLuint sampler = %u)", sampler);
7824
Geoff Langbfdea662014-07-23 14:16:32 -04007825 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007826 if (context)
7827 {
7828 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007829 {
Geoff Langb1196682014-07-23 13:47:29 -04007830 context->recordError(gl::Error(GL_INVALID_OPERATION));
7831 return GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007832 }
Geoff Langbfdea662014-07-23 14:16:32 -04007833
7834 return context->isSampler(sampler);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007835 }
7836
7837 return GL_FALSE;
7838}
7839
Kenneth Russell67ea1902014-10-06 16:44:50 -07007840void GL_APIENTRY glBindSampler(GLuint unit, GLuint sampler)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007841{
7842 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
7843
Geoff Langbfdea662014-07-23 14:16:32 -04007844 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007845 if (context)
7846 {
7847 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007848 {
Geoff Langb1196682014-07-23 13:47:29 -04007849 context->recordError(gl::Error(GL_INVALID_OPERATION));
7850 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007851 }
Geoff Langbfdea662014-07-23 14:16:32 -04007852
7853 if (sampler != 0 && !context->isSampler(sampler))
7854 {
Geoff Langb1196682014-07-23 13:47:29 -04007855 context->recordError(gl::Error(GL_INVALID_OPERATION));
7856 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007857 }
7858
Geoff Lang3a61c322014-07-10 13:01:54 -04007859 if (unit >= context->getCaps().maxCombinedTextureImageUnits)
Geoff Langbfdea662014-07-23 14:16:32 -04007860 {
Geoff Langb1196682014-07-23 13:47:29 -04007861 context->recordError(gl::Error(GL_INVALID_VALUE));
7862 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007863 }
7864
7865 context->bindSampler(unit, sampler);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007866 }
7867}
7868
Kenneth Russell67ea1902014-10-06 16:44:50 -07007869void GL_APIENTRY glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007870{
7871 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
7872
Geoff Langbfdea662014-07-23 14:16:32 -04007873 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007874 if (context)
7875 {
7876 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007877 {
Geoff Langb1196682014-07-23 13:47:29 -04007878 context->recordError(gl::Error(GL_INVALID_OPERATION));
7879 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007880 }
Geoff Langbfdea662014-07-23 14:16:32 -04007881
Geoff Langb1196682014-07-23 13:47:29 -04007882 if (!gl::ValidateSamplerObjectParameter(context, pname))
Geoff Langbfdea662014-07-23 14:16:32 -04007883 {
7884 return;
7885 }
7886
7887 if (!gl::ValidateTexParamParameters(context, pname, param))
7888 {
7889 return;
7890 }
7891
7892 if (!context->isSampler(sampler))
7893 {
Geoff Langb1196682014-07-23 13:47:29 -04007894 context->recordError(gl::Error(GL_INVALID_OPERATION));
7895 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007896 }
7897
7898 context->samplerParameteri(sampler, pname, param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007899 }
7900}
7901
Kenneth Russell67ea1902014-10-06 16:44:50 -07007902void GL_APIENTRY glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007903{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04007904 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007905}
7906
Kenneth Russell67ea1902014-10-06 16:44:50 -07007907void GL_APIENTRY glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007908{
7909 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
7910
Geoff Langbfdea662014-07-23 14:16:32 -04007911 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007912 if (context)
7913 {
7914 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007915 {
Geoff Langb1196682014-07-23 13:47:29 -04007916 context->recordError(gl::Error(GL_INVALID_OPERATION));
7917 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007918 }
Geoff Langbfdea662014-07-23 14:16:32 -04007919
Geoff Langb1196682014-07-23 13:47:29 -04007920 if (!gl::ValidateSamplerObjectParameter(context, pname))
Geoff Langbfdea662014-07-23 14:16:32 -04007921 {
7922 return;
7923 }
7924
7925 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
7926 {
7927 return;
7928 }
7929
7930 if (!context->isSampler(sampler))
7931 {
Geoff Langb1196682014-07-23 13:47:29 -04007932 context->recordError(gl::Error(GL_INVALID_OPERATION));
7933 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007934 }
7935
7936 context->samplerParameterf(sampler, pname, param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007937 }
7938}
7939
Kenneth Russell67ea1902014-10-06 16:44:50 -07007940void GL_APIENTRY glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007941{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04007942 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007943}
7944
Kenneth Russell67ea1902014-10-06 16:44:50 -07007945void GL_APIENTRY glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007946{
7947 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
7948
Geoff Langbfdea662014-07-23 14:16:32 -04007949 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007950 if (context)
7951 {
7952 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007953 {
Geoff Langb1196682014-07-23 13:47:29 -04007954 context->recordError(gl::Error(GL_INVALID_OPERATION));
7955 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007956 }
Geoff Langbfdea662014-07-23 14:16:32 -04007957
Geoff Langb1196682014-07-23 13:47:29 -04007958 if (!gl::ValidateSamplerObjectParameter(context, pname))
Geoff Langbfdea662014-07-23 14:16:32 -04007959 {
7960 return;
7961 }
7962
7963 if (!context->isSampler(sampler))
7964 {
Geoff Langb1196682014-07-23 13:47:29 -04007965 context->recordError(gl::Error(GL_INVALID_OPERATION));
7966 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007967 }
7968
7969 *params = context->getSamplerParameteri(sampler, pname);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007970 }
7971}
7972
Kenneth Russell67ea1902014-10-06 16:44:50 -07007973void GL_APIENTRY glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007974{
7975 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
7976
Geoff Langbfdea662014-07-23 14:16:32 -04007977 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04007978 if (context)
7979 {
7980 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007981 {
Geoff Langb1196682014-07-23 13:47:29 -04007982 context->recordError(gl::Error(GL_INVALID_OPERATION));
7983 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007984 }
Geoff Langbfdea662014-07-23 14:16:32 -04007985
Geoff Langb1196682014-07-23 13:47:29 -04007986 if (!gl::ValidateSamplerObjectParameter(context, pname))
Geoff Langbfdea662014-07-23 14:16:32 -04007987 {
7988 return;
7989 }
7990
7991 if (!context->isSampler(sampler))
7992 {
Geoff Langb1196682014-07-23 13:47:29 -04007993 context->recordError(gl::Error(GL_INVALID_OPERATION));
7994 return;
Geoff Langbfdea662014-07-23 14:16:32 -04007995 }
7996
7997 *params = context->getSamplerParameterf(sampler, pname);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007998 }
7999}
8000
Kenneth Russell67ea1902014-10-06 16:44:50 -07008001void GL_APIENTRY glVertexAttribDivisor(GLuint index, GLuint divisor)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008002{
8003 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
8004
Geoff Langbfdea662014-07-23 14:16:32 -04008005 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008006 if (context)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008007 {
Geoff Langbfdea662014-07-23 14:16:32 -04008008 if (context->getClientVersion() < 3)
8009 {
Geoff Langb1196682014-07-23 13:47:29 -04008010 context->recordError(gl::Error(GL_INVALID_OPERATION));
8011 return;
8012 }
8013
8014 if (index >= gl::MAX_VERTEX_ATTRIBS)
8015 {
8016 context->recordError(gl::Error(GL_INVALID_VALUE));
8017 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008018 }
8019
8020 context->setVertexAttribDivisor(index, divisor);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008021 }
8022}
8023
Kenneth Russell67ea1902014-10-06 16:44:50 -07008024void GL_APIENTRY glBindTransformFeedback(GLenum target, GLuint id)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008025{
8026 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
8027
Geoff Langbfdea662014-07-23 14:16:32 -04008028 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008029 if (context)
8030 {
8031 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008032 {
Geoff Langb1196682014-07-23 13:47:29 -04008033 context->recordError(gl::Error(GL_INVALID_OPERATION));
8034 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008035 }
Geoff Langbfdea662014-07-23 14:16:32 -04008036
8037 switch (target)
8038 {
8039 case GL_TRANSFORM_FEEDBACK:
8040 {
8041 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
8042 gl::TransformFeedback *curTransformFeedback = context->getState().getCurrentTransformFeedback();
8043 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
8044 {
Geoff Langb1196682014-07-23 13:47:29 -04008045 context->recordError(gl::Error(GL_INVALID_OPERATION));
8046 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008047 }
8048
8049 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
8050 if (context->getTransformFeedback(id) == NULL)
8051 {
Geoff Langb1196682014-07-23 13:47:29 -04008052 context->recordError(gl::Error(GL_INVALID_OPERATION));
8053 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008054 }
8055
8056 context->bindTransformFeedback(id);
8057 }
8058 break;
8059
8060 default:
Geoff Langb1196682014-07-23 13:47:29 -04008061 context->recordError(gl::Error(GL_INVALID_ENUM));
8062 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008063 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008064 }
8065}
8066
Kenneth Russell67ea1902014-10-06 16:44:50 -07008067void GL_APIENTRY glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008068{
8069 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
8070
Geoff Langbfdea662014-07-23 14:16:32 -04008071 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008072 if (context)
8073 {
8074 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008075 {
Geoff Langb1196682014-07-23 13:47:29 -04008076 context->recordError(gl::Error(GL_INVALID_OPERATION));
8077 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008078 }
Geoff Langbfdea662014-07-23 14:16:32 -04008079
8080 for (int i = 0; i < n; i++)
8081 {
8082 context->deleteTransformFeedback(ids[i]);
8083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008084 }
8085}
8086
Kenneth Russell67ea1902014-10-06 16:44:50 -07008087void GL_APIENTRY glGenTransformFeedbacks(GLsizei n, GLuint* ids)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008088{
8089 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
8090
Geoff Langbfdea662014-07-23 14:16:32 -04008091 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008092 if (context)
8093 {
8094 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008095 {
Geoff Langb1196682014-07-23 13:47:29 -04008096 context->recordError(gl::Error(GL_INVALID_OPERATION));
8097 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008098 }
Geoff Langbfdea662014-07-23 14:16:32 -04008099
8100 for (int i = 0; i < n; i++)
8101 {
8102 ids[i] = context->createTransformFeedback();
8103 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008104 }
8105}
8106
Kenneth Russell67ea1902014-10-06 16:44:50 -07008107GLboolean GL_APIENTRY glIsTransformFeedback(GLuint id)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008108{
8109 EVENT("(GLuint id = %u)", id);
8110
Geoff Langbfdea662014-07-23 14:16:32 -04008111 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008112 if (context)
8113 {
8114 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008115 {
Geoff Langb1196682014-07-23 13:47:29 -04008116 context->recordError(gl::Error(GL_INVALID_OPERATION));
8117 return GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008118 }
Geoff Langbfdea662014-07-23 14:16:32 -04008119
8120 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008121 }
8122
8123 return GL_FALSE;
8124}
8125
Kenneth Russell67ea1902014-10-06 16:44:50 -07008126void GL_APIENTRY glPauseTransformFeedback(void)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008127{
8128 EVENT("(void)");
8129
Geoff Langbfdea662014-07-23 14:16:32 -04008130 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008131 if (context)
8132 {
8133 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008134 {
Geoff Langb1196682014-07-23 13:47:29 -04008135 context->recordError(gl::Error(GL_INVALID_OPERATION));
8136 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008137 }
Geoff Langbfdea662014-07-23 14:16:32 -04008138
8139 gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
8140 ASSERT(transformFeedback != NULL);
8141
8142 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
8143 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
8144 {
Geoff Langb1196682014-07-23 13:47:29 -04008145 context->recordError(gl::Error(GL_INVALID_OPERATION));
8146 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008147 }
8148
8149 transformFeedback->pause();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008150 }
8151}
8152
Kenneth Russell67ea1902014-10-06 16:44:50 -07008153void GL_APIENTRY glResumeTransformFeedback(void)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008154{
8155 EVENT("(void)");
8156
Geoff Langbfdea662014-07-23 14:16:32 -04008157 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008158 if (context)
8159 {
8160 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008161 {
Geoff Langb1196682014-07-23 13:47:29 -04008162 context->recordError(gl::Error(GL_INVALID_OPERATION));
8163 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008164 }
Geoff Langbfdea662014-07-23 14:16:32 -04008165
8166 gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
8167 ASSERT(transformFeedback != NULL);
8168
8169 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
8170 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
8171 {
Geoff Langb1196682014-07-23 13:47:29 -04008172 context->recordError(gl::Error(GL_INVALID_OPERATION));
8173 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008174 }
8175
8176 transformFeedback->resume();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008177 }
8178}
8179
Kenneth Russell67ea1902014-10-06 16:44:50 -07008180void GL_APIENTRY glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008181{
8182 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
8183 program, bufSize, length, binaryFormat, binary);
8184
Geoff Langbfdea662014-07-23 14:16:32 -04008185 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008186 if (context)
8187 {
8188 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008189 {
Geoff Langb1196682014-07-23 13:47:29 -04008190 context->recordError(gl::Error(GL_INVALID_OPERATION));
8191 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008192 }
Geoff Langbfdea662014-07-23 14:16:32 -04008193
8194 // glGetProgramBinary
8195 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008196 }
8197}
8198
Kenneth Russell67ea1902014-10-06 16:44:50 -07008199void GL_APIENTRY glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008200{
8201 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
8202 program, binaryFormat, binary, length);
8203
Geoff Langbfdea662014-07-23 14:16:32 -04008204 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008205 if (context)
8206 {
8207 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008208 {
Geoff Langb1196682014-07-23 13:47:29 -04008209 context->recordError(gl::Error(GL_INVALID_OPERATION));
8210 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008211 }
Geoff Langbfdea662014-07-23 14:16:32 -04008212
8213 // glProgramBinary
8214 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008215 }
8216}
8217
Kenneth Russell67ea1902014-10-06 16:44:50 -07008218void GL_APIENTRY glProgramParameteri(GLuint program, GLenum pname, GLint value)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008219{
8220 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
8221 program, pname, value);
8222
Geoff Langbfdea662014-07-23 14:16:32 -04008223 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008224 if (context)
8225 {
8226 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008227 {
Geoff Langb1196682014-07-23 13:47:29 -04008228 context->recordError(gl::Error(GL_INVALID_OPERATION));
8229 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008230 }
Geoff Langbfdea662014-07-23 14:16:32 -04008231
8232 // glProgramParameteri
8233 UNIMPLEMENTED();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008234 }
8235}
8236
Kenneth Russell67ea1902014-10-06 16:44:50 -07008237void GL_APIENTRY glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008238{
8239 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
8240 target, numAttachments, attachments);
8241
Geoff Langbfdea662014-07-23 14:16:32 -04008242 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008243 if (context)
8244 {
8245 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008246 {
Geoff Langb1196682014-07-23 13:47:29 -04008247 context->recordError(gl::Error(GL_INVALID_OPERATION));
8248 return;
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00008249 }
Geoff Langbfdea662014-07-23 14:16:32 -04008250
8251 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
8252 {
8253 return;
8254 }
8255
Jamie Madill2d96b9e2014-08-29 15:46:47 -04008256 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
8257 if (framebuffer && framebuffer->completeness() == GL_FRAMEBUFFER_COMPLETE)
8258 {
8259 framebuffer->invalidate(context->getCaps(), numAttachments, attachments);
8260 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008261 }
8262}
8263
Kenneth Russell67ea1902014-10-06 16:44:50 -07008264void GL_APIENTRY glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008265{
8266 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
8267 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
8268 target, numAttachments, attachments, x, y, width, height);
8269
Geoff Langbfdea662014-07-23 14:16:32 -04008270 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008271 if (context)
8272 {
8273 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008274 {
Geoff Langb1196682014-07-23 13:47:29 -04008275 context->recordError(gl::Error(GL_INVALID_OPERATION));
8276 return;
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00008277 }
Geoff Langbfdea662014-07-23 14:16:32 -04008278
8279 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
8280 {
8281 return;
8282 }
8283
Jamie Madill2d96b9e2014-08-29 15:46:47 -04008284 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
8285 if (framebuffer && framebuffer->completeness() == GL_FRAMEBUFFER_COMPLETE)
8286 {
8287 framebuffer->invalidateSub(context->getCaps(), numAttachments, attachments, x, y, width, height);
8288 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008289 }
8290}
8291
Kenneth Russell67ea1902014-10-06 16:44:50 -07008292void GL_APIENTRY glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008293{
8294 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
8295 target, levels, internalformat, width, height);
8296
Geoff Langbfdea662014-07-23 14:16:32 -04008297 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008298 if (context)
8299 {
8300 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008301 {
Geoff Langb1196682014-07-23 13:47:29 -04008302 context->recordError(gl::Error(GL_INVALID_OPERATION));
8303 return;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00008304 }
Geoff Langbfdea662014-07-23 14:16:32 -04008305
8306 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
8307 {
8308 return;
8309 }
8310
8311 switch (target)
8312 {
8313 case GL_TEXTURE_2D:
8314 {
8315 gl::Texture2D *texture2d = context->getTexture2D();
8316 texture2d->storage(levels, internalformat, width, height);
8317 }
8318 break;
8319
8320 case GL_TEXTURE_CUBE_MAP:
8321 {
8322 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
8323 textureCube->storage(levels, internalformat, width);
8324 }
8325 break;
8326
8327 default:
Geoff Langb1196682014-07-23 13:47:29 -04008328 context->recordError(gl::Error(GL_INVALID_ENUM));
8329 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008330 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008331 }
8332}
8333
Kenneth Russell67ea1902014-10-06 16:44:50 -07008334void GL_APIENTRY glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008335{
8336 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
8337 "GLsizei height = %d, GLsizei depth = %d)",
8338 target, levels, internalformat, width, height, depth);
8339
Geoff Langbfdea662014-07-23 14:16:32 -04008340 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008341 if (context)
8342 {
8343 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008344 {
Geoff Langb1196682014-07-23 13:47:29 -04008345 context->recordError(gl::Error(GL_INVALID_OPERATION));
8346 return;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00008347 }
Geoff Langbfdea662014-07-23 14:16:32 -04008348
8349 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
8350 {
8351 return;
8352 }
8353
8354 switch (target)
8355 {
8356 case GL_TEXTURE_3D:
8357 {
8358 gl::Texture3D *texture3d = context->getTexture3D();
8359 texture3d->storage(levels, internalformat, width, height, depth);
8360 }
8361 break;
8362
8363 case GL_TEXTURE_2D_ARRAY:
8364 {
8365 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
8366 texture2darray->storage(levels, internalformat, width, height, depth);
8367 }
8368 break;
8369
8370 default:
8371 UNREACHABLE();
8372 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008373 }
8374}
8375
Kenneth Russell67ea1902014-10-06 16:44:50 -07008376void GL_APIENTRY glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008377{
8378 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
8379 "GLint* params = 0x%0.8p)",
8380 target, internalformat, pname, bufSize, params);
8381
Geoff Langbfdea662014-07-23 14:16:32 -04008382 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008383 if (context)
8384 {
8385 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008386 {
Geoff Langb1196682014-07-23 13:47:29 -04008387 context->recordError(gl::Error(GL_INVALID_OPERATION));
8388 return;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008389 }
Geoff Langbfdea662014-07-23 14:16:32 -04008390
8391 const gl::TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
8392 if (!formatCaps.renderable)
8393 {
Geoff Langb1196682014-07-23 13:47:29 -04008394 context->recordError(gl::Error(GL_INVALID_ENUM));
8395 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008396 }
8397
8398 if (target != GL_RENDERBUFFER)
8399 {
Geoff Langb1196682014-07-23 13:47:29 -04008400 context->recordError(gl::Error(GL_INVALID_ENUM));
8401 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008402 }
8403
8404 if (bufSize < 0)
8405 {
Geoff Langb1196682014-07-23 13:47:29 -04008406 context->recordError(gl::Error(GL_INVALID_VALUE));
8407 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008408 }
8409
8410 switch (pname)
8411 {
8412 case GL_NUM_SAMPLE_COUNTS:
8413 if (bufSize != 0)
Geoff Lang5f4c4632014-07-03 13:46:52 -04008414 {
8415 *params = formatCaps.sampleCounts.size();
8416 }
Geoff Langbfdea662014-07-23 14:16:32 -04008417 break;
Geoff Langb1196682014-07-23 13:47:29 -04008418
Geoff Langbfdea662014-07-23 14:16:32 -04008419 case GL_SAMPLES:
Geoff Lang5f4c4632014-07-03 13:46:52 -04008420 std::copy_n(formatCaps.sampleCounts.rbegin(), std::min<size_t>(bufSize, formatCaps.sampleCounts.size()), params);
Geoff Langbfdea662014-07-23 14:16:32 -04008421 break;
Geoff Langb1196682014-07-23 13:47:29 -04008422
Geoff Langbfdea662014-07-23 14:16:32 -04008423 default:
Geoff Langb1196682014-07-23 13:47:29 -04008424 context->recordError(gl::Error(GL_INVALID_ENUM));
8425 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008426 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008427 }
8428}
8429
8430// Extension functions
8431
Kenneth Russell67ea1902014-10-06 16:44:50 -07008432void GL_APIENTRY glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00008433 GLbitfield mask, GLenum filter)
8434{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00008435 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00008436 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
8437 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
8438 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
8439
Geoff Langbfdea662014-07-23 14:16:32 -04008440 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008441 if (context)
8442 {
8443 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
8444 dstX0, dstY0, dstX1, dstY1, mask, filter,
8445 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00008446 {
Geoff Langbfdea662014-07-23 14:16:32 -04008447 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00008448 }
Geoff Langbfdea662014-07-23 14:16:32 -04008449
Geoff Lang64839152014-08-26 16:23:25 -04008450 gl::Error error = context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
8451 mask, filter);
8452 if (error.isError())
8453 {
8454 context->recordError(error);
8455 return;
8456 }
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00008457 }
8458}
8459
Kenneth Russell67ea1902014-10-06 16:44:50 -07008460void GL_APIENTRY glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00008461 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00008462{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00008463 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00008464 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00008465 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00008466 target, level, internalformat, width, height, depth, border, format, type, pixels);
8467
Geoff Langbfdea662014-07-23 14:16:32 -04008468 UNIMPLEMENTED(); // FIXME
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00008469}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00008470
Kenneth Russell67ea1902014-10-06 16:44:50 -07008471void GL_APIENTRY glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00008472 GLenum *binaryFormat, void *binary)
8473{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00008474 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 +00008475 program, bufSize, length, binaryFormat, binary);
8476
Geoff Langbfdea662014-07-23 14:16:32 -04008477 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008478 if (context)
8479 {
8480 gl::Program *programObject = context->getProgram(program);
8481
8482 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00008483 {
Geoff Langb1196682014-07-23 13:47:29 -04008484 context->recordError(gl::Error(GL_INVALID_OPERATION));
8485 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00008486 }
Geoff Langbfdea662014-07-23 14:16:32 -04008487
8488 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8489
8490 if (!programBinary)
8491 {
Geoff Langb1196682014-07-23 13:47:29 -04008492 context->recordError(gl::Error(GL_INVALID_OPERATION));
8493 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008494 }
8495
Geoff Langb543aff2014-09-30 14:52:54 -04008496 gl::Error error = programBinary->save(binaryFormat, binary, bufSize, length);
8497 if (error.isError())
Geoff Langbfdea662014-07-23 14:16:32 -04008498 {
Geoff Langb543aff2014-09-30 14:52:54 -04008499 context->recordError(error);
Geoff Langb1196682014-07-23 13:47:29 -04008500 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008501 }
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00008502 }
8503}
8504
Kenneth Russell67ea1902014-10-06 16:44:50 -07008505void GL_APIENTRY glProgramBinaryOES(GLuint program, GLenum binaryFormat,
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00008506 const void *binary, GLint length)
8507{
8508 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
8509 program, binaryFormat, binary, length);
8510
Geoff Langbfdea662014-07-23 14:16:32 -04008511 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008512 if (context)
8513 {
Geoff Lang900013c2014-07-07 11:32:19 -04008514 const std::vector<GLenum> &programBinaryFormats = context->getCaps().programBinaryFormats;
8515 if (std::find(programBinaryFormats.begin(), programBinaryFormats.end(), binaryFormat) == programBinaryFormats.end())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00008516 {
Geoff Langb1196682014-07-23 13:47:29 -04008517 context->recordError(gl::Error(GL_INVALID_ENUM));
8518 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00008519 }
Geoff Langbfdea662014-07-23 14:16:32 -04008520
8521 gl::Program *programObject = context->getProgram(program);
Geoff Langbfdea662014-07-23 14:16:32 -04008522 if (!programObject)
8523 {
Geoff Langb1196682014-07-23 13:47:29 -04008524 context->recordError(gl::Error(GL_INVALID_OPERATION));
8525 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008526 }
8527
Geoff Langb543aff2014-09-30 14:52:54 -04008528 gl::Error error = context->setProgramBinary(program, binaryFormat, binary, length);
8529 if (error.isError())
8530 {
8531 context->recordError(error);
8532 return;
8533 }
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00008534 }
8535}
8536
Kenneth Russell67ea1902014-10-06 16:44:50 -07008537void GL_APIENTRY glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00008538{
8539 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
8540
Geoff Langbfdea662014-07-23 14:16:32 -04008541 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008542 if (context)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00008543 {
Geoff Langbfdea662014-07-23 14:16:32 -04008544 if (n < 0 || static_cast<GLuint>(n) > context->getCaps().maxDrawBuffers)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00008545 {
Geoff Langb1196682014-07-23 13:47:29 -04008546 context->recordError(gl::Error(GL_INVALID_VALUE));
8547 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008548 }
8549
8550 if (context->getState().getDrawFramebuffer()->id() == 0)
8551 {
8552 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00008553 {
Geoff Langb1196682014-07-23 13:47:29 -04008554 context->recordError(gl::Error(GL_INVALID_OPERATION));
8555 return;
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00008556 }
8557
Geoff Langbfdea662014-07-23 14:16:32 -04008558 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00008559 {
Geoff Langb1196682014-07-23 13:47:29 -04008560 context->recordError(gl::Error(GL_INVALID_OPERATION));
8561 return;
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00008562 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00008563 }
Geoff Langbfdea662014-07-23 14:16:32 -04008564 else
8565 {
8566 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
8567 {
8568 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
8569 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
8570 {
Geoff Langb1196682014-07-23 13:47:29 -04008571 context->recordError(gl::Error(GL_INVALID_OPERATION));
8572 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008573 }
8574 }
8575 }
8576
8577 gl::Framebuffer *framebuffer = context->getState().getDrawFramebuffer();
8578
8579 for (unsigned int colorAttachment = 0; colorAttachment < static_cast<unsigned int>(n); colorAttachment++)
8580 {
8581 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
8582 }
8583
8584 for (unsigned int colorAttachment = n; colorAttachment < context->getCaps().maxDrawBuffers; colorAttachment++)
8585 {
8586 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
8587 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00008588 }
8589}
8590
Kenneth Russell67ea1902014-10-06 16:44:50 -07008591void GL_APIENTRY glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
Shannon Woodsb3801742014-03-27 14:59:19 -04008592{
8593 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
8594
Geoff Langbfdea662014-07-23 14:16:32 -04008595 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008596 if (context)
8597 {
8598 if (!gl::ValidBufferTarget(context, target))
Shannon Woodsb3801742014-03-27 14:59:19 -04008599 {
Geoff Langb1196682014-07-23 13:47:29 -04008600 context->recordError(gl::Error(GL_INVALID_ENUM));
8601 return;
Shannon Woodsb3801742014-03-27 14:59:19 -04008602 }
Geoff Langbfdea662014-07-23 14:16:32 -04008603
8604 if (pname != GL_BUFFER_MAP_POINTER)
8605 {
Geoff Langb1196682014-07-23 13:47:29 -04008606 context->recordError(gl::Error(GL_INVALID_ENUM));
8607 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008608 }
8609
8610 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
8611
8612 if (!buffer || !buffer->isMapped())
8613 {
8614 *params = NULL;
8615 }
8616 else
8617 {
8618 *params = buffer->getMapPointer();
8619 }
Shannon Woodsb3801742014-03-27 14:59:19 -04008620 }
8621}
8622
Kenneth Russell67ea1902014-10-06 16:44:50 -07008623void * GL_APIENTRY glMapBufferOES(GLenum target, GLenum access)
Shannon Woodsb3801742014-03-27 14:59:19 -04008624{
8625 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
8626
Geoff Langbfdea662014-07-23 14:16:32 -04008627 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008628 if (context)
8629 {
8630 if (!gl::ValidBufferTarget(context, target))
Shannon Woodsb3801742014-03-27 14:59:19 -04008631 {
Geoff Langb1196682014-07-23 13:47:29 -04008632 context->recordError(gl::Error(GL_INVALID_ENUM));
8633 return NULL;
Shannon Woodsb3801742014-03-27 14:59:19 -04008634 }
Geoff Langbfdea662014-07-23 14:16:32 -04008635
8636 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
8637
8638 if (buffer == NULL)
8639 {
Geoff Langb1196682014-07-23 13:47:29 -04008640 context->recordError(gl::Error(GL_INVALID_OPERATION));
8641 return NULL;
Geoff Langbfdea662014-07-23 14:16:32 -04008642 }
8643
8644 if (access != GL_WRITE_ONLY_OES)
8645 {
Geoff Langb1196682014-07-23 13:47:29 -04008646 context->recordError(gl::Error(GL_INVALID_ENUM));
8647 return NULL;
Geoff Langbfdea662014-07-23 14:16:32 -04008648 }
8649
8650 if (buffer->isMapped())
8651 {
Geoff Langb1196682014-07-23 13:47:29 -04008652 context->recordError(gl::Error(GL_INVALID_OPERATION));
8653 return NULL;
Geoff Langbfdea662014-07-23 14:16:32 -04008654 }
8655
Geoff Lang2a1c15a2014-07-25 11:43:00 -04008656 gl::Error error = buffer->mapRange(0, buffer->getSize(), GL_MAP_WRITE_BIT);
8657 if (error.isError())
8658 {
8659 context->recordError(error);
8660 return NULL;
8661 }
8662
8663 return buffer->getMapPointer();
Shannon Woodsb3801742014-03-27 14:59:19 -04008664 }
8665
8666 return NULL;
8667}
8668
Kenneth Russell67ea1902014-10-06 16:44:50 -07008669GLboolean GL_APIENTRY glUnmapBufferOES(GLenum target)
Shannon Woodsb3801742014-03-27 14:59:19 -04008670{
8671 EVENT("(GLenum target = 0x%X)", target);
8672
Geoff Langbfdea662014-07-23 14:16:32 -04008673 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008674 if (context)
8675 {
8676 if (!gl::ValidBufferTarget(context, target))
Shannon Woodsb3801742014-03-27 14:59:19 -04008677 {
Geoff Langb1196682014-07-23 13:47:29 -04008678 context->recordError(gl::Error(GL_INVALID_ENUM));
8679 return GL_FALSE;
Shannon Woodsb3801742014-03-27 14:59:19 -04008680 }
Geoff Langbfdea662014-07-23 14:16:32 -04008681
8682 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
8683
8684 if (buffer == NULL || !buffer->isMapped())
8685 {
Geoff Langb1196682014-07-23 13:47:29 -04008686 context->recordError(gl::Error(GL_INVALID_OPERATION));
8687 return GL_FALSE;
Geoff Langbfdea662014-07-23 14:16:32 -04008688 }
8689
8690 // TODO: detect if we had corruption. if so, throw an error and return false.
8691
Geoff Lang2a1c15a2014-07-25 11:43:00 -04008692 gl::Error error = buffer->unmap();
8693 if (error.isError())
8694 {
8695 context->recordError(error);
8696 return GL_FALSE;
8697 }
Geoff Langbfdea662014-07-23 14:16:32 -04008698
8699 return GL_TRUE;
Shannon Woodsb3801742014-03-27 14:59:19 -04008700 }
8701
8702 return GL_FALSE;
8703}
8704
Kenneth Russell67ea1902014-10-06 16:44:50 -07008705void* GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
Shannon Woods916e7692014-03-27 16:58:22 -04008706{
8707 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
8708 target, offset, length, access);
8709
Geoff Langbfdea662014-07-23 14:16:32 -04008710 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008711 if (context)
8712 {
8713 if (!gl::ValidBufferTarget(context, target))
Shannon Woods916e7692014-03-27 16:58:22 -04008714 {
Geoff Langb1196682014-07-23 13:47:29 -04008715 context->recordError(gl::Error(GL_INVALID_ENUM));
8716 return NULL;
Shannon Woods916e7692014-03-27 16:58:22 -04008717 }
Geoff Langbfdea662014-07-23 14:16:32 -04008718
8719 if (offset < 0 || length < 0)
8720 {
Geoff Langb1196682014-07-23 13:47:29 -04008721 context->recordError(gl::Error(GL_INVALID_VALUE));
8722 return NULL;
Geoff Langbfdea662014-07-23 14:16:32 -04008723 }
8724
8725 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
8726
8727 if (buffer == NULL)
8728 {
Geoff Langb1196682014-07-23 13:47:29 -04008729 context->recordError(gl::Error(GL_INVALID_OPERATION));
8730 return NULL;
Geoff Langbfdea662014-07-23 14:16:32 -04008731 }
8732
8733 // Check for buffer overflow
8734 size_t offsetSize = static_cast<size_t>(offset);
8735 size_t lengthSize = static_cast<size_t>(length);
8736
8737 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
8738 offsetSize + lengthSize > static_cast<size_t>(buffer->getSize()))
8739 {
Geoff Langb1196682014-07-23 13:47:29 -04008740 context->recordError(gl::Error(GL_INVALID_VALUE));
8741 return NULL;
Geoff Langbfdea662014-07-23 14:16:32 -04008742 }
8743
8744 // Check for invalid bits in the mask
8745 GLbitfield allAccessBits = GL_MAP_READ_BIT |
8746 GL_MAP_WRITE_BIT |
8747 GL_MAP_INVALIDATE_RANGE_BIT |
8748 GL_MAP_INVALIDATE_BUFFER_BIT |
8749 GL_MAP_FLUSH_EXPLICIT_BIT |
8750 GL_MAP_UNSYNCHRONIZED_BIT;
8751
8752 if (access & ~(allAccessBits))
8753 {
Geoff Langb1196682014-07-23 13:47:29 -04008754 context->recordError(gl::Error(GL_INVALID_VALUE));
8755 return NULL;
Geoff Langbfdea662014-07-23 14:16:32 -04008756 }
8757
8758 if (length == 0 || buffer->isMapped())
8759 {
Geoff Langb1196682014-07-23 13:47:29 -04008760 context->recordError(gl::Error(GL_INVALID_OPERATION));
8761 return NULL;
Geoff Langbfdea662014-07-23 14:16:32 -04008762 }
8763
8764 // Check for invalid bit combinations
8765 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
8766 {
Geoff Langb1196682014-07-23 13:47:29 -04008767 context->recordError(gl::Error(GL_INVALID_OPERATION));
8768 return NULL;
Geoff Langbfdea662014-07-23 14:16:32 -04008769 }
8770
8771 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
8772 GL_MAP_INVALIDATE_BUFFER_BIT |
8773 GL_MAP_UNSYNCHRONIZED_BIT;
8774
8775 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
8776 {
Geoff Langb1196682014-07-23 13:47:29 -04008777 context->recordError(gl::Error(GL_INVALID_OPERATION));
8778 return NULL;
Geoff Langbfdea662014-07-23 14:16:32 -04008779 }
8780
8781 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
8782 {
Geoff Langb1196682014-07-23 13:47:29 -04008783 context->recordError(gl::Error(GL_INVALID_OPERATION));
8784 return NULL;
Geoff Langbfdea662014-07-23 14:16:32 -04008785 }
8786
Geoff Lang2a1c15a2014-07-25 11:43:00 -04008787 gl::Error error = buffer->mapRange(offset, length, access);
8788 if (error.isError())
8789 {
8790 context->recordError(error);
8791 return NULL;
8792 }
8793
8794 return buffer->getMapPointer();
Shannon Woods916e7692014-03-27 16:58:22 -04008795 }
8796
8797 return NULL;
8798}
8799
Kenneth Russell67ea1902014-10-06 16:44:50 -07008800void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
Shannon Woods916e7692014-03-27 16:58:22 -04008801{
8802 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
8803
Geoff Langbfdea662014-07-23 14:16:32 -04008804 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008805 if (context)
8806 {
8807 if (offset < 0 || length < 0)
Shannon Woods916e7692014-03-27 16:58:22 -04008808 {
Geoff Langb1196682014-07-23 13:47:29 -04008809 context->recordError(gl::Error(GL_INVALID_VALUE));
8810 return;
Shannon Woods916e7692014-03-27 16:58:22 -04008811 }
Geoff Langbfdea662014-07-23 14:16:32 -04008812
8813 if (!gl::ValidBufferTarget(context, target))
8814 {
Geoff Langb1196682014-07-23 13:47:29 -04008815 context->recordError(gl::Error(GL_INVALID_ENUM));
8816 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008817 }
8818
8819 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
8820
8821 if (buffer == NULL)
8822 {
Geoff Langb1196682014-07-23 13:47:29 -04008823 context->recordError(gl::Error(GL_INVALID_OPERATION));
8824 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008825 }
8826
8827 if (!buffer->isMapped() || (buffer->getAccessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
8828 {
Geoff Langb1196682014-07-23 13:47:29 -04008829 context->recordError(gl::Error(GL_INVALID_OPERATION));
8830 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008831 }
8832
8833 // Check for buffer overflow
8834 size_t offsetSize = static_cast<size_t>(offset);
8835 size_t lengthSize = static_cast<size_t>(length);
8836
8837 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
8838 offsetSize + lengthSize > static_cast<size_t>(buffer->getMapLength()))
8839 {
Geoff Langb1196682014-07-23 13:47:29 -04008840 context->recordError(gl::Error(GL_INVALID_VALUE));
8841 return;
Geoff Langbfdea662014-07-23 14:16:32 -04008842 }
8843
8844 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
Shannon Woods916e7692014-03-27 16:58:22 -04008845 }
8846}
8847
Kenneth Russell67ea1902014-10-06 16:44:50 -07008848__eglMustCastToProperFunctionPointerType EGLAPIENTRY glGetProcAddress(const char *procname)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00008849{
8850 struct Extension
8851 {
8852 const char *name;
8853 __eglMustCastToProperFunctionPointerType address;
8854 };
8855
8856 static const Extension glExtensions[] =
8857 {
8858 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00008859 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00008860 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00008861 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
8862 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
8863 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
8864 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
8865 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
8866 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
8867 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00008868 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00008869 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00008870 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
8871 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
8872 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
8873 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00008874 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
8875 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
8876 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
8877 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
8878 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
8879 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
8880 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +00008881 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00008882 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
8883 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
8884 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00008885 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -04008886 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
8887 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
8888 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -04008889 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
8890 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
8891 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00008892
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +00008893 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00008894 {
8895 if (strcmp(procname, glExtensions[ext].name) == 0)
8896 {
8897 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
8898 }
8899 }
8900
8901 return NULL;
8902}
8903
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00008904// Non-public functions used by EGL
8905
Kenneth Russell67ea1902014-10-06 16:44:50 -07008906bool EGLAPIENTRY glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00008907{
8908 EVENT("(egl::Surface* surface = 0x%0.8p)",
8909 surface);
8910
Geoff Langbfdea662014-07-23 14:16:32 -04008911 gl::Context *context = gl::getNonLostContext();
Geoff Langbfdea662014-07-23 14:16:32 -04008912 if (context)
8913 {
8914 gl::Texture2D *textureObject = context->getTexture2D();
8915 ASSERT(textureObject != NULL);
8916
8917 if (textureObject->isImmutable())
jbauman@chromium.orgae345802011-03-30 22:04:25 +00008918 {
Geoff Langbfdea662014-07-23 14:16:32 -04008919 return false;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00008920 }
Geoff Langbfdea662014-07-23 14:16:32 -04008921
8922 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00008923 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00008924
8925 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00008926}
8927
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00008928}