blob: e00476936f888ddf8fd0f995527e20d74f2fe15e [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
Geoff Lang48dcae72014-02-05 16:28:24 -05003// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040024#include "libGLESv2/VertexArray.h"
Brandon Jones5bf98292014-06-06 17:19:38 -070025#include "libGLESv2/VertexAttribute.h"
Geoff Langc8058452014-02-03 12:04:11 -050026#include "libGLESv2/TransformFeedback.h"
Jamie Madille261b442014-06-25 12:42:21 -040027#include "libGLESv2/FramebufferAttachment.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000028
Geoff Lange8ebe7f2013-08-05 15:03:13 -040029#include "libGLESv2/validationES.h"
30#include "libGLESv2/validationES2.h"
31#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050032#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040033
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000034extern "C"
35{
36
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000037// OpenGL ES 2.0 functions
38
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000039void __stdcall glActiveTexture(GLenum texture)
40{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000041 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000042
Ehsan Akhgari10530c32014-07-02 20:37:53 -040043 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000044 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000045 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000046
47 if (context)
48 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000049 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
50 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000051 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000052 }
53
Shannon Woods53a94a82014-06-24 15:20:36 -040054 context->getState().setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000055 }
56 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -040057 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000059 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000060 }
61}
62
63void __stdcall glAttachShader(GLuint program, GLuint shader)
64{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000065 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000066
Ehsan Akhgari10530c32014-07-02 20:37:53 -040067 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000069 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000070
71 if (context)
72 {
73 gl::Program *programObject = context->getProgram(program);
74 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000075
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000076 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000077 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000078 if (context->getShader(program))
79 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000080 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000081 }
82 else
83 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000084 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000085 }
86 }
87
88 if (!shaderObject)
89 {
90 if (context->getProgram(shader))
91 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000092 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000093 }
94 else
95 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000096 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000097 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000098 }
99
100 if (!programObject->attachShader(shaderObject))
101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000102 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000103 }
104 }
105 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400106 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000108 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000109 }
110}
111
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000112void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
113{
114 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
115
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400116 ANGLE_TRY
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000117 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000118 gl::Context *context = gl::getNonLostContext();
119
120 if (context)
121 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400122 if (!ValidateBeginQuery(context, target, id))
Geoff Lang37dde692014-01-31 16:34:54 -0500123 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400124 return;
Geoff Lang37dde692014-01-31 16:34:54 -0500125 }
126
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000127 context->beginQuery(target, id);
128 }
129 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400130 ANGLE_CATCH_ALL
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000132 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000133 }
134}
135
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000136void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000138 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000139
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400140 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000141 {
142 if (index >= gl::MAX_VERTEX_ATTRIBS)
143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000144 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000145 }
146
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000147 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148
149 if (context)
150 {
151 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000152
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000153 if (!programObject)
154 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000155 if (context->getShader(program))
156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000157 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000158 }
159 else
160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000161 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000162 }
163 }
164
165 if (strncmp(name, "gl_", 3) == 0)
166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000167 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000168 }
169
170 programObject->bindAttributeLocation(index, name);
171 }
172 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400173 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000174 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000175 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000176 }
177}
178
179void __stdcall glBindBuffer(GLenum target, GLuint buffer)
180{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000181 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000182
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400183 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000184 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000185 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000186
187 if (context)
188 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500189 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000190 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500191 return gl::error(GL_INVALID_ENUM);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000192 }
193
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000194 switch (target)
195 {
196 case GL_ARRAY_BUFFER:
197 context->bindArrayBuffer(buffer);
198 return;
199 case GL_ELEMENT_ARRAY_BUFFER:
200 context->bindElementArrayBuffer(buffer);
201 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000202 case GL_COPY_READ_BUFFER:
203 context->bindCopyReadBuffer(buffer);
204 return;
205 case GL_COPY_WRITE_BUFFER:
206 context->bindCopyWriteBuffer(buffer);
207 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000208 case GL_PIXEL_PACK_BUFFER:
209 context->bindPixelPackBuffer(buffer);
210 return;
211 case GL_PIXEL_UNPACK_BUFFER:
212 context->bindPixelUnpackBuffer(buffer);
213 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000214 case GL_UNIFORM_BUFFER:
215 context->bindGenericUniformBuffer(buffer);
216 return;
217 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000218 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000219 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000220 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000221 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000222 }
223 }
224 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400225 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000227 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000228 }
229}
230
231void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
232{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000233 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000234
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400235 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000236 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500237 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000239 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000240 }
241
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000242 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000243
244 if (context)
245 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000246 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
247 {
248 context->bindReadFramebuffer(framebuffer);
249 }
250
251 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
252 {
253 context->bindDrawFramebuffer(framebuffer);
254 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000255 }
256 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400257 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000259 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000260 }
261}
262
263void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
264{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000265 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000266
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400267 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000268 {
269 if (target != GL_RENDERBUFFER)
270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000271 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000272 }
273
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275
276 if (context)
277 {
278 context->bindRenderbuffer(renderbuffer);
279 }
280 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400281 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000283 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000284 }
285}
286
287void __stdcall glBindTexture(GLenum target, GLuint texture)
288{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000289 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000290
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400291 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000293 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000294
295 if (context)
296 {
297 gl::Texture *textureObject = context->getTexture(texture);
298
299 if (textureObject && textureObject->getTarget() != target && texture != 0)
300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000301 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000302 }
303
304 switch (target)
305 {
306 case GL_TEXTURE_2D:
307 context->bindTexture2D(texture);
308 return;
309 case GL_TEXTURE_CUBE_MAP:
310 context->bindTextureCubeMap(texture);
311 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000312 case GL_TEXTURE_3D:
313 if (context->getClientVersion() < 3)
314 {
315 return gl::error(GL_INVALID_ENUM);
316 }
317 context->bindTexture3D(texture);
318 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000319 case GL_TEXTURE_2D_ARRAY:
320 if (context->getClientVersion() < 3)
321 {
322 return gl::error(GL_INVALID_ENUM);
323 }
324 context->bindTexture2DArray(texture);
325 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000326 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000327 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000328 }
329 }
330 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400331 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000333 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000334 }
335}
336
337void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
338{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000339 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000340 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000341
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400342 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000343 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000344 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000345
346 if (context)
347 {
Shannon Woods53a94a82014-06-24 15:20:36 -0400348 context->getState().setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000349 }
350 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400351 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000353 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000354 }
355}
356
357void __stdcall glBlendEquation(GLenum mode)
358{
359 glBlendEquationSeparate(mode, mode);
360}
361
362void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
363{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000364 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000365
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400366 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000367 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000368 gl::Context *context = gl::getNonLostContext();
369
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000370 switch (modeRGB)
371 {
372 case GL_FUNC_ADD:
373 case GL_FUNC_SUBTRACT:
374 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000375 case GL_MIN:
376 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000377 break;
378
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000379 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000380 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000381 }
382
383 switch (modeAlpha)
384 {
385 case GL_FUNC_ADD:
386 case GL_FUNC_SUBTRACT:
387 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000388 case GL_MIN:
389 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000390 break;
391
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000392 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000393 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000394 }
395
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000396 if (context)
397 {
Shannon Woods53a94a82014-06-24 15:20:36 -0400398 context->getState().setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000399 }
400 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400401 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000403 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000404 }
405}
406
407void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
408{
409 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
410}
411
412void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
413{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000414 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 +0000415 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000416
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400417 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000418 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000419 gl::Context *context = gl::getNonLostContext();
420
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000421 switch (srcRGB)
422 {
423 case GL_ZERO:
424 case GL_ONE:
425 case GL_SRC_COLOR:
426 case GL_ONE_MINUS_SRC_COLOR:
427 case GL_DST_COLOR:
428 case GL_ONE_MINUS_DST_COLOR:
429 case GL_SRC_ALPHA:
430 case GL_ONE_MINUS_SRC_ALPHA:
431 case GL_DST_ALPHA:
432 case GL_ONE_MINUS_DST_ALPHA:
433 case GL_CONSTANT_COLOR:
434 case GL_ONE_MINUS_CONSTANT_COLOR:
435 case GL_CONSTANT_ALPHA:
436 case GL_ONE_MINUS_CONSTANT_ALPHA:
437 case GL_SRC_ALPHA_SATURATE:
438 break;
439 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000440 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000441 }
442
443 switch (dstRGB)
444 {
445 case GL_ZERO:
446 case GL_ONE:
447 case GL_SRC_COLOR:
448 case GL_ONE_MINUS_SRC_COLOR:
449 case GL_DST_COLOR:
450 case GL_ONE_MINUS_DST_COLOR:
451 case GL_SRC_ALPHA:
452 case GL_ONE_MINUS_SRC_ALPHA:
453 case GL_DST_ALPHA:
454 case GL_ONE_MINUS_DST_ALPHA:
455 case GL_CONSTANT_COLOR:
456 case GL_ONE_MINUS_CONSTANT_COLOR:
457 case GL_CONSTANT_ALPHA:
458 case GL_ONE_MINUS_CONSTANT_ALPHA:
459 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000460
461 case GL_SRC_ALPHA_SATURATE:
462 if (!context || context->getClientVersion() < 3)
463 {
464 return gl::error(GL_INVALID_ENUM);
465 }
466 break;
467
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000468 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000469 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000470 }
471
472 switch (srcAlpha)
473 {
474 case GL_ZERO:
475 case GL_ONE:
476 case GL_SRC_COLOR:
477 case GL_ONE_MINUS_SRC_COLOR:
478 case GL_DST_COLOR:
479 case GL_ONE_MINUS_DST_COLOR:
480 case GL_SRC_ALPHA:
481 case GL_ONE_MINUS_SRC_ALPHA:
482 case GL_DST_ALPHA:
483 case GL_ONE_MINUS_DST_ALPHA:
484 case GL_CONSTANT_COLOR:
485 case GL_ONE_MINUS_CONSTANT_COLOR:
486 case GL_CONSTANT_ALPHA:
487 case GL_ONE_MINUS_CONSTANT_ALPHA:
488 case GL_SRC_ALPHA_SATURATE:
489 break;
490 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000491 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000492 }
493
494 switch (dstAlpha)
495 {
496 case GL_ZERO:
497 case GL_ONE:
498 case GL_SRC_COLOR:
499 case GL_ONE_MINUS_SRC_COLOR:
500 case GL_DST_COLOR:
501 case GL_ONE_MINUS_DST_COLOR:
502 case GL_SRC_ALPHA:
503 case GL_ONE_MINUS_SRC_ALPHA:
504 case GL_DST_ALPHA:
505 case GL_ONE_MINUS_DST_ALPHA:
506 case GL_CONSTANT_COLOR:
507 case GL_ONE_MINUS_CONSTANT_COLOR:
508 case GL_CONSTANT_ALPHA:
509 case GL_ONE_MINUS_CONSTANT_ALPHA:
510 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000511
512 case GL_SRC_ALPHA_SATURATE:
513 if (!context || context->getClientVersion() < 3)
514 {
515 return gl::error(GL_INVALID_ENUM);
516 }
517 break;
518
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000519 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000520 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000521 }
522
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000523 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
524 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
525
526 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
527 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
528
529 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000530 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000531 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000532 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000533 }
534
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000535 if (context)
536 {
Shannon Woods53a94a82014-06-24 15:20:36 -0400537 context->getState().setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000538 }
539 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400540 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000542 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000543 }
544}
545
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000546void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000548 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 +0000549 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000550
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400551 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000552 {
553 if (size < 0)
554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000555 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000556 }
557
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000558 gl::Context *context = gl::getNonLostContext();
559
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000560 switch (usage)
561 {
562 case GL_STREAM_DRAW:
563 case GL_STATIC_DRAW:
564 case GL_DYNAMIC_DRAW:
565 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000566
567 case GL_STREAM_READ:
568 case GL_STREAM_COPY:
569 case GL_STATIC_READ:
570 case GL_STATIC_COPY:
571 case GL_DYNAMIC_READ:
572 case GL_DYNAMIC_COPY:
573 if (context && context->getClientVersion() < 3)
574 {
575 return gl::error(GL_INVALID_ENUM);
576 }
577 break;
578
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000580 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000581 }
582
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000583 if (context)
584 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500585 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000587 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000588 }
589
Shannon Woods53a94a82014-06-24 15:20:36 -0400590 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill8c96d582014-03-05 15:01:23 -0500591
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000592 if (!buffer)
593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000594 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000595 }
596
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000597 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000598 }
599 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400600 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000602 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000603 }
604}
605
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000606void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000607{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000608 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 +0000609 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000610
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400611 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000612 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000613 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000615 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000616 }
617
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000618 if (data == NULL)
619 {
620 return;
621 }
622
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000623 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000624
625 if (context)
626 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500627 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000629 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000630 }
631
Shannon Woods53a94a82014-06-24 15:20:36 -0400632 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill8c96d582014-03-05 15:01:23 -0500633
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000634 if (!buffer)
635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000636 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000637 }
638
Brandon Jonesd38f9262014-06-18 16:26:45 -0700639 if (buffer->isMapped())
Jamie Madill7a5f7382014-03-05 15:01:24 -0500640 {
641 return gl::error(GL_INVALID_OPERATION);
642 }
643
Geoff Lang876dc722014-05-01 17:10:24 -0400644 // Check for possible overflow of size + offset
645 if (!rx::IsUnsignedAdditionSafe<size_t>(size, offset))
646 {
647 return gl::error(GL_OUT_OF_MEMORY);
648 }
649
Brandon Jonesd38f9262014-06-18 16:26:45 -0700650 if (size + offset > buffer->getSize())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000652 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000653 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000654
655 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000656 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000657 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400658 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000660 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000661 }
662}
663
664GLenum __stdcall glCheckFramebufferStatus(GLenum target)
665{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000666 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000667
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400668 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000669 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500670 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000672 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000673 }
674
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000675 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000676
677 if (context)
678 {
Shannon Woods53a94a82014-06-24 15:20:36 -0400679 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500680 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000681 return framebuffer->completeness();
682 }
683 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400684 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000686 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000687 }
688
689 return 0;
690}
691
692void __stdcall glClear(GLbitfield mask)
693{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000694 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000695
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400696 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000697 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000698 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000699
700 if (context)
701 {
Shannon Woods53a94a82014-06-24 15:20:36 -0400702 gl::Framebuffer *framebufferObject = context->getState().getDrawFramebuffer();
Geoff Lang0b833232013-08-21 10:13:29 -0400703
704 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
705 {
706 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
707 }
708
709 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
710 {
711 return gl::error(GL_INVALID_VALUE);
712 }
713
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000714 context->clear(mask);
715 }
716 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400717 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000719 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000720 }
721}
722
723void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
724{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000725 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000726 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000727
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400728 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000729 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000730 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000731
732 if (context)
733 {
Shannon Woods53a94a82014-06-24 15:20:36 -0400734 context->getState().setClearColor(red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000735 }
736 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400737 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000740 }
741}
742
743void __stdcall glClearDepthf(GLclampf depth)
744{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000745 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000746
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400747 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000748 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000749 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000750
751 if (context)
752 {
Shannon Woods53a94a82014-06-24 15:20:36 -0400753 context->getState().setClearDepth(depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000754 }
755 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400756 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000758 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000759 }
760}
761
762void __stdcall glClearStencil(GLint s)
763{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000764 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000765
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400766 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000767 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000768 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000769
770 if (context)
771 {
Shannon Woods53a94a82014-06-24 15:20:36 -0400772 context->getState().setClearStencil(s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000773 }
774 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400775 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000777 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000778 }
779}
780
781void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
782{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000783 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000784 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000785
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400786 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000787 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000788 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000789
790 if (context)
791 {
Shannon Woods53a94a82014-06-24 15:20:36 -0400792 context->getState().setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000793 }
794 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400795 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000797 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000798 }
799}
800
801void __stdcall glCompileShader(GLuint shader)
802{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000803 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000804
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400805 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000806 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000807 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000808
809 if (context)
810 {
811 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000812
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000813 if (!shaderObject)
814 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000815 if (context->getProgram(shader))
816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000817 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000818 }
819 else
820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000821 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000822 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000823 }
824
825 shaderObject->compile();
826 }
827 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400828 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000830 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000831 }
832}
833
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000834void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
835 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000837 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000838 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000839 target, level, internalformat, width, height, border, imageSize, data);
840
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400841 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000842 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000843 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000844
845 if (context)
846 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000847 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400848 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madill6f38f822014-06-06 17:12:20 -0400849 0, 0, width, height, border, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000850 {
851 return;
852 }
853
854 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400855 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madill6f38f822014-06-06 17:12:20 -0400856 0, 0, 0, width, height, 1, border, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000857 {
858 return;
859 }
860
Geoff Lange4a492b2014-06-19 14:14:41 -0400861 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000863 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000864 }
865
866 switch (target)
867 {
868 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000869 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000870 gl::Texture2D *texture = context->getTexture2D();
871 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000872 }
873 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000874
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000875 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
876 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
877 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
878 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
879 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
880 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000881 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000882 gl::TextureCubeMap *texture = context->getTextureCubeMap();
883 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000884 }
885 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000886
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000887 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000888 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000889 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000890 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000891 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400892 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000894 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000895 }
896}
897
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000898void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
899 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000900{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000901 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000902 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000903 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000904 target, level, xoffset, yoffset, width, height, format, imageSize, data);
905
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400906 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000907 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000908 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000909
910 if (context)
911 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000912 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400913 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000914 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
915 {
916 return;
917 }
918
919 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400920 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400921 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000922 {
923 return;
924 }
925
Geoff Lange4a492b2014-06-19 14:14:41 -0400926 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000928 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000929 }
930
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000931 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000932 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000933 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000934 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000935 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000936 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000937 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000938 break;
939
940 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
941 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
942 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
943 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
944 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
945 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000946 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000947 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000948 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000949 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000950 break;
951
952 default:
953 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000954 }
955 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000956 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400957 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000959 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000960 }
961}
962
963void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
964{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000965 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000966 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000967 target, level, internalformat, x, y, width, height, border);
968
Ehsan Akhgari10530c32014-07-02 20:37:53 -0400969 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000970 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000971 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000972
973 if (context)
974 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000975 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400976 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000977 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000978 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000979 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000980 }
981
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000982 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400983 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000984 0, 0, 0, x, y, width, height, border))
985 {
986 return;
987 }
988
Shannon Woods53a94a82014-06-24 15:20:36 -0400989 gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000990
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000991 switch (target)
992 {
993 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000994 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000995 gl::Texture2D *texture = context->getTexture2D();
996 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000997 }
998 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000999
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001000 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1001 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1002 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1003 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1004 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1005 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001006 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001007 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1008 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001009 }
1010 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001011
1012 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001013 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001014 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001015 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001016 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001017 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001019 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001020 }
1021}
1022
1023void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1024{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001025 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001026 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001027 target, level, xoffset, yoffset, x, y, width, height);
1028
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001029 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001030 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001031 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001032
1033 if (context)
1034 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001035 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001036 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001037 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001038 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001039 return;
1040 }
1041
1042 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001043 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001044 xoffset, yoffset, 0, x, y, width, height, 0))
1045 {
1046 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001047 }
1048
Shannon Woods53a94a82014-06-24 15:20:36 -04001049 gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001050
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001051 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001052 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001053 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001054 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001055 gl::Texture2D *texture = context->getTexture2D();
1056 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001057 }
1058 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001059
1060 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1061 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1062 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1063 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1064 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1065 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001066 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001067 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1068 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001069 }
1070 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001071
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001072 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001073 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001074 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001075 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001076 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001077
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001078 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001080 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001081 }
1082}
1083
1084GLuint __stdcall glCreateProgram(void)
1085{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001086 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001087
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001088 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001089 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001090 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001091
1092 if (context)
1093 {
1094 return context->createProgram();
1095 }
1096 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001097 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001098 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001099 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001100 }
1101
1102 return 0;
1103}
1104
1105GLuint __stdcall glCreateShader(GLenum type)
1106{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001107 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001108
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001109 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001110 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001111 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001112
1113 if (context)
1114 {
1115 switch (type)
1116 {
1117 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001118 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001119 return context->createShader(type);
1120 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001121 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001122 }
1123 }
1124 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001125 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001127 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001128 }
1129
1130 return 0;
1131}
1132
1133void __stdcall glCullFace(GLenum mode)
1134{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001135 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001136
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001137 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001138 {
1139 switch (mode)
1140 {
1141 case GL_FRONT:
1142 case GL_BACK:
1143 case GL_FRONT_AND_BACK:
1144 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001145 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001146
1147 if (context)
1148 {
Shannon Woods53a94a82014-06-24 15:20:36 -04001149 context->getState().setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001150 }
1151 }
1152 break;
1153 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001154 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001155 }
1156 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001157 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001159 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001160 }
1161}
1162
1163void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1164{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001165 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001166
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001167 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001168 {
1169 if (n < 0)
1170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001171 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001172 }
1173
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001174 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001175
1176 if (context)
1177 {
1178 for (int i = 0; i < n; i++)
1179 {
1180 context->deleteBuffer(buffers[i]);
1181 }
1182 }
1183 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001184 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001186 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001187 }
1188}
1189
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001190void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1191{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001192 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001193
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001194 ANGLE_TRY
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001195 {
1196 if (n < 0)
1197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001198 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001199 }
1200
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001201 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001202
1203 if (context)
1204 {
1205 for (int i = 0; i < n; i++)
1206 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001207 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001208 }
1209 }
1210 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001211 ANGLE_CATCH_ALL
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001213 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001214 }
1215}
1216
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001217void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1218{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001219 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001220
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001221 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001222 {
1223 if (n < 0)
1224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001225 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001226 }
1227
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001228 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001229
1230 if (context)
1231 {
1232 for (int i = 0; i < n; i++)
1233 {
1234 if (framebuffers[i] != 0)
1235 {
1236 context->deleteFramebuffer(framebuffers[i]);
1237 }
1238 }
1239 }
1240 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001241 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001243 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001244 }
1245}
1246
1247void __stdcall glDeleteProgram(GLuint program)
1248{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001249 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001250
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001251 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001252 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001253 if (program == 0)
1254 {
1255 return;
1256 }
1257
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001258 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001259
1260 if (context)
1261 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001262 if (!context->getProgram(program))
1263 {
1264 if(context->getShader(program))
1265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001266 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001267 }
1268 else
1269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001270 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001271 }
1272 }
1273
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001274 context->deleteProgram(program);
1275 }
1276 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001277 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001279 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001280 }
1281}
1282
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001283void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1284{
1285 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1286
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001287 ANGLE_TRY
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001288 {
1289 if (n < 0)
1290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001291 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001292 }
1293
1294 gl::Context *context = gl::getNonLostContext();
1295
1296 if (context)
1297 {
1298 for (int i = 0; i < n; i++)
1299 {
1300 context->deleteQuery(ids[i]);
1301 }
1302 }
1303 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001304 ANGLE_CATCH_ALL
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001306 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001307 }
1308}
1309
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001310void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1311{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001312 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001313
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001314 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001315 {
1316 if (n < 0)
1317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001318 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001319 }
1320
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001321 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001322
1323 if (context)
1324 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001325 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001326 {
1327 context->deleteRenderbuffer(renderbuffers[i]);
1328 }
1329 }
1330 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001331 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001333 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001334 }
1335}
1336
1337void __stdcall glDeleteShader(GLuint shader)
1338{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001339 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001340
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001341 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001342 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001343 if (shader == 0)
1344 {
1345 return;
1346 }
1347
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001348 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001349
1350 if (context)
1351 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001352 if (!context->getShader(shader))
1353 {
1354 if(context->getProgram(shader))
1355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001356 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001357 }
1358 else
1359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001360 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001361 }
1362 }
1363
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001364 context->deleteShader(shader);
1365 }
1366 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001367 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001369 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001370 }
1371}
1372
1373void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1374{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001375 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001376
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001377 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001378 {
1379 if (n < 0)
1380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001381 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001382 }
1383
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001384 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001385
1386 if (context)
1387 {
1388 for (int i = 0; i < n; i++)
1389 {
1390 if (textures[i] != 0)
1391 {
1392 context->deleteTexture(textures[i]);
1393 }
1394 }
1395 }
1396 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001397 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001399 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001400 }
1401}
1402
1403void __stdcall glDepthFunc(GLenum func)
1404{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001405 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001406
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001407 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001408 {
1409 switch (func)
1410 {
1411 case GL_NEVER:
1412 case GL_ALWAYS:
1413 case GL_LESS:
1414 case GL_LEQUAL:
1415 case GL_EQUAL:
1416 case GL_GREATER:
1417 case GL_GEQUAL:
1418 case GL_NOTEQUAL:
1419 break;
1420 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001421 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001422 }
1423
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001424 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001425
1426 if (context)
1427 {
Shannon Woods53a94a82014-06-24 15:20:36 -04001428 context->getState().setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001429 }
1430 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001431 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001433 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001434 }
1435}
1436
1437void __stdcall glDepthMask(GLboolean flag)
1438{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001439 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001440
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001441 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001442 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001443 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001444
1445 if (context)
1446 {
Shannon Woods53a94a82014-06-24 15:20:36 -04001447 context->getState().setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001448 }
1449 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001450 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001452 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001453 }
1454}
1455
1456void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001458 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001459
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001460 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001461 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001462 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001463
1464 if (context)
1465 {
Shannon Woods53a94a82014-06-24 15:20:36 -04001466 context->getState().setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001467 }
1468 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001469 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001471 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001472 }
1473}
1474
1475void __stdcall glDetachShader(GLuint program, GLuint shader)
1476{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001477 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001478
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001479 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001480 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001481 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001482
1483 if (context)
1484 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001485
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001486 gl::Program *programObject = context->getProgram(program);
1487 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001488
1489 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001490 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001491 gl::Shader *shaderByProgramHandle;
1492 shaderByProgramHandle = context->getShader(program);
1493 if (!shaderByProgramHandle)
1494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001495 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001496 }
1497 else
1498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001500 }
1501 }
1502
1503 if (!shaderObject)
1504 {
1505 gl::Program *programByShaderHandle = context->getProgram(shader);
1506 if (!programByShaderHandle)
1507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001508 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001509 }
1510 else
1511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001512 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001513 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001514 }
1515
1516 if (!programObject->detachShader(shaderObject))
1517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001518 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001519 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001520 }
1521 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001522 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001524 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001525 }
1526}
1527
1528void __stdcall glDisable(GLenum cap)
1529{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001530 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001531
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001532 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001533 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001534 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001535
1536 if (context)
1537 {
Geoff Lang0550d032014-01-30 11:29:07 -05001538 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001540 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001541 }
Geoff Lang0550d032014-01-30 11:29:07 -05001542
Shannon Woods53a94a82014-06-24 15:20:36 -04001543 context->getState().setEnableFeature(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001544 }
1545 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001546 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001547 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001548 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001549 }
1550}
1551
1552void __stdcall glDisableVertexAttribArray(GLuint index)
1553{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001554 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001555
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001556 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001557 {
1558 if (index >= gl::MAX_VERTEX_ATTRIBS)
1559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001560 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001561 }
1562
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001563 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001564
1565 if (context)
1566 {
Shannon Woods53a94a82014-06-24 15:20:36 -04001567 context->getState().setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001568 }
1569 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001570 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001572 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001573 }
1574}
1575
1576void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1577{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001578 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001579
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001580 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001581 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001582 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001583
1584 if (context)
1585 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001586 if (!ValidateDrawArrays(context, mode, first, count))
Geoff Langeeba6e12014-02-03 13:12:30 -05001587 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001588 return;
Geoff Langeeba6e12014-02-03 13:12:30 -05001589 }
1590
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001591 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001592 }
1593 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001594 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001596 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001597 }
1598}
1599
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001600void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1601{
1602 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1603
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001604 ANGLE_TRY
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001605 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001606 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001607
Jamie Madill250d33f2014-06-06 17:09:03 -04001608 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001609 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001610 if (!ValidateDrawArraysInstanced(context, mode, first, count, primcount))
Jamie Madill7a5f7382014-03-05 15:01:24 -05001611 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001612 return;
Jamie Madill7a5f7382014-03-05 15:01:24 -05001613 }
1614
Jamie Madill250d33f2014-06-06 17:09:03 -04001615 context->drawArrays(mode, first, count, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001616 }
1617 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001618 ANGLE_CATCH_ALL
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001620 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001621 }
1622}
1623
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001624void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001625{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001626 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 +00001627 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001628
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001629 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001630 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001631 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001632
1633 if (context)
1634 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001635 if (!ValidateDrawElements(context, mode, count, type, indices))
daniel@transgaming.com83921382011-01-08 05:46:00 +00001636 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001637 return;
Jamie Madill7a5f7382014-03-05 15:01:24 -05001638 }
1639
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001640 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001641 }
1642 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001643 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001645 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001646 }
1647}
1648
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001649void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1650{
1651 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1652 mode, count, type, indices, primcount);
1653
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001654 ANGLE_TRY
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001655 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001656 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001657
Jamie Madill250d33f2014-06-06 17:09:03 -04001658 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001659 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001660 if (!ValidateDrawElementsInstanced(context, mode, count, type, indices, primcount))
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001661 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001662 return;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001663 }
Jamie Madill250d33f2014-06-06 17:09:03 -04001664
1665 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001666 }
1667 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001668 ANGLE_CATCH_ALL
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001670 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001671 }
1672}
1673
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001674void __stdcall glEnable(GLenum cap)
1675{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001676 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001677
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001678 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001679 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001680 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001681
1682 if (context)
1683 {
Geoff Lang0550d032014-01-30 11:29:07 -05001684 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001686 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001687 }
Geoff Lang0550d032014-01-30 11:29:07 -05001688
Shannon Woods53a94a82014-06-24 15:20:36 -04001689 context->getState().setEnableFeature(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001690 }
1691 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001692 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001694 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001695 }
1696}
1697
1698void __stdcall glEnableVertexAttribArray(GLuint index)
1699{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001700 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001701
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001702 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001703 {
1704 if (index >= gl::MAX_VERTEX_ATTRIBS)
1705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001707 }
1708
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001709 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001710
1711 if (context)
1712 {
Shannon Woods53a94a82014-06-24 15:20:36 -04001713 context->getState().setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001714 }
1715 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001716 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001718 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001719 }
1720}
1721
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001722void __stdcall glEndQueryEXT(GLenum target)
1723{
1724 EVENT("GLenum target = 0x%X)", target);
1725
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001726 ANGLE_TRY
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001727 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001728 gl::Context *context = gl::getNonLostContext();
1729
1730 if (context)
1731 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001732 if (!ValidateEndQuery(context, target))
Geoff Lang37dde692014-01-31 16:34:54 -05001733 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001734 return;
Geoff Lang37dde692014-01-31 16:34:54 -05001735 }
1736
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001737 context->endQuery(target);
1738 }
1739 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001740 ANGLE_CATCH_ALL
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001742 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001743 }
1744}
1745
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001746void __stdcall glFinishFenceNV(GLuint fence)
1747{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001748 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001749
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001750 ANGLE_TRY
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001751 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001752 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001753
1754 if (context)
1755 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001756 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001757
1758 if (fenceObject == NULL)
1759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001760 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001761 }
1762
Jamie Madillfb9a7402013-07-26 11:55:01 -04001763 if (fenceObject->isFence() != GL_TRUE)
1764 {
1765 return gl::error(GL_INVALID_OPERATION);
1766 }
1767
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001768 fenceObject->finishFence();
1769 }
1770 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001771 ANGLE_CATCH_ALL
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001773 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001774 }
1775}
1776
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001777void __stdcall glFinish(void)
1778{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001779 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001780
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001781 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001782 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001783 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001784
1785 if (context)
1786 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001787 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001788 }
1789 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001790 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001792 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001793 }
1794}
1795
1796void __stdcall glFlush(void)
1797{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001798 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001799
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001800 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001801 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001802 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803
1804 if (context)
1805 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001806 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001807 }
1808 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001809 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001811 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001812 }
1813}
1814
1815void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1816{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001817 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001818 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001819
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001820 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001821 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001822 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001824 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001825 }
1826
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001827 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001828
1829 if (context)
1830 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001831 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001832 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001833 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001834 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001835
Shannon Woods53a94a82014-06-24 15:20:36 -04001836 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001837 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001838
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001839 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001840 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001841 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001842 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001843 }
1844 else
1845 {
1846 switch (attachment)
1847 {
1848 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001849 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001850 break;
1851 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001852 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001853 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001854 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001855 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1856 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001857 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001858 UNREACHABLE();
1859 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001860 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001861 }
1862 }
1863 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001864 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001866 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001867 }
1868}
1869
1870void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1871{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001872 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001873 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001874
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001875 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001876 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001877 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001878 if (context)
1879 {
Jamie Madill570f7c82014-07-03 10:38:54 -04001880 if (!ValidateFramebufferTexture2D(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001881 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001882 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001883 }
1884
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001885 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001886 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001887 textarget = GL_NONE;
1888 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001889
Shannon Woods53a94a82014-06-24 15:20:36 -04001890 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001891
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001892 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001893 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001894 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001895 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001896 }
1897 else
1898 {
1899 switch (attachment)
1900 {
Geoff Lang309c92a2013-07-25 16:23:19 -04001901 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
1902 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
1903 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001904 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001905 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001906 }
1907 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001908 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001910 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001911 }
1912}
1913
1914void __stdcall glFrontFace(GLenum mode)
1915{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001916 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001917
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001918 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001919 {
1920 switch (mode)
1921 {
1922 case GL_CW:
1923 case GL_CCW:
1924 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001925 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001926
1927 if (context)
1928 {
Shannon Woods53a94a82014-06-24 15:20:36 -04001929 context->getState().setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001930 }
1931 }
1932 break;
1933 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001934 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001935 }
1936 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001937 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001938 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001939 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001940 }
1941}
1942
1943void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
1944{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001945 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001946
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001947 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001948 {
1949 if (n < 0)
1950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001951 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001952 }
1953
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001954 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001955
1956 if (context)
1957 {
1958 for (int i = 0; i < n; i++)
1959 {
1960 buffers[i] = context->createBuffer();
1961 }
1962 }
1963 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001964 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001967 }
1968}
1969
1970void __stdcall glGenerateMipmap(GLenum target)
1971{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001972 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001973
Ehsan Akhgari10530c32014-07-02 20:37:53 -04001974 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001975 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001976 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001977
1978 if (context)
1979 {
Jamie Madill35d15012013-10-07 10:46:37 -04001980 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001982 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001983 }
Geoff Langae4852a2013-06-05 15:00:34 -04001984
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001985 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04001986
1987 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04001988 {
1989 return gl::error(GL_INVALID_OPERATION);
1990 }
1991
Geoff Lang005df412013-10-16 14:12:50 -04001992 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Geoff Langc0b9ef42014-07-02 10:02:37 -04001993 const gl::TextureCaps &formatCaps = context->getTextureCaps().get(internalFormat);
Geoff Langcec35902014-04-16 10:52:36 -04001994
Geoff Langcbb84122014-06-11 15:30:32 -04001995 // GenerateMipmap should not generate an INVALID_OPERATION for textures created with
1996 // unsized formats or that are color renderable and filterable. Since we do not track if
1997 // the texture was created with sized or unsized format (only sized formats are stored),
1998 // it is not possible to make sure the the LUMA formats can generate mipmaps (they should
1999 // be able to) because they aren't color renderable. Simply do a special case for LUMA
2000 // textures since they're the only texture format that can be created with unsized formats
2001 // that is not color renderable. New unsized formats are unlikely to be added, since ES2
2002 // was the last version to use add them.
2003 bool isLUMA = internalFormat == GL_LUMINANCE8_EXT ||
2004 internalFormat == GL_LUMINANCE8_ALPHA8_EXT ||
2005 internalFormat == GL_ALPHA8_EXT;
Jamie Madill61b54432014-02-18 15:27:19 -05002006
Geoff Lang6cf8e1b2014-07-03 13:03:57 -04002007 if (gl::GetDepthBits(internalFormat) > 0 || gl::GetStencilBits(internalFormat) > 0 || !formatCaps.filterable ||
2008 (!formatCaps.renderable && !isLUMA) || gl::IsFormatCompressed(internalFormat))
Geoff Langae4852a2013-06-05 15:00:34 -04002009 {
2010 return gl::error(GL_INVALID_OPERATION);
2011 }
2012
Geoff Lang05b05022014-06-11 15:31:45 -04002013 // GL_EXT_sRGB does not support mipmap generation on sRGB textures
Geoff Lange4a492b2014-06-19 14:14:41 -04002014 if (context->getClientVersion() == 2 && gl::GetColorEncoding(internalFormat) == GL_SRGB)
Geoff Lang05b05022014-06-11 15:31:45 -04002015 {
2016 return gl::error(GL_INVALID_OPERATION);
2017 }
2018
Jamie Madillc1f8b162013-10-07 10:46:38 -04002019 // Non-power of 2 ES2 check
Geoff Langc0b9ef42014-07-02 10:02:37 -04002020 if (!context->getExtensions().textureNPOT && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
Jamie Madillc1f8b162013-10-07 10:46:38 -04002021 {
2022 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2023 return gl::error(GL_INVALID_OPERATION);
2024 }
2025
2026 // Cube completeness check
2027 if (target == GL_TEXTURE_CUBE_MAP)
2028 {
2029 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2030 if (!textureCube->isCubeComplete())
2031 {
2032 return gl::error(GL_INVALID_OPERATION);
2033 }
2034 }
2035
Geoff Langae4852a2013-06-05 15:00:34 -04002036 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002037 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002038 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002039 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002040 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002041 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002042 }
2043}
2044
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002045void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2046{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002047 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002048
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002049 ANGLE_TRY
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002050 {
2051 if (n < 0)
2052 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002053 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002054 }
2055
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002056 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002057
2058 if (context)
2059 {
2060 for (int i = 0; i < n; i++)
2061 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002062 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002063 }
2064 }
2065 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002066 ANGLE_CATCH_ALL
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002067 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002068 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002069 }
2070}
2071
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002072void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2073{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002074 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002075
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002076 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002077 {
2078 if (n < 0)
2079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002080 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002081 }
2082
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002083 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002084
2085 if (context)
2086 {
2087 for (int i = 0; i < n; i++)
2088 {
2089 framebuffers[i] = context->createFramebuffer();
2090 }
2091 }
2092 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002093 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002095 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002096 }
2097}
2098
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002099void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2100{
2101 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2102
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002103 ANGLE_TRY
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002104 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002105 gl::Context *context = gl::getNonLostContext();
2106
2107 if (context)
2108 {
Geoff Lang37dde692014-01-31 16:34:54 -05002109 if (n < 0)
2110 {
2111 return gl::error(GL_INVALID_VALUE);
2112 }
2113
2114 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002115 {
2116 ids[i] = context->createQuery();
2117 }
2118 }
2119 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002120 ANGLE_CATCH_ALL
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002122 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002123 }
2124}
2125
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002126void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2127{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002128 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002129
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002130 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002131 {
2132 if (n < 0)
2133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002134 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002135 }
2136
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002137 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002138
2139 if (context)
2140 {
2141 for (int i = 0; i < n; i++)
2142 {
2143 renderbuffers[i] = context->createRenderbuffer();
2144 }
2145 }
2146 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002147 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002149 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002150 }
2151}
2152
2153void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2154{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002155 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002156
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002157 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002158 {
2159 if (n < 0)
2160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002161 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002162 }
2163
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002164 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002165
2166 if (context)
2167 {
2168 for (int i = 0; i < n; i++)
2169 {
2170 textures[i] = context->createTexture();
2171 }
2172 }
2173 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002174 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002176 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002177 }
2178}
2179
daniel@transgaming.com85423182010-04-22 13:35:27 +00002180void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002181{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002182 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002183 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002184 program, index, bufsize, length, size, type, name);
2185
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002186 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002187 {
2188 if (bufsize < 0)
2189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002190 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002191 }
2192
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002193 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002194
2195 if (context)
2196 {
2197 gl::Program *programObject = context->getProgram(program);
2198
2199 if (!programObject)
2200 {
2201 if (context->getShader(program))
2202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002203 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002204 }
2205 else
2206 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002207 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002208 }
2209 }
2210
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002211 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002213 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002214 }
2215
2216 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2217 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002218 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002219 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002221 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002222 }
2223}
2224
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002225void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002226{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002227 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002228 "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 +00002229 program, index, bufsize, length, size, type, name);
2230
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002231 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002232 {
2233 if (bufsize < 0)
2234 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002235 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002236 }
2237
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002238 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002239
2240 if (context)
2241 {
2242 gl::Program *programObject = context->getProgram(program);
2243
2244 if (!programObject)
2245 {
2246 if (context->getShader(program))
2247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002248 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002249 }
2250 else
2251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002252 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002253 }
2254 }
2255
2256 if (index >= (GLuint)programObject->getActiveUniformCount())
2257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002258 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002259 }
2260
2261 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2262 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002263 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002264 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002266 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002267 }
2268}
2269
2270void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2271{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002272 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 +00002273 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002275 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002276 {
2277 if (maxcount < 0)
2278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002279 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002280 }
2281
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002282 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002283
2284 if (context)
2285 {
2286 gl::Program *programObject = context->getProgram(program);
2287
2288 if (!programObject)
2289 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002290 if (context->getShader(program))
2291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002292 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002293 }
2294 else
2295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002296 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002297 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002298 }
2299
2300 return programObject->getAttachedShaders(maxcount, count, shaders);
2301 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002302 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002303 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002305 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002306 }
2307}
2308
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002309int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002310{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002311 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002312
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002313 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002314 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002315 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002316
2317 if (context)
2318 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002319
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002320 gl::Program *programObject = context->getProgram(program);
2321
2322 if (!programObject)
2323 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002324 if (context->getShader(program))
2325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002326 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002327 }
2328 else
2329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002330 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002331 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002332 }
2333
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002334 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002335 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002337 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002338 }
2339
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002340 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002341 }
2342 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002343 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002345 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002346 }
2347
2348 return -1;
2349}
2350
2351void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2352{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002353 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002354
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002355 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002356 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002357 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002358
2359 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002360 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002361 GLenum nativeType;
2362 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002363 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2364 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002365 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002366 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002367
2368 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002369 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002370 context->getBooleanv(pname, params);
2371 }
Jamie Madill55856b12014-01-02 13:59:50 -05002372 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002373 {
Jamie Madill55856b12014-01-02 13:59:50 -05002374 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002375 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002376 }
2377 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002378 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002380 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002381 }
2382}
2383
2384void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2385{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002386 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 +00002387
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002388 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002389 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002390 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002391
2392 if (context)
2393 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002394 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002395 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002396 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002397 }
2398
Jamie Madill70656a62014-03-05 15:01:26 -05002399 if (!gl::ValidBufferParameter(context, pname))
2400 {
2401 return gl::error(GL_INVALID_ENUM);
2402 }
2403
Shannon Woods53a94a82014-06-24 15:20:36 -04002404 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill8c96d582014-03-05 15:01:23 -05002405
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002406 if (!buffer)
2407 {
2408 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002409 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002410 }
2411
2412 switch (pname)
2413 {
2414 case GL_BUFFER_USAGE:
Brandon Jonesd38f9262014-06-18 16:26:45 -07002415 *params = static_cast<GLint>(buffer->getUsage());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002416 break;
2417 case GL_BUFFER_SIZE:
Brandon Jonesd38f9262014-06-18 16:26:45 -07002418 *params = gl::clampCast<GLint>(buffer->getSize());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002419 break;
Jamie Madill70656a62014-03-05 15:01:26 -05002420 case GL_BUFFER_ACCESS_FLAGS:
Brandon Jonesd38f9262014-06-18 16:26:45 -07002421 *params = buffer->getAccessFlags();
Jamie Madill70656a62014-03-05 15:01:26 -05002422 break;
2423 case GL_BUFFER_MAPPED:
Brandon Jonesd38f9262014-06-18 16:26:45 -07002424 *params = static_cast<GLint>(buffer->isMapped());
Jamie Madill70656a62014-03-05 15:01:26 -05002425 break;
2426 case GL_BUFFER_MAP_OFFSET:
Brandon Jonesd38f9262014-06-18 16:26:45 -07002427 *params = gl::clampCast<GLint>(buffer->getMapOffset());
Jamie Madill70656a62014-03-05 15:01:26 -05002428 break;
2429 case GL_BUFFER_MAP_LENGTH:
Brandon Jonesd38f9262014-06-18 16:26:45 -07002430 *params = gl::clampCast<GLint>(buffer->getMapLength());
Jamie Madill70656a62014-03-05 15:01:26 -05002431 break;
2432 default: UNREACHABLE(); break;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002433 }
2434 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002435 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002436 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002438 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002439 }
2440}
2441
2442GLenum __stdcall glGetError(void)
2443{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002444 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002445
2446 gl::Context *context = gl::getContext();
2447
2448 if (context)
2449 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002450 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002451 }
2452
2453 return GL_NO_ERROR;
2454}
2455
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002456void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002458 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002459
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002460 ANGLE_TRY
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002461 {
2462
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002463 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002464
2465 if (context)
2466 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002467 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002468
2469 if (fenceObject == NULL)
2470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002471 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002472 }
2473
Jamie Madillfb9a7402013-07-26 11:55:01 -04002474 if (fenceObject->isFence() != GL_TRUE)
2475 {
2476 return gl::error(GL_INVALID_OPERATION);
2477 }
2478
2479 switch (pname)
2480 {
2481 case GL_FENCE_STATUS_NV:
2482 case GL_FENCE_CONDITION_NV:
2483 break;
2484
2485 default: return gl::error(GL_INVALID_ENUM);
2486 }
2487
2488 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002489 }
2490 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002491 ANGLE_CATCH_ALL
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002493 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002494 }
2495}
2496
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002497void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2498{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002499 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002500
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002501 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002502 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002503 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002504
2505 if (context)
2506 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002507 GLenum nativeType;
2508 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002509 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2510 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002511 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002512 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002513
2514 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002515 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002516 context->getFloatv(pname, params);
2517 }
Jamie Madill55856b12014-01-02 13:59:50 -05002518 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002519 {
Jamie Madill55856b12014-01-02 13:59:50 -05002520 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002521 }
2522 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002523 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002524 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002526 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002527 }
2528}
2529
2530void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002532 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 +00002533 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002534
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002535 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002537 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002538
2539 if (context)
2540 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002541 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002543 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002544 }
2545
Jamie Madill1e3fa742014-06-16 10:34:00 -04002546 int clientVersion = context->getClientVersion();
2547
Geoff Lang646559f2013-08-15 11:08:15 -04002548 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002549 {
Geoff Lang646559f2013-08-15 11:08:15 -04002550 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2551 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2552 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2553 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2554 break;
Geoff Lang05b05022014-06-11 15:31:45 -04002555 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
Geoff Langc0b9ef42014-07-02 10:02:37 -04002556 if (clientVersion < 3 && !context->getExtensions().sRGB)
Geoff Lang05b05022014-06-11 15:31:45 -04002557 {
2558 return gl::error(GL_INVALID_ENUM);
2559 }
2560 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002561 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2562 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2563 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2564 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2565 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2566 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2567 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
Geoff Lang646559f2013-08-15 11:08:15 -04002568 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
Geoff Lang05b05022014-06-11 15:31:45 -04002569 if (clientVersion < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002570 {
Geoff Lang05b05022014-06-11 15:31:45 -04002571 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002572 }
Geoff Lang05b05022014-06-11 15:31:45 -04002573 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002574 default:
2575 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002576 }
Geoff Lang646559f2013-08-15 11:08:15 -04002577
2578 // Determine if the attachment is a valid enum
2579 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002580 {
Geoff Lang646559f2013-08-15 11:08:15 -04002581 case GL_BACK:
2582 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002583 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002584 case GL_STENCIL:
2585 case GL_DEPTH_STENCIL_ATTACHMENT:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002586 if (clientVersion < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002587 {
Geoff Lang646559f2013-08-15 11:08:15 -04002588 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002589 }
Geoff Lang646559f2013-08-15 11:08:15 -04002590 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002591
Geoff Lang646559f2013-08-15 11:08:15 -04002592 case GL_DEPTH_ATTACHMENT:
2593 case GL_STENCIL_ATTACHMENT:
2594 break;
2595
2596 default:
2597 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
Geoff Langaae65a42014-05-26 12:43:44 -04002598 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getCaps().maxColorAttachments)
Geoff Lang646559f2013-08-15 11:08:15 -04002599 {
2600 return gl::error(GL_INVALID_ENUM);
2601 }
2602 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002603 }
2604
Shannon Woods53a94a82014-06-24 15:20:36 -04002605 GLuint framebufferHandle = context->getState().getTargetFramebuffer(target)->id();
Geoff Lang646559f2013-08-15 11:08:15 -04002606 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2607
Jamie Madill3c7fa222014-06-05 13:08:51 -04002608 if (framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002609 {
Jamie Madill1e3fa742014-06-16 10:34:00 -04002610 if (clientVersion < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002611 {
Geoff Lang646559f2013-08-15 11:08:15 -04002612 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002613 }
2614
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002615 switch (attachment)
2616 {
Geoff Lang646559f2013-08-15 11:08:15 -04002617 case GL_BACK:
Geoff Lang646559f2013-08-15 11:08:15 -04002618 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002619 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002620 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002621 default:
2622 return gl::error(GL_INVALID_OPERATION);
2623 }
2624 }
2625 else
2626 {
2627 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2628 {
Jamie Madille92a3542014-07-03 10:38:58 -04002629 // Valid attachment query
Geoff Lang646559f2013-08-15 11:08:15 -04002630 }
2631 else
2632 {
2633 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002634 {
Geoff Lang646559f2013-08-15 11:08:15 -04002635 case GL_DEPTH_ATTACHMENT:
Geoff Lang646559f2013-08-15 11:08:15 -04002636 case GL_STENCIL_ATTACHMENT:
Geoff Lang646559f2013-08-15 11:08:15 -04002637 break;
2638 case GL_DEPTH_STENCIL_ATTACHMENT:
Jamie Madille92a3542014-07-03 10:38:58 -04002639 if (framebuffer->hasValidDepthStencil())
Geoff Lang646559f2013-08-15 11:08:15 -04002640 {
2641 return gl::error(GL_INVALID_OPERATION);
2642 }
Geoff Lang646559f2013-08-15 11:08:15 -04002643 break;
2644 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002645 return gl::error(GL_INVALID_OPERATION);
2646 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002647 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002648 }
2649
Jamie Madille92a3542014-07-03 10:38:58 -04002650 GLenum attachmentType = GL_NONE;
2651 GLuint attachmentHandle = 0;
2652 GLuint attachmentLevel = 0;
2653 GLuint attachmentLayer = 0;
2654
2655 const gl::FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
2656
2657 if (attachmentObject)
2658 {
2659 attachmentType = attachmentObject->type();
2660 attachmentHandle = attachmentObject->id();
2661 attachmentLevel = attachmentObject->mipLevel();
2662 attachmentLayer = attachmentObject->layer();
2663 }
2664
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002665 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002666 if (framebufferHandle == 0)
2667 {
2668 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2669 }
2670 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002671 {
2672 attachmentObjectType = attachmentType;
2673 }
Jamie Madillbb94f342014-06-23 15:23:02 -04002674 else if (gl::ValidTexture2DDestinationTarget(context, attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002675 {
2676 attachmentObjectType = GL_TEXTURE;
2677 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002678 else
2679 {
2680 UNREACHABLE();
2681 return;
2682 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002683
Geoff Lang646559f2013-08-15 11:08:15 -04002684 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002685 {
Geoff Lang646559f2013-08-15 11:08:15 -04002686 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2687 // is NONE, then querying any other pname will generate INVALID_ENUM.
2688
2689 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2690 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2691 // INVALID_OPERATION for all other pnames
2692
2693 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002694 {
Geoff Lang646559f2013-08-15 11:08:15 -04002695 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2696 *params = attachmentObjectType;
2697 break;
2698
2699 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002700 if (clientVersion < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002701 {
Geoff Lang646559f2013-08-15 11:08:15 -04002702 return gl::error(GL_INVALID_ENUM);
2703 }
2704 *params = 0;
2705 break;
2706
2707 default:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002708 if (clientVersion < 3)
Geoff Lang646559f2013-08-15 11:08:15 -04002709 {
2710 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002711 }
2712 else
2713 {
Geoff Lang646559f2013-08-15 11:08:15 -04002714 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002715 }
2716 }
Geoff Lang646559f2013-08-15 11:08:15 -04002717 }
2718 else
2719 {
2720 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2721 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002722 ASSERT(attachmentObject != NULL);
Geoff Lang646559f2013-08-15 11:08:15 -04002723
2724 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002725 {
Geoff Lang646559f2013-08-15 11:08:15 -04002726 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2727 *params = attachmentObjectType;
2728 break;
2729
2730 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2731 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2732 {
2733 return gl::error(GL_INVALID_ENUM);
2734 }
2735 *params = attachmentHandle;
2736 break;
2737
2738 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2739 if (attachmentObjectType != GL_TEXTURE)
2740 {
2741 return gl::error(GL_INVALID_ENUM);
2742 }
2743 *params = attachmentLevel;
2744 break;
2745
2746 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2747 if (attachmentObjectType != GL_TEXTURE)
2748 {
2749 return gl::error(GL_INVALID_ENUM);
2750 }
2751 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2752 break;
2753
2754 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
Geoff Lange4a492b2014-06-19 14:14:41 -04002755 *params = attachmentObject->getRedSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002756 break;
2757
2758 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
Geoff Lange4a492b2014-06-19 14:14:41 -04002759 *params = attachmentObject->getGreenSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002760 break;
2761
2762 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
Geoff Lange4a492b2014-06-19 14:14:41 -04002763 *params = attachmentObject->getBlueSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002764 break;
2765
2766 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
Geoff Lange4a492b2014-06-19 14:14:41 -04002767 *params = attachmentObject->getAlphaSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002768 break;
2769
2770 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
Geoff Lange4a492b2014-06-19 14:14:41 -04002771 *params = attachmentObject->getDepthSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002772 break;
2773
2774 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
Geoff Lange4a492b2014-06-19 14:14:41 -04002775 *params = attachmentObject->getStencilSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002776 break;
2777
2778 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2779 if (attachment == GL_DEPTH_STENCIL)
2780 {
2781 gl::error(GL_INVALID_OPERATION);
2782 }
Geoff Lange4a492b2014-06-19 14:14:41 -04002783 *params = attachmentObject->getComponentType();
Geoff Lang646559f2013-08-15 11:08:15 -04002784 break;
2785
2786 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
Geoff Lange4a492b2014-06-19 14:14:41 -04002787 *params = attachmentObject->getColorEncoding();
Geoff Lang646559f2013-08-15 11:08:15 -04002788 break;
2789
2790 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2791 if (attachmentObjectType != GL_TEXTURE)
2792 {
2793 return gl::error(GL_INVALID_ENUM);
2794 }
2795 *params = attachmentLayer;
2796 break;
2797
2798 default:
2799 UNREACHABLE();
2800 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002801 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002802 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002803 }
2804 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002805 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002807 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002808 }
2809}
2810
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002811GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2812{
2813 EVENT("()");
2814
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002815 ANGLE_TRY
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002816 {
2817 gl::Context *context = gl::getContext();
2818
2819 if (context)
2820 {
2821 return context->getResetStatus();
2822 }
2823
2824 return GL_NO_ERROR;
2825 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002826 ANGLE_CATCH_ALL
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002827 {
2828 return GL_OUT_OF_MEMORY;
2829 }
2830}
2831
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002832void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2833{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002834 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002835
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002836 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002837 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002838 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002839
2840 if (context)
2841 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002842 GLenum nativeType;
2843 unsigned int numParams = 0;
Jamie Madill79f2f452013-12-19 11:13:02 -05002844
Jamie Madill893ab082014-05-16 16:56:10 -04002845 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2846 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002847 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002848 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002849
2850 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002851 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002852 context->getIntegerv(pname, params);
2853 }
Jamie Madill55856b12014-01-02 13:59:50 -05002854 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002855 {
Jamie Madill55856b12014-01-02 13:59:50 -05002856 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002857 }
2858 }
2859 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002860 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002862 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002863 }
2864}
2865
2866void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2867{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002868 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002869
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002870 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002871 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002872 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002873
2874 if (context)
2875 {
2876 gl::Program *programObject = context->getProgram(program);
2877
2878 if (!programObject)
2879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002880 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002881 }
2882
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002883 if (context->getClientVersion() < 3)
2884 {
2885 switch (pname)
2886 {
2887 case GL_ACTIVE_UNIFORM_BLOCKS:
2888 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002889 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2890 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2891 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002892 return gl::error(GL_INVALID_ENUM);
2893 }
2894 }
2895
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002896 switch (pname)
2897 {
2898 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002899 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002900 return;
2901 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002902 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002903 return;
2904 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00002905 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002906 return;
2907 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002908 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002909 return;
2910 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002911 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002912 return;
2913 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002914 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002915 return;
2916 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002917 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002918 return;
2919 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002920 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002921 return;
2922 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002923 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002924 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00002925 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00002926 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00002927 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002928 case GL_ACTIVE_UNIFORM_BLOCKS:
2929 *params = programObject->getActiveUniformBlockCount();
2930 return;
2931 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
2932 *params = programObject->getActiveUniformBlockMaxLength();
2933 break;
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002934 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2935 *params = programObject->getTransformFeedbackBufferMode();
2936 break;
2937 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2938 *params = programObject->getTransformFeedbackVaryingCount();
2939 break;
2940 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
2941 *params = programObject->getTransformFeedbackVaryingMaxLength();
2942 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002943 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002944 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002945 }
2946 }
2947 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002948 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002950 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002951 }
2952}
2953
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002954void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002955{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002956 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 +00002957 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002958
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002959 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002960 {
2961 if (bufsize < 0)
2962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002963 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002964 }
2965
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002966 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002967
2968 if (context)
2969 {
2970 gl::Program *programObject = context->getProgram(program);
2971
2972 if (!programObject)
2973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002974 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002975 }
2976
2977 programObject->getInfoLog(bufsize, length, infolog);
2978 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002979 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002980 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002982 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002983 }
2984}
2985
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002986void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
2987{
2988 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
2989
Ehsan Akhgari10530c32014-07-02 20:37:53 -04002990 ANGLE_TRY
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002991 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002992 gl::Context *context = gl::getNonLostContext();
2993
2994 if (context)
2995 {
Geoff Lang37dde692014-01-31 16:34:54 -05002996 if (!ValidQueryType(context, target))
2997 {
2998 return gl::error(GL_INVALID_ENUM);
2999 }
3000
3001 switch (pname)
3002 {
3003 case GL_CURRENT_QUERY_EXT:
Shannon Woods53a94a82014-06-24 15:20:36 -04003004 params[0] = context->getState().getActiveQueryId(target);
Geoff Lang37dde692014-01-31 16:34:54 -05003005 break;
3006
3007 default:
3008 return gl::error(GL_INVALID_ENUM);
3009 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003010 }
3011 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003012 ANGLE_CATCH_ALL
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003014 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003015 }
3016}
3017
3018void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3019{
3020 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3021
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003022 ANGLE_TRY
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003023 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003024 gl::Context *context = gl::getNonLostContext();
3025
3026 if (context)
3027 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003028 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3029
3030 if (!queryObject)
3031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003032 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003033 }
3034
Shannon Woods53a94a82014-06-24 15:20:36 -04003035 if (context->getState().getActiveQueryId(queryObject->getType()) == id)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003037 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003038 }
3039
3040 switch(pname)
3041 {
3042 case GL_QUERY_RESULT_EXT:
3043 params[0] = queryObject->getResult();
3044 break;
3045 case GL_QUERY_RESULT_AVAILABLE_EXT:
3046 params[0] = queryObject->isResultAvailable();
3047 break;
3048 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003049 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003050 }
3051 }
3052 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003053 ANGLE_CATCH_ALL
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003055 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003056 }
3057}
3058
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003059void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3060{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003061 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 +00003062
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003063 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003064 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003065 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003066
3067 if (context)
3068 {
3069 if (target != GL_RENDERBUFFER)
3070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003071 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003072 }
3073
Shannon Woods53a94a82014-06-24 15:20:36 -04003074 if (context->getState().getRenderbufferId() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003076 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003077 }
3078
Shannon Woods53a94a82014-06-24 15:20:36 -04003079 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getState().getRenderbufferId());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003080
3081 switch (pname)
3082 {
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003083 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3084 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3085 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3086 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3087 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3088 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3089 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3090 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3091 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003092 case GL_RENDERBUFFER_SAMPLES_ANGLE:
Geoff Langc0b9ef42014-07-02 10:02:37 -04003093 if (!context->getExtensions().framebufferMultisample)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003095 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003096 }
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003097 *params = renderbuffer->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003098 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003099 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003100 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003101 }
3102 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003103 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003104 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003106 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003107 }
3108}
3109
3110void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3111{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003112 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003113
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003114 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003115 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003116 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003117
3118 if (context)
3119 {
3120 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003121
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003122 if (!shaderObject)
3123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003124 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003125 }
3126
3127 switch (pname)
3128 {
3129 case GL_SHADER_TYPE:
3130 *params = shaderObject->getType();
3131 return;
3132 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003133 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003134 return;
3135 case GL_COMPILE_STATUS:
3136 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3137 return;
3138 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003139 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003140 return;
3141 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003142 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003143 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003144 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3145 *params = shaderObject->getTranslatedSourceLength();
3146 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003147 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003148 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003149 }
3150 }
3151 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003152 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003154 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003155 }
3156}
3157
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003158void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003159{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003160 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 +00003161 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003162
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003163 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003164 {
3165 if (bufsize < 0)
3166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003167 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003168 }
3169
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003170 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003171
3172 if (context)
3173 {
3174 gl::Shader *shaderObject = context->getShader(shader);
3175
3176 if (!shaderObject)
3177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003178 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003179 }
3180
3181 shaderObject->getInfoLog(bufsize, length, infolog);
3182 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003183 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003184 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003186 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003187 }
3188}
3189
3190void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3191{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003192 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 +00003193 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003194
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003195 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003196 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003197 switch (shadertype)
3198 {
3199 case GL_VERTEX_SHADER:
3200 case GL_FRAGMENT_SHADER:
3201 break;
3202 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003203 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003204 }
3205
3206 switch (precisiontype)
3207 {
3208 case GL_LOW_FLOAT:
3209 case GL_MEDIUM_FLOAT:
3210 case GL_HIGH_FLOAT:
3211 // Assume IEEE 754 precision
3212 range[0] = 127;
3213 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003214 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003215 break;
3216 case GL_LOW_INT:
3217 case GL_MEDIUM_INT:
3218 case GL_HIGH_INT:
3219 // Some (most) hardware only supports single-precision floating-point numbers,
3220 // which can accurately represent integers up to +/-16777216
3221 range[0] = 24;
3222 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003223 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003224 break;
3225 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003226 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003227 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003228 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003229 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003231 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003232 }
3233}
3234
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003235void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003236{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003237 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 +00003238 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003239
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003240 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003241 {
3242 if (bufsize < 0)
3243 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003244 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003245 }
3246
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003247 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003248
3249 if (context)
3250 {
3251 gl::Shader *shaderObject = context->getShader(shader);
3252
3253 if (!shaderObject)
3254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003255 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003256 }
3257
3258 shaderObject->getSource(bufsize, length, source);
3259 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003260 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003261 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003263 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003264 }
3265}
3266
zmo@google.coma574f782011-10-03 21:45:23 +00003267void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3268{
3269 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3270 shader, bufsize, length, source);
3271
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003272 ANGLE_TRY
zmo@google.coma574f782011-10-03 21:45:23 +00003273 {
3274 if (bufsize < 0)
3275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003276 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003277 }
3278
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003279 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003280
3281 if (context)
3282 {
3283 gl::Shader *shaderObject = context->getShader(shader);
3284
3285 if (!shaderObject)
3286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003287 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003288 }
3289
3290 shaderObject->getTranslatedSource(bufsize, length, source);
3291 }
3292 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003293 ANGLE_CATCH_ALL
zmo@google.coma574f782011-10-03 21:45:23 +00003294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003295 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003296 }
3297}
3298
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003299const GLubyte* __stdcall glGetString(GLenum name)
3300{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003301 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003302
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003303 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003304 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003305 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003306
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003307 switch (name)
3308 {
3309 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003310 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003311 case GL_RENDERER:
Geoff Langc0b9ef42014-07-02 10:02:37 -04003312 return (GLubyte*)((context != NULL) ? context->getRendererString().c_str() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003313 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003314 if (context->getClientVersion() == 2)
3315 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003316 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003317 }
3318 else
3319 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003320 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003321 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003322 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003323 if (context->getClientVersion() == 2)
3324 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003325 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003326 }
3327 else
3328 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003329 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003330 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003331 case GL_EXTENSIONS:
Geoff Langc0b9ef42014-07-02 10:02:37 -04003332 return (GLubyte*)((context != NULL) ? context->getExtensionString().c_str() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003333 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003334 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003335 }
3336 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003337 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003339 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003340 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003341}
3342
3343void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3344{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003345 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 +00003346
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003347 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003348 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003349 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003350
3351 if (context)
3352 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003353 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003354
Jamie Madillfb8a8302013-07-03 14:24:12 -04003355 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003357 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003358 }
3359
3360 switch (pname)
3361 {
3362 case GL_TEXTURE_MAG_FILTER:
Brandon Jonesa328d562014-07-01 13:52:40 -07003363 *params = (GLfloat)texture->getSamplerState().magFilter;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003364 break;
3365 case GL_TEXTURE_MIN_FILTER:
Brandon Jonesa328d562014-07-01 13:52:40 -07003366 *params = (GLfloat)texture->getSamplerState().minFilter;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003367 break;
3368 case GL_TEXTURE_WRAP_S:
Brandon Jonesa328d562014-07-01 13:52:40 -07003369 *params = (GLfloat)texture->getSamplerState().wrapS;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003370 break;
3371 case GL_TEXTURE_WRAP_T:
Brandon Jonesa328d562014-07-01 13:52:40 -07003372 *params = (GLfloat)texture->getSamplerState().wrapT;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003373 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003374 case GL_TEXTURE_WRAP_R:
3375 if (context->getClientVersion() < 3)
3376 {
3377 return gl::error(GL_INVALID_ENUM);
3378 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003379 *params = (GLfloat)texture->getSamplerState().wrapR;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003380 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003381 case GL_TEXTURE_IMMUTABLE_FORMAT:
3382 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003383 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3384 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003385 case GL_TEXTURE_IMMUTABLE_LEVELS:
3386 if (context->getClientVersion() < 3)
3387 {
3388 return gl::error(GL_INVALID_ENUM);
3389 }
Jamie Madill51a94372013-10-24 17:49:43 -04003390 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003391 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003392 case GL_TEXTURE_USAGE_ANGLE:
3393 *params = (GLfloat)texture->getUsage();
3394 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003395 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langc0b9ef42014-07-02 10:02:37 -04003396 if (!context->getExtensions().textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003398 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003399 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003400 *params = (GLfloat)texture->getSamplerState().maxAnisotropy;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003401 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003402 case GL_TEXTURE_SWIZZLE_R:
3403 if (context->getClientVersion() < 3)
3404 {
3405 return gl::error(GL_INVALID_ENUM);
3406 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003407 *params = (GLfloat)texture->getSamplerState().swizzleRed;
Geoff Langbc90a482013-09-17 16:51:27 -04003408 break;
3409 case GL_TEXTURE_SWIZZLE_G:
3410 if (context->getClientVersion() < 3)
3411 {
3412 return gl::error(GL_INVALID_ENUM);
3413 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003414 *params = (GLfloat)texture->getSamplerState().swizzleGreen;
Geoff Langbc90a482013-09-17 16:51:27 -04003415 break;
3416 case GL_TEXTURE_SWIZZLE_B:
3417 if (context->getClientVersion() < 3)
3418 {
3419 return gl::error(GL_INVALID_ENUM);
3420 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003421 *params = (GLfloat)texture->getSamplerState().swizzleBlue;
Geoff Langbc90a482013-09-17 16:51:27 -04003422 break;
3423 case GL_TEXTURE_SWIZZLE_A:
3424 if (context->getClientVersion() < 3)
3425 {
3426 return gl::error(GL_INVALID_ENUM);
3427 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003428 *params = (GLfloat)texture->getSamplerState().swizzleAlpha;
Geoff Langbc90a482013-09-17 16:51:27 -04003429 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003430 case GL_TEXTURE_BASE_LEVEL:
3431 if (context->getClientVersion() < 3)
3432 {
3433 return gl::error(GL_INVALID_ENUM);
3434 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003435 *params = (GLfloat)texture->getSamplerState().baseLevel;
Nicolas Capens8de68282014-04-04 11:10:27 -04003436 break;
3437 case GL_TEXTURE_MAX_LEVEL:
3438 if (context->getClientVersion() < 3)
3439 {
3440 return gl::error(GL_INVALID_ENUM);
3441 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003442 *params = (GLfloat)texture->getSamplerState().maxLevel;
Nicolas Capens8de68282014-04-04 11:10:27 -04003443 break;
3444 case GL_TEXTURE_MIN_LOD:
3445 if (context->getClientVersion() < 3)
3446 {
3447 return gl::error(GL_INVALID_ENUM);
3448 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003449 *params = texture->getSamplerState().minLod;
Nicolas Capens8de68282014-04-04 11:10:27 -04003450 break;
3451 case GL_TEXTURE_MAX_LOD:
3452 if (context->getClientVersion() < 3)
3453 {
3454 return gl::error(GL_INVALID_ENUM);
3455 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003456 *params = texture->getSamplerState().maxLod;
Nicolas Capens8de68282014-04-04 11:10:27 -04003457 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003458 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003459 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003460 }
3461 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003462 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003463 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003465 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003466 }
3467}
3468
3469void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3470{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003471 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 +00003472
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003473 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003474 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003475 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003476
3477 if (context)
3478 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003479 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003480
Jamie Madillfb8a8302013-07-03 14:24:12 -04003481 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003483 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003484 }
3485
3486 switch (pname)
3487 {
3488 case GL_TEXTURE_MAG_FILTER:
Brandon Jonesa328d562014-07-01 13:52:40 -07003489 *params = texture->getSamplerState().magFilter;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003490 break;
3491 case GL_TEXTURE_MIN_FILTER:
Brandon Jonesa328d562014-07-01 13:52:40 -07003492 *params = texture->getSamplerState().minFilter;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003493 break;
3494 case GL_TEXTURE_WRAP_S:
Brandon Jonesa328d562014-07-01 13:52:40 -07003495 *params = texture->getSamplerState().wrapS;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003496 break;
3497 case GL_TEXTURE_WRAP_T:
Brandon Jonesa328d562014-07-01 13:52:40 -07003498 *params = texture->getSamplerState().wrapT;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003499 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003500 case GL_TEXTURE_WRAP_R:
3501 if (context->getClientVersion() < 3)
3502 {
3503 return gl::error(GL_INVALID_ENUM);
3504 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003505 *params = texture->getSamplerState().wrapR;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003506 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003507 case GL_TEXTURE_IMMUTABLE_FORMAT:
3508 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003509 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3510 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003511 case GL_TEXTURE_IMMUTABLE_LEVELS:
3512 if (context->getClientVersion() < 3)
3513 {
3514 return gl::error(GL_INVALID_ENUM);
3515 }
Jamie Madill51a94372013-10-24 17:49:43 -04003516 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003517 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003518 case GL_TEXTURE_USAGE_ANGLE:
3519 *params = texture->getUsage();
3520 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003521 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langc0b9ef42014-07-02 10:02:37 -04003522 if (!context->getExtensions().textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003524 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003525 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003526 *params = (GLint)texture->getSamplerState().maxAnisotropy;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003527 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003528 case GL_TEXTURE_SWIZZLE_R:
3529 if (context->getClientVersion() < 3)
3530 {
3531 return gl::error(GL_INVALID_ENUM);
3532 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003533 *params = texture->getSamplerState().swizzleRed;
Geoff Langbc90a482013-09-17 16:51:27 -04003534 break;
3535 case GL_TEXTURE_SWIZZLE_G:
3536 if (context->getClientVersion() < 3)
3537 {
3538 return gl::error(GL_INVALID_ENUM);
3539 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003540 *params = texture->getSamplerState().swizzleGreen;
Geoff Langbc90a482013-09-17 16:51:27 -04003541 break;
3542 case GL_TEXTURE_SWIZZLE_B:
3543 if (context->getClientVersion() < 3)
3544 {
3545 return gl::error(GL_INVALID_ENUM);
3546 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003547 *params = texture->getSamplerState().swizzleBlue;
Geoff Langbc90a482013-09-17 16:51:27 -04003548 break;
3549 case GL_TEXTURE_SWIZZLE_A:
3550 if (context->getClientVersion() < 3)
3551 {
3552 return gl::error(GL_INVALID_ENUM);
3553 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003554 *params = texture->getSamplerState().swizzleAlpha;
Geoff Langbc90a482013-09-17 16:51:27 -04003555 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003556 case GL_TEXTURE_BASE_LEVEL:
3557 if (context->getClientVersion() < 3)
3558 {
3559 return gl::error(GL_INVALID_ENUM);
3560 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003561 *params = texture->getSamplerState().baseLevel;
Nicolas Capens8de68282014-04-04 11:10:27 -04003562 break;
3563 case GL_TEXTURE_MAX_LEVEL:
3564 if (context->getClientVersion() < 3)
3565 {
3566 return gl::error(GL_INVALID_ENUM);
3567 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003568 *params = texture->getSamplerState().maxLevel;
Nicolas Capens8de68282014-04-04 11:10:27 -04003569 break;
3570 case GL_TEXTURE_MIN_LOD:
3571 if (context->getClientVersion() < 3)
3572 {
3573 return gl::error(GL_INVALID_ENUM);
3574 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003575 *params = (GLint)texture->getSamplerState().minLod;
Nicolas Capens8de68282014-04-04 11:10:27 -04003576 break;
3577 case GL_TEXTURE_MAX_LOD:
3578 if (context->getClientVersion() < 3)
3579 {
3580 return gl::error(GL_INVALID_ENUM);
3581 }
Brandon Jonesa328d562014-07-01 13:52:40 -07003582 *params = (GLint)texture->getSamplerState().maxLod;
Nicolas Capens8de68282014-04-04 11:10:27 -04003583 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003584 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003585 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003586 }
3587 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003588 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003589 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003591 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003592 }
3593}
3594
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003595void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3596{
3597 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3598 program, location, bufSize, params);
3599
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003600 ANGLE_TRY
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003601 {
3602 if (bufSize < 0)
3603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003604 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003605 }
3606
3607 gl::Context *context = gl::getNonLostContext();
3608
3609 if (context)
3610 {
3611 if (program == 0)
3612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003613 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003614 }
3615
3616 gl::Program *programObject = context->getProgram(program);
3617
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003618 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003620 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003621 }
3622
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003623 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3624 if (!programBinary)
3625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003626 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003627 }
3628
3629 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003631 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003632 }
3633 }
3634 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003635 ANGLE_CATCH_ALL
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003637 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003638 }
3639}
3640
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003641void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3642{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003643 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003644
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003645 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003646 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003647 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003648
3649 if (context)
3650 {
3651 if (program == 0)
3652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003653 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003654 }
3655
3656 gl::Program *programObject = context->getProgram(program);
3657
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003658 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003660 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003661 }
3662
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003663 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3664 if (!programBinary)
3665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003666 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003667 }
3668
3669 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003671 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003672 }
3673 }
3674 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003675 ANGLE_CATCH_ALL
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003677 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003678 }
3679}
3680
3681void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3682{
3683 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3684 program, location, bufSize, params);
3685
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003686 ANGLE_TRY
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003687 {
3688 if (bufSize < 0)
3689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003690 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003691 }
3692
3693 gl::Context *context = gl::getNonLostContext();
3694
3695 if (context)
3696 {
3697 if (program == 0)
3698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003699 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003700 }
3701
3702 gl::Program *programObject = context->getProgram(program);
3703
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003704 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003706 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003707 }
3708
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003709 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3710 if (!programBinary)
3711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003712 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003713 }
3714
3715 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003717 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003718 }
3719 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003720 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003721 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003723 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003724 }
3725}
3726
3727void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3728{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003729 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003730
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003731 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003732 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003733 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003734
3735 if (context)
3736 {
3737 if (program == 0)
3738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003739 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003740 }
3741
3742 gl::Program *programObject = context->getProgram(program);
3743
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003744 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003746 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003747 }
3748
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003749 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3750 if (!programBinary)
3751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003752 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003753 }
3754
3755 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003757 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003758 }
3759 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003760 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003761 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003763 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003764 }
3765}
3766
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003767int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003768{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003769 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003770
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003771 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003772 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003773 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003774
3775 if (strstr(name, "gl_") == name)
3776 {
3777 return -1;
3778 }
3779
3780 if (context)
3781 {
3782 gl::Program *programObject = context->getProgram(program);
3783
3784 if (!programObject)
3785 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003786 if (context->getShader(program))
3787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003788 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003789 }
3790 else
3791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003792 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003793 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003794 }
3795
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003796 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003797 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003799 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003800 }
3801
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003802 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003803 }
3804 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003805 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003807 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003808 }
3809
3810 return -1;
3811}
3812
3813void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3814{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003815 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003816
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003817 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003818 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003819 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003820
daniel@transgaming.come0078962010-04-15 20:45:08 +00003821 if (context)
3822 {
3823 if (index >= gl::MAX_VERTEX_ATTRIBS)
3824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003825 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003826 }
3827
Shannon Woods53a94a82014-06-24 15:20:36 -04003828 const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003829
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003830 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003831 {
Jamie Madillaff71502013-07-02 11:57:05 -04003832 return;
3833 }
3834
3835 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3836 {
Shannon Woods53a94a82014-06-24 15:20:36 -04003837 const gl::VertexAttribCurrentValueData &currentValueData = context->getState().getVertexAttribCurrentValue(index);
Jamie Madillaff71502013-07-02 11:57:05 -04003838 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003839 {
Jamie Madillaff71502013-07-02 11:57:05 -04003840 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003841 }
Jamie Madillaff71502013-07-02 11:57:05 -04003842 }
3843 else
3844 {
Brandon Jones5bf98292014-06-06 17:19:38 -07003845 *params = gl::QuerySingleVertexAttributeParameter<GLfloat>(attribState, pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003846 }
3847 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003848 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003849 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003851 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003852 }
3853}
3854
3855void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3856{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003857 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003858
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003859 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003860 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003861 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003862
daniel@transgaming.come0078962010-04-15 20:45:08 +00003863 if (context)
3864 {
3865 if (index >= gl::MAX_VERTEX_ATTRIBS)
3866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003867 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003868 }
3869
Shannon Woods53a94a82014-06-24 15:20:36 -04003870 const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003871
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003872 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003873 {
Jamie Madillaff71502013-07-02 11:57:05 -04003874 return;
3875 }
3876
3877 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3878 {
Shannon Woods53a94a82014-06-24 15:20:36 -04003879 const gl::VertexAttribCurrentValueData &currentValueData = context->getState().getVertexAttribCurrentValue(index);
Jamie Madillaff71502013-07-02 11:57:05 -04003880 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003881 {
Jamie Madillaff71502013-07-02 11:57:05 -04003882 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003883 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003884 }
Jamie Madillaff71502013-07-02 11:57:05 -04003885 }
3886 else
3887 {
Brandon Jones5bf98292014-06-06 17:19:38 -07003888 *params = gl::QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003889 }
3890 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003891 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003892 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003894 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003895 }
3896}
3897
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003898void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003899{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003900 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003901
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003902 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003903 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003904 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003905
daniel@transgaming.come0078962010-04-15 20:45:08 +00003906 if (context)
3907 {
3908 if (index >= gl::MAX_VERTEX_ATTRIBS)
3909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003910 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003911 }
3912
3913 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3914 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003915 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003916 }
3917
Shannon Woods53a94a82014-06-24 15:20:36 -04003918 *pointer = const_cast<GLvoid*>(context->getState().getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003919 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003920 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003921 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003923 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003924 }
3925}
3926
3927void __stdcall glHint(GLenum target, GLenum mode)
3928{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003929 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003930
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003931 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003932 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003933 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003934 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003935 case GL_FASTEST:
3936 case GL_NICEST:
3937 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003938 break;
3939 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003940 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003941 }
3942
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003943 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003944 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003945 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003946 case GL_GENERATE_MIPMAP_HINT:
Shannon Woods53a94a82014-06-24 15:20:36 -04003947 if (context) context->getState().setGenerateMipmapHint(mode);
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003948 break;
3949 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Shannon Woods53a94a82014-06-24 15:20:36 -04003950 if (context) context->getState().setFragmentShaderDerivativeHint(mode);
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003951 break;
3952 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003953 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003954 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003955 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003956 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003958 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003959 }
3960}
3961
3962GLboolean __stdcall glIsBuffer(GLuint buffer)
3963{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003964 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003965
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003966 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003967 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003968 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003969
3970 if (context && buffer)
3971 {
3972 gl::Buffer *bufferObject = context->getBuffer(buffer);
3973
3974 if (bufferObject)
3975 {
3976 return GL_TRUE;
3977 }
3978 }
3979 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003980 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003982 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003983 }
3984
3985 return GL_FALSE;
3986}
3987
3988GLboolean __stdcall glIsEnabled(GLenum cap)
3989{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003990 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003991
Ehsan Akhgari10530c32014-07-02 20:37:53 -04003992 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003993 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003994 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003995
3996 if (context)
3997 {
Geoff Lang0550d032014-01-30 11:29:07 -05003998 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004000 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004001 }
Geoff Lang0550d032014-01-30 11:29:07 -05004002
Shannon Woods53a94a82014-06-24 15:20:36 -04004003 return context->getState().getEnableFeature(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004004 }
4005 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004006 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004008 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004009 }
4010
4011 return false;
4012}
4013
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004014GLboolean __stdcall glIsFenceNV(GLuint fence)
4015{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004016 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004017
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004018 ANGLE_TRY
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004019 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004020 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004021
4022 if (context)
4023 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004024 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004025
4026 if (fenceObject == NULL)
4027 {
4028 return GL_FALSE;
4029 }
4030
4031 return fenceObject->isFence();
4032 }
4033 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004034 ANGLE_CATCH_ALL
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004036 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004037 }
4038
4039 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004040}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004041
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004042GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4043{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004044 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004045
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004046 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004047 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004048 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004049
4050 if (context && framebuffer)
4051 {
4052 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4053
4054 if (framebufferObject)
4055 {
4056 return GL_TRUE;
4057 }
4058 }
4059 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004060 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004062 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004063 }
4064
4065 return GL_FALSE;
4066}
4067
4068GLboolean __stdcall glIsProgram(GLuint program)
4069{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004070 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004071
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004072 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004073 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004074 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004075
4076 if (context && program)
4077 {
4078 gl::Program *programObject = context->getProgram(program);
4079
4080 if (programObject)
4081 {
4082 return GL_TRUE;
4083 }
4084 }
4085 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004086 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004088 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004089 }
4090
4091 return GL_FALSE;
4092}
4093
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004094GLboolean __stdcall glIsQueryEXT(GLuint id)
4095{
4096 EVENT("(GLuint id = %d)", id);
4097
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004098 ANGLE_TRY
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004099 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004100 gl::Context *context = gl::getNonLostContext();
4101
4102 if (context)
4103 {
Geoff Lang37dde692014-01-31 16:34:54 -05004104 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004105 }
4106 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004107 ANGLE_CATCH_ALL
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004109 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004110 }
4111
4112 return GL_FALSE;
4113}
4114
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004115GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4116{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004117 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004118
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004119 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004120 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004121 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004122
4123 if (context && renderbuffer)
4124 {
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04004125 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004126
4127 if (renderbufferObject)
4128 {
4129 return GL_TRUE;
4130 }
4131 }
4132 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004133 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004135 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004136 }
4137
4138 return GL_FALSE;
4139}
4140
4141GLboolean __stdcall glIsShader(GLuint shader)
4142{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004143 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004144
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004145 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004146 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004147 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004148
4149 if (context && shader)
4150 {
4151 gl::Shader *shaderObject = context->getShader(shader);
4152
4153 if (shaderObject)
4154 {
4155 return GL_TRUE;
4156 }
4157 }
4158 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004159 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004161 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004162 }
4163
4164 return GL_FALSE;
4165}
4166
4167GLboolean __stdcall glIsTexture(GLuint texture)
4168{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004169 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004170
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004171 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004172 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004173 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004174
4175 if (context && texture)
4176 {
4177 gl::Texture *textureObject = context->getTexture(texture);
4178
4179 if (textureObject)
4180 {
4181 return GL_TRUE;
4182 }
4183 }
4184 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004185 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004187 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004188 }
4189
4190 return GL_FALSE;
4191}
4192
4193void __stdcall glLineWidth(GLfloat width)
4194{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004195 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004196
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004197 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004198 {
4199 if (width <= 0.0f)
4200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004201 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004202 }
4203
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004204 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004205
4206 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004207 {
Shannon Woods53a94a82014-06-24 15:20:36 -04004208 context->getState().setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004209 }
4210 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004211 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004213 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004214 }
4215}
4216
4217void __stdcall glLinkProgram(GLuint program)
4218{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004219 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004220
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004221 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004222 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004223 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004224
4225 if (context)
4226 {
4227 gl::Program *programObject = context->getProgram(program);
4228
4229 if (!programObject)
4230 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004231 if (context->getShader(program))
4232 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004233 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004234 }
4235 else
4236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004237 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004238 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004239 }
4240
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004241 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004242 }
4243 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004244 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004246 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004247 }
4248}
4249
4250void __stdcall glPixelStorei(GLenum pname, GLint param)
4251{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004252 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004253
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004254 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004255 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004256 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004257
4258 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004259 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004260 switch (pname)
4261 {
4262 case GL_UNPACK_ALIGNMENT:
4263 if (param != 1 && param != 2 && param != 4 && param != 8)
4264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004265 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004266 }
4267
Shannon Woods53a94a82014-06-24 15:20:36 -04004268 context->getState().setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004269 break;
4270
4271 case GL_PACK_ALIGNMENT:
4272 if (param != 1 && param != 2 && param != 4 && param != 8)
4273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004274 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004275 }
4276
Shannon Woods53a94a82014-06-24 15:20:36 -04004277 context->getState().setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004278 break;
4279
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004280 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Shannon Woods53a94a82014-06-24 15:20:36 -04004281 context->getState().setPackReverseRowOrder(param != 0);
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004282 break;
4283
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004284 case GL_UNPACK_IMAGE_HEIGHT:
4285 case GL_UNPACK_SKIP_IMAGES:
4286 case GL_UNPACK_ROW_LENGTH:
4287 case GL_UNPACK_SKIP_ROWS:
4288 case GL_UNPACK_SKIP_PIXELS:
4289 case GL_PACK_ROW_LENGTH:
4290 case GL_PACK_SKIP_ROWS:
4291 case GL_PACK_SKIP_PIXELS:
4292 if (context->getClientVersion() < 3)
4293 {
4294 return gl::error(GL_INVALID_ENUM);
4295 }
4296 UNIMPLEMENTED();
4297 break;
4298
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004299 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004300 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004301 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004302 }
4303 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004304 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004306 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004307 }
4308}
4309
4310void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4311{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004312 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004313
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004314 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004315 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004316 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004317
4318 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004319 {
Shannon Woods53a94a82014-06-24 15:20:36 -04004320 context->getState().setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004321 }
4322 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004323 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004325 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004326 }
4327}
4328
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004329void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4330 GLenum format, GLenum type, GLsizei bufSize,
4331 GLvoid *data)
4332{
4333 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4334 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4335 x, y, width, height, format, type, bufSize, data);
4336
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004337 ANGLE_TRY
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004338 {
4339 if (width < 0 || height < 0 || bufSize < 0)
4340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004341 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004342 }
4343
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004344 gl::Context *context = gl::getNonLostContext();
4345
4346 if (context)
4347 {
Jamie Madill26e91952014-03-05 15:01:27 -05004348 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4349 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004350 {
Jamie Madill26e91952014-03-05 15:01:27 -05004351 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004352 }
4353
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004354 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4355 }
4356 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004357 ANGLE_CATCH_ALL
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004359 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004360 }
4361}
4362
4363void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4364 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004365{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004366 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004367 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004368 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004369
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004370 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004371 {
4372 if (width < 0 || height < 0)
4373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004374 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004375 }
4376
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004377 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004378
4379 if (context)
4380 {
Jamie Madill26e91952014-03-05 15:01:27 -05004381 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4382 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004383 {
Jamie Madill26e91952014-03-05 15:01:27 -05004384 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004385 }
4386
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004387 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004388 }
4389 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004390 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004392 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004393 }
4394}
4395
4396void __stdcall glReleaseShaderCompiler(void)
4397{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004398 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004399
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004400 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004401 {
4402 gl::Shader::releaseCompiler();
4403 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004404 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004406 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004407 }
4408}
4409
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004410void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004412 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 +00004413 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004414
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004415 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004416 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004417 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004418
4419 if (context)
4420 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004421 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004422 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004423 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004424 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004425 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004426
4427 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004428 }
4429 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004430 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004432 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004433 }
4434}
4435
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004436void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4437{
4438 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4439}
4440
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004441void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4442{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004443 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004444
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004445 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004446 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004447 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004448
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004449 if (context)
4450 {
Shannon Woods53a94a82014-06-24 15:20:36 -04004451 context->getState().setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004452 }
4453 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004454 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004456 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004457 }
4458}
4459
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004460void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4461{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004462 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004463
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004464 ANGLE_TRY
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004465 {
4466 if (condition != GL_ALL_COMPLETED_NV)
4467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004468 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004469 }
4470
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004471 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004472
4473 if (context)
4474 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004475 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004476
4477 if (fenceObject == NULL)
4478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004479 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004480 }
4481
4482 fenceObject->setFence(condition);
4483 }
4484 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004485 ANGLE_CATCH_ALL
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004487 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004488 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004489}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004490
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004491void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4492{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004493 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 +00004494
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004495 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004496 {
4497 if (width < 0 || height < 0)
4498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004499 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004500 }
4501
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004502 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004503
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004504 if (context)
4505 {
Shannon Woods53a94a82014-06-24 15:20:36 -04004506 context->getState().setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004507 }
4508 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004509 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004511 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004512 }
4513}
4514
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004515void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004516{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004517 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004518 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004519 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004520
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004521 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004522 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004523 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004524 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004525 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004526 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004528 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004529 }
4530}
4531
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004532void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004533{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004534 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 +00004535 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004536
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004537 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004538 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004539 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004540 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004541 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004542 }
4543
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004544 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545
4546 if (context)
4547 {
4548 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004549
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004550 if (!shaderObject)
4551 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004552 if (context->getProgram(shader))
4553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004554 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004555 }
4556 else
4557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004559 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004560 }
4561
4562 shaderObject->setSource(count, string, length);
4563 }
4564 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004565 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004567 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004568 }
4569}
4570
4571void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4572{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004573 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004574}
4575
4576void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4577{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004578 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 +00004579
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004580 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004581 {
4582 switch (face)
4583 {
4584 case GL_FRONT:
4585 case GL_BACK:
4586 case GL_FRONT_AND_BACK:
4587 break;
4588 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004589 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004590 }
4591
4592 switch (func)
4593 {
4594 case GL_NEVER:
4595 case GL_ALWAYS:
4596 case GL_LESS:
4597 case GL_LEQUAL:
4598 case GL_EQUAL:
4599 case GL_GEQUAL:
4600 case GL_GREATER:
4601 case GL_NOTEQUAL:
4602 break;
4603 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004604 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004605 }
4606
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004607 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004608
4609 if (context)
4610 {
4611 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4612 {
Shannon Woods53a94a82014-06-24 15:20:36 -04004613 context->getState().setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004614 }
4615
4616 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4617 {
Shannon Woods53a94a82014-06-24 15:20:36 -04004618 context->getState().setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004619 }
4620 }
4621 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004622 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004623 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004624 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004625 }
4626}
4627
4628void __stdcall glStencilMask(GLuint mask)
4629{
4630 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4631}
4632
4633void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4634{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004635 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004636
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004637 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004638 {
4639 switch (face)
4640 {
4641 case GL_FRONT:
4642 case GL_BACK:
4643 case GL_FRONT_AND_BACK:
4644 break;
4645 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004646 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004647 }
4648
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004649 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004650
4651 if (context)
4652 {
4653 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4654 {
Shannon Woods53a94a82014-06-24 15:20:36 -04004655 context->getState().setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004656 }
4657
4658 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4659 {
Shannon Woods53a94a82014-06-24 15:20:36 -04004660 context->getState().setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004661 }
4662 }
4663 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004664 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004666 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004667 }
4668}
4669
4670void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4671{
4672 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4673}
4674
4675void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4676{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004677 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 +00004678 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004679
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004680 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004681 {
4682 switch (face)
4683 {
4684 case GL_FRONT:
4685 case GL_BACK:
4686 case GL_FRONT_AND_BACK:
4687 break;
4688 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004689 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004690 }
4691
4692 switch (fail)
4693 {
4694 case GL_ZERO:
4695 case GL_KEEP:
4696 case GL_REPLACE:
4697 case GL_INCR:
4698 case GL_DECR:
4699 case GL_INVERT:
4700 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004701 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004702 break;
4703 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004704 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004705 }
4706
4707 switch (zfail)
4708 {
4709 case GL_ZERO:
4710 case GL_KEEP:
4711 case GL_REPLACE:
4712 case GL_INCR:
4713 case GL_DECR:
4714 case GL_INVERT:
4715 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004716 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004717 break;
4718 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004719 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004720 }
4721
4722 switch (zpass)
4723 {
4724 case GL_ZERO:
4725 case GL_KEEP:
4726 case GL_REPLACE:
4727 case GL_INCR:
4728 case GL_DECR:
4729 case GL_INVERT:
4730 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004731 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004732 break;
4733 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004734 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004735 }
4736
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004737 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004738
4739 if (context)
4740 {
4741 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4742 {
Shannon Woods53a94a82014-06-24 15:20:36 -04004743 context->getState().setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004744 }
4745
4746 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4747 {
Shannon Woods53a94a82014-06-24 15:20:36 -04004748 context->getState().setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004749 }
4750 }
4751 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004752 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004753 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004754 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004755 }
4756}
4757
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004758GLboolean __stdcall glTestFenceNV(GLuint fence)
4759{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004760 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004761
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004762 ANGLE_TRY
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004763 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004764 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004765
4766 if (context)
4767 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004768 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004769
4770 if (fenceObject == NULL)
4771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004772 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004773 }
4774
Jamie Madillfb9a7402013-07-26 11:55:01 -04004775 if (fenceObject->isFence() != GL_TRUE)
4776 {
4777 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4778 }
4779
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004780 return fenceObject->testFence();
4781 }
4782 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004783 ANGLE_CATCH_ALL
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004785 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004786 }
4787
4788 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004789}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004790
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004791void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4792 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004793{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004794 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004795 "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 +00004796 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004797
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004798 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004799 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004800 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004801
4802 if (context)
4803 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004804 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004805 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004806 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004807 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004808 return;
4809 }
4810
4811 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004812 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004813 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004814 {
4815 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004816 }
4817
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004818 switch (target)
4819 {
4820 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004821 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004822 gl::Texture2D *texture = context->getTexture2D();
Shannon Woods53a94a82014-06-24 15:20:36 -04004823 texture->setImage(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004824 }
4825 break;
4826 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004827 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004828 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Shannon Woods53a94a82014-06-24 15:20:36 -04004829 texture->setImagePosX(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004830 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004831 break;
4832 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4833 {
4834 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Shannon Woods53a94a82014-06-24 15:20:36 -04004835 texture->setImageNegX(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004836 }
4837 break;
4838 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4839 {
4840 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Shannon Woods53a94a82014-06-24 15:20:36 -04004841 texture->setImagePosY(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004842 }
4843 break;
4844 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4845 {
4846 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Shannon Woods53a94a82014-06-24 15:20:36 -04004847 texture->setImageNegY(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004848 }
4849 break;
4850 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4851 {
4852 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Shannon Woods53a94a82014-06-24 15:20:36 -04004853 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004854 }
4855 break;
4856 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4857 {
4858 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Shannon Woods53a94a82014-06-24 15:20:36 -04004859 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getState().getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004860 }
4861 break;
4862 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004863 }
4864 }
4865 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004866 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004868 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004869 }
4870}
4871
4872void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4873{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004874 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4875
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004876 ANGLE_TRY
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004877 {
4878 gl::Context *context = gl::getNonLostContext();
4879
4880 if (context)
4881 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004882 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004883 {
4884 return;
4885 }
4886
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004887 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004888
Jamie Madillfb8a8302013-07-03 14:24:12 -04004889 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004891 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004892 }
4893
4894 switch (pname)
4895 {
Brandon Jonesa328d562014-07-01 13:52:40 -07004896 case GL_TEXTURE_WRAP_S: texture->getSamplerState().wrapS = gl::uiround<GLenum>(param); break;
4897 case GL_TEXTURE_WRAP_T: texture->getSamplerState().wrapT = gl::uiround<GLenum>(param); break;
4898 case GL_TEXTURE_WRAP_R: texture->getSamplerState().wrapR = gl::uiround<GLenum>(param); break;
4899 case GL_TEXTURE_MIN_FILTER: texture->getSamplerState().minFilter = gl::uiround<GLenum>(param); break;
4900 case GL_TEXTURE_MAG_FILTER: texture->getSamplerState().magFilter = gl::uiround<GLenum>(param); break;
4901 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
Geoff Langc0b9ef42014-07-02 10:02:37 -04004902 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->getSamplerState().maxAnisotropy = std::min(param, context->getExtensions().maxTextureAnisotropy); break;
Brandon Jonesa328d562014-07-01 13:52:40 -07004903 case GL_TEXTURE_COMPARE_MODE: texture->getSamplerState().compareMode = gl::uiround<GLenum>(param); break;
4904 case GL_TEXTURE_COMPARE_FUNC: texture->getSamplerState().compareFunc = gl::uiround<GLenum>(param); break;
4905 case GL_TEXTURE_SWIZZLE_R: texture->getSamplerState().swizzleRed = gl::uiround<GLenum>(param); break;
4906 case GL_TEXTURE_SWIZZLE_G: texture->getSamplerState().swizzleGreen = gl::uiround<GLenum>(param); break;
4907 case GL_TEXTURE_SWIZZLE_B: texture->getSamplerState().swizzleBlue = gl::uiround<GLenum>(param); break;
4908 case GL_TEXTURE_SWIZZLE_A: texture->getSamplerState().swizzleAlpha = gl::uiround<GLenum>(param); break;
4909 case GL_TEXTURE_BASE_LEVEL: texture->getSamplerState().baseLevel = gl::iround<GLint>(param); break;
4910 case GL_TEXTURE_MAX_LEVEL: texture->getSamplerState().maxLevel = gl::iround<GLint>(param); break;
4911 case GL_TEXTURE_MIN_LOD: texture->getSamplerState().minLod = param; break;
4912 case GL_TEXTURE_MAX_LOD: texture->getSamplerState().maxLod = param; break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004913 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004914 }
4915 }
4916 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004917 ANGLE_CATCH_ALL
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004919 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004920 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004921}
4922
4923void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4924{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004925 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004926}
4927
4928void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4929{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004930 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004931
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004932 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004933 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004934 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004935
4936 if (context)
4937 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004938 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04004939 {
4940 return;
4941 }
4942
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004943 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004944
Jamie Madillfb8a8302013-07-03 14:24:12 -04004945 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004947 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004948 }
4949
4950 switch (pname)
4951 {
Brandon Jonesa328d562014-07-01 13:52:40 -07004952 case GL_TEXTURE_WRAP_S: texture->getSamplerState().wrapS = (GLenum)param; break;
4953 case GL_TEXTURE_WRAP_T: texture->getSamplerState().wrapT = (GLenum)param; break;
4954 case GL_TEXTURE_WRAP_R: texture->getSamplerState().wrapR = (GLenum)param; break;
4955 case GL_TEXTURE_MIN_FILTER: texture->getSamplerState().minFilter = (GLenum)param; break;
4956 case GL_TEXTURE_MAG_FILTER: texture->getSamplerState().magFilter = (GLenum)param; break;
4957 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
Geoff Langc0b9ef42014-07-02 10:02:37 -04004958 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->getSamplerState().maxAnisotropy = std::min((float)param, context->getExtensions().maxTextureAnisotropy); break;
Brandon Jonesa328d562014-07-01 13:52:40 -07004959 case GL_TEXTURE_COMPARE_MODE: texture->getSamplerState().compareMode = (GLenum)param; break;
4960 case GL_TEXTURE_COMPARE_FUNC: texture->getSamplerState().compareFunc = (GLenum)param; break;
4961 case GL_TEXTURE_SWIZZLE_R: texture->getSamplerState().swizzleRed = (GLenum)param; break;
4962 case GL_TEXTURE_SWIZZLE_G: texture->getSamplerState().swizzleGreen = (GLenum)param; break;
4963 case GL_TEXTURE_SWIZZLE_B: texture->getSamplerState().swizzleBlue = (GLenum)param; break;
4964 case GL_TEXTURE_SWIZZLE_A: texture->getSamplerState().swizzleAlpha = (GLenum)param; break;
4965 case GL_TEXTURE_BASE_LEVEL: texture->getSamplerState().baseLevel = param; break;
4966 case GL_TEXTURE_MAX_LEVEL: texture->getSamplerState().maxLevel = param; break;
4967 case GL_TEXTURE_MIN_LOD: texture->getSamplerState().minLod = (GLfloat)param; break;
4968 case GL_TEXTURE_MAX_LOD: texture->getSamplerState().maxLod = (GLfloat)param; break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004969 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004970 }
4971 }
4972 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004973 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004975 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004976 }
4977}
4978
4979void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
4980{
4981 glTexParameteri(target, pname, *params);
4982}
4983
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00004984void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
4985{
4986 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
4987 target, levels, internalformat, width, height);
4988
Ehsan Akhgari10530c32014-07-02 20:37:53 -04004989 ANGLE_TRY
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00004990 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00004991 gl::Context *context = gl::getNonLostContext();
4992
4993 if (context)
4994 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04004995 if (!context->getExtensions().textureStorage)
Geoff Langcec35902014-04-16 10:52:36 -04004996 {
4997 return gl::error(GL_INVALID_OPERATION);
4998 }
4999
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005000 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005001 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005002 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005003 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005004 }
5005
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005006 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005007 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005008 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005009 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005010 }
5011
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005012 switch (target)
5013 {
5014 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005015 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005016 gl::Texture2D *texture2d = context->getTexture2D();
5017 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005018 }
5019 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005020
Geoff Lang01c21d22013-09-24 11:52:16 -04005021 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005022 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005023 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5024 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005025 }
5026 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005027
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005028 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005029 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005030 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005031 }
5032 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005033 ANGLE_CATCH_ALL
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005035 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005036 }
5037}
5038
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005039void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5040 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005041{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005042 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005043 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005044 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005045 target, level, xoffset, yoffset, width, height, format, type, pixels);
5046
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005047 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005048 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005049 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005050
5051 if (context)
5052 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005053 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005054 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005055 xoffset, yoffset, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005056 {
5057 return;
5058 }
5059
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005060 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005061 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005062 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005063 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005064 return;
5065 }
5066
Geoff Langc41e42d2014-04-28 10:58:16 -04005067 // Zero sized uploads are valid but no-ops
5068 if (width == 0 || height == 0)
5069 {
5070 return;
5071 }
5072
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005073 switch (target)
5074 {
5075 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005076 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005077 gl::Texture2D *texture = context->getTexture2D();
Shannon Woods53a94a82014-06-24 15:20:36 -04005078 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getState().getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005079 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005080 break;
5081
5082 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5083 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5084 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5085 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5086 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5087 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005088 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005089 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Shannon Woods53a94a82014-06-24 15:20:36 -04005090 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getState().getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005091 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005092 break;
5093
5094 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005095 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005096 }
5097 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005098 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005099 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005101 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005102 }
5103}
5104
5105void __stdcall glUniform1f(GLint location, GLfloat x)
5106{
5107 glUniform1fv(location, 1, &x);
5108}
5109
5110void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5111{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005112 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005113
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005114 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005115 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005116 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005117
5118 if (context)
5119 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005120 if (!ValidateUniform(context, GL_FLOAT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005121 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005122 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005123 }
5124
Shannon Woods53a94a82014-06-24 15:20:36 -04005125 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005126 programBinary->setUniform1fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005127 }
5128 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005129 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005132 }
5133}
5134
5135void __stdcall glUniform1i(GLint location, GLint x)
5136{
5137 glUniform1iv(location, 1, &x);
5138}
5139
5140void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5141{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005142 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005143
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005144 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005145 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005146 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005147
5148 if (context)
5149 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005150 if (!ValidateUniform(context, GL_INT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005151 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005152 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005153 }
5154
Shannon Woods53a94a82014-06-24 15:20:36 -04005155 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005156 programBinary->setUniform1iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005157 }
5158 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005159 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005161 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005162 }
5163}
5164
5165void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5166{
5167 GLfloat xy[2] = {x, y};
5168
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005169 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005170}
5171
5172void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5173{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005174 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005175
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005176 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005177 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005178 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005179
5180 if (context)
5181 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005182 if (!ValidateUniform(context, GL_FLOAT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005183 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005184 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005185 }
5186
Shannon Woods53a94a82014-06-24 15:20:36 -04005187 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005188 programBinary->setUniform2fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005189 }
5190 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005191 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005193 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005194 }
5195}
5196
5197void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5198{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005199 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005200
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005201 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005202}
5203
5204void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5205{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005206 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005207
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005208 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005209 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005210 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005211
5212 if (context)
5213 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005214 if (!ValidateUniform(context, GL_INT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005215 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005216 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005217 }
5218
Shannon Woods53a94a82014-06-24 15:20:36 -04005219 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005220 programBinary->setUniform2iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005221 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005222 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005223 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005225 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005226 }
5227}
5228
5229void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5230{
5231 GLfloat xyz[3] = {x, y, z};
5232
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005233 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005234}
5235
5236void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5237{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005238 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005239
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005240 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005241 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005242 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005243
5244 if (context)
5245 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005246 if (!ValidateUniform(context, GL_FLOAT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005247 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005248 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005249 }
5250
Shannon Woods53a94a82014-06-24 15:20:36 -04005251 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005252 programBinary->setUniform3fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253 }
5254 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005255 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005257 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005258 }
5259}
5260
5261void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5262{
5263 GLint xyz[3] = {x, y, z};
5264
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005265 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005266}
5267
5268void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5269{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005270 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005271
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005272 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005273 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005275
5276 if (context)
5277 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005278 if (!ValidateUniform(context, GL_INT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005279 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005280 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005281 }
5282
Shannon Woods53a94a82014-06-24 15:20:36 -04005283 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005284 programBinary->setUniform3iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005285 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005286 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005287 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005289 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005290 }
5291}
5292
5293void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5294{
5295 GLfloat xyzw[4] = {x, y, z, w};
5296
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005297 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005298}
5299
5300void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5301{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005302 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005303
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005304 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005305 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005306 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005307
5308 if (context)
5309 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005310 if (!ValidateUniform(context, GL_FLOAT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005311 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005312 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005313 }
5314
Shannon Woods53a94a82014-06-24 15:20:36 -04005315 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005316 programBinary->setUniform4fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005317 }
5318 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005319 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005321 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005322 }
5323}
5324
5325void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5326{
5327 GLint xyzw[4] = {x, y, z, w};
5328
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005329 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005330}
5331
5332void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5333{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005334 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005335
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005336 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005337 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005338 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005339
5340 if (context)
5341 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005342 if (!ValidateUniform(context, GL_INT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005343 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005344 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005345 }
5346
Shannon Woods53a94a82014-06-24 15:20:36 -04005347 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005348 programBinary->setUniform4iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005349 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005350 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005351 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005353 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005354 }
5355}
5356
5357void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5358{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005359 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005360 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005361
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005362 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005363 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005364 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005365
5366 if (context)
5367 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005368 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005369 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005370 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005371 }
5372
Shannon Woods53a94a82014-06-24 15:20:36 -04005373 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005374 programBinary->setUniformMatrix2fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005375 }
5376 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005377 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005379 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005380 }
5381}
5382
5383void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5384{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005385 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005386 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005387
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005388 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005389 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005390 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005391
5392 if (context)
5393 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005394 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005395 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005396 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005397 }
5398
Shannon Woods53a94a82014-06-24 15:20:36 -04005399 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005400 programBinary->setUniformMatrix3fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005401 }
5402 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005403 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005405 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005406 }
5407}
5408
5409void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5410{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005411 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005412 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005413
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005414 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005415 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005416 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005417
5418 if (context)
5419 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005420 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005421 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005422 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005423 }
5424
Shannon Woods53a94a82014-06-24 15:20:36 -04005425 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005426 programBinary->setUniformMatrix4fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005427 }
5428 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005429 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005431 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005432 }
5433}
5434
5435void __stdcall glUseProgram(GLuint program)
5436{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005437 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005438
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005439 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005440 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005441 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005442
5443 if (context)
5444 {
5445 gl::Program *programObject = context->getProgram(program);
5446
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005447 if (!programObject && program != 0)
5448 {
5449 if (context->getShader(program))
5450 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005451 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005452 }
5453 else
5454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005455 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005456 }
5457 }
5458
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005459 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005461 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005462 }
5463
5464 context->useProgram(program);
5465 }
5466 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005467 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005469 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005470 }
5471}
5472
5473void __stdcall glValidateProgram(GLuint program)
5474{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005475 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005476
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005477 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005479 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005480
5481 if (context)
5482 {
5483 gl::Program *programObject = context->getProgram(program);
5484
5485 if (!programObject)
5486 {
5487 if (context->getShader(program))
5488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005489 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005490 }
5491 else
5492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005493 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005494 }
5495 }
5496
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005497 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005498 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005499 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005500 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005502 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005503 }
5504}
5505
5506void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5507{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005508 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005509
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005510 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005511 {
5512 if (index >= gl::MAX_VERTEX_ATTRIBS)
5513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005514 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005515 }
5516
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005517 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005518
5519 if (context)
5520 {
5521 GLfloat vals[4] = { x, 0, 0, 1 };
Shannon Woods53a94a82014-06-24 15:20:36 -04005522 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005523 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005524 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005525 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005527 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005528 }
5529}
5530
5531void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5532{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005533 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005534
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005535 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005536 {
5537 if (index >= gl::MAX_VERTEX_ATTRIBS)
5538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005539 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005540 }
5541
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005542 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005543
5544 if (context)
5545 {
5546 GLfloat vals[4] = { values[0], 0, 0, 1 };
Shannon Woods53a94a82014-06-24 15:20:36 -04005547 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005548 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005549 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005550 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005552 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005553 }
5554}
5555
5556void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5557{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005558 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005559
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005560 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005561 {
5562 if (index >= gl::MAX_VERTEX_ATTRIBS)
5563 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005564 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005565 }
5566
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005567 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005568
5569 if (context)
5570 {
5571 GLfloat vals[4] = { x, y, 0, 1 };
Shannon Woods53a94a82014-06-24 15:20:36 -04005572 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005573 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005574 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005575 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005577 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005578 }
5579}
5580
5581void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5582{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005583 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005584
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005585 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005586 {
5587 if (index >= gl::MAX_VERTEX_ATTRIBS)
5588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005589 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005590 }
5591
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005592 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005593
5594 if (context)
5595 {
5596 GLfloat vals[4] = { values[0], values[1], 0, 1 };
Shannon Woods53a94a82014-06-24 15:20:36 -04005597 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005598 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005599 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005600 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005602 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005603 }
5604}
5605
5606void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5607{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005608 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 +00005609
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005610 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005611 {
5612 if (index >= gl::MAX_VERTEX_ATTRIBS)
5613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005614 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005615 }
5616
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005617 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005618
5619 if (context)
5620 {
5621 GLfloat vals[4] = { x, y, z, 1 };
Shannon Woods53a94a82014-06-24 15:20:36 -04005622 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005623 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005624 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005625 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005627 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005628 }
5629}
5630
5631void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5632{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005633 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005634
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005635 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005636 {
5637 if (index >= gl::MAX_VERTEX_ATTRIBS)
5638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005639 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005640 }
5641
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005642 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005643
5644 if (context)
5645 {
5646 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
Shannon Woods53a94a82014-06-24 15:20:36 -04005647 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005648 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005649 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005650 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005652 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005653 }
5654}
5655
5656void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5657{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005658 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 +00005659
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005660 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661 {
5662 if (index >= gl::MAX_VERTEX_ATTRIBS)
5663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005664 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005665 }
5666
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005667 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005668
5669 if (context)
5670 {
5671 GLfloat vals[4] = { x, y, z, w };
Shannon Woods53a94a82014-06-24 15:20:36 -04005672 context->getState().setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005673 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005674 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005675 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005677 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005678 }
5679}
5680
5681void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5682{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005683 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005684
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005685 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005686 {
5687 if (index >= gl::MAX_VERTEX_ATTRIBS)
5688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005689 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005690 }
5691
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005692 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005693
5694 if (context)
5695 {
Shannon Woods53a94a82014-06-24 15:20:36 -04005696 context->getState().setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005697 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005698 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005699 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005701 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005702 }
5703}
5704
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005705void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5706{
5707 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5708
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005709 ANGLE_TRY
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005710 {
5711 if (index >= gl::MAX_VERTEX_ATTRIBS)
5712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005713 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005714 }
5715
5716 gl::Context *context = gl::getNonLostContext();
5717
5718 if (context)
5719 {
5720 context->setVertexAttribDivisor(index, divisor);
5721 }
5722 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005723 ANGLE_CATCH_ALL
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005725 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005726 }
5727}
5728
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005729void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005730{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005731 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005732 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005733 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005734
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005735 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005736 {
5737 if (index >= gl::MAX_VERTEX_ATTRIBS)
5738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005739 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005740 }
5741
5742 if (size < 1 || size > 4)
5743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005744 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005745 }
5746
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005747 gl::Context *context = gl::getNonLostContext();
5748
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005749 switch (type)
5750 {
5751 case GL_BYTE:
5752 case GL_UNSIGNED_BYTE:
5753 case GL_SHORT:
5754 case GL_UNSIGNED_SHORT:
5755 case GL_FIXED:
5756 case GL_FLOAT:
5757 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005758 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005759 case GL_INT:
5760 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005761 case GL_INT_2_10_10_10_REV:
5762 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005763 if (context && context->getClientVersion() < 3)
5764 {
5765 return gl::error(GL_INVALID_ENUM);
5766 }
5767 else
5768 {
5769 break;
5770 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005771 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005772 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005773 }
5774
5775 if (stride < 0)
5776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005777 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005778 }
5779
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005780 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
5781 {
5782 return gl::error(GL_INVALID_OPERATION);
5783 }
5784
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005785 if (context)
5786 {
Jamie Madilld8db8662013-07-02 11:57:04 -04005787 // [OpenGL ES 3.0.2] Section 2.8 page 24:
5788 // An INVALID_OPERATION error is generated when a non-zero vertex array object
5789 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
5790 // and the pointer argument is not NULL.
Shannon Woods53a94a82014-06-24 15:20:36 -04005791 if (context->getState().getVertexArray()->id() != 0 && context->getState().getArrayBufferId() == 0 && ptr != NULL)
Jamie Madilld8db8662013-07-02 11:57:04 -04005792 {
5793 return gl::error(GL_INVALID_OPERATION);
5794 }
5795
Shannon Woods53a94a82014-06-24 15:20:36 -04005796 context->getState().setVertexAttribState(index, context->getState().getTargetBuffer(GL_ARRAY_BUFFER), size, type,
5797 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005798 }
5799 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005800 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005802 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005803 }
5804}
5805
5806void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
5807{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005808 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 +00005809
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005810 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005811 {
5812 if (width < 0 || height < 0)
5813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005814 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005815 }
5816
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005817 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005818
5819 if (context)
5820 {
Shannon Woods53a94a82014-06-24 15:20:36 -04005821 context->getState().setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005822 }
5823 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005824 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005826 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005827 }
5828}
5829
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005830// OpenGL ES 3.0 functions
5831
5832void __stdcall glReadBuffer(GLenum mode)
5833{
5834 EVENT("(GLenum mode = 0x%X)", mode);
5835
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005836 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005837 {
5838 gl::Context *context = gl::getNonLostContext();
5839
5840 if (context)
5841 {
5842 if (context->getClientVersion() < 3)
5843 {
5844 return gl::error(GL_INVALID_OPERATION);
5845 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005846
Jamie Madill54133512013-06-21 09:33:07 -04005847 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005848 UNIMPLEMENTED();
5849 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005850 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005851 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005852 {
5853 return gl::error(GL_OUT_OF_MEMORY);
5854 }
5855}
5856
5857void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
5858{
5859 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
5860 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
5861
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005862 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005863 {
5864 gl::Context *context = gl::getNonLostContext();
5865
5866 if (context)
5867 {
5868 if (context->getClientVersion() < 3)
5869 {
5870 return gl::error(GL_INVALID_OPERATION);
5871 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005872
Jamie Madill54133512013-06-21 09:33:07 -04005873 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005874 UNIMPLEMENTED();
5875 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005876 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005877 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005878 {
5879 return gl::error(GL_OUT_OF_MEMORY);
5880 }
5881}
5882
5883void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
5884{
5885 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
5886 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
5887 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5888 target, level, internalformat, width, height, depth, border, format, type, pixels);
5889
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005890 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005891 {
5892 gl::Context *context = gl::getNonLostContext();
5893
5894 if (context)
5895 {
5896 if (context->getClientVersion() < 3)
5897 {
5898 return gl::error(GL_INVALID_OPERATION);
5899 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005900
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005901 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005902 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005903 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005904 {
5905 return;
5906 }
5907
5908 switch(target)
5909 {
5910 case GL_TEXTURE_3D:
5911 {
5912 gl::Texture3D *texture = context->getTexture3D();
Shannon Woods53a94a82014-06-24 15:20:36 -04005913 texture->setImage(level, width, height, depth, internalformat, format, type, context->getState().getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005914 }
5915 break;
5916
5917 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005918 {
5919 gl::Texture2DArray *texture = context->getTexture2DArray();
Shannon Woods53a94a82014-06-24 15:20:36 -04005920 texture->setImage(level, width, height, depth, internalformat, format, type, context->getState().getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005921 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005922 break;
5923
5924 default:
5925 return gl::error(GL_INVALID_ENUM);
5926 }
5927 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005928 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005929 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005930 {
5931 return gl::error(GL_OUT_OF_MEMORY);
5932 }
5933}
5934
5935void __stdcall glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
5936{
5937 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
5938 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
5939 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5940 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
5941
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005942 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005943 {
5944 gl::Context *context = gl::getNonLostContext();
5945
5946 if (context)
5947 {
5948 if (context->getClientVersion() < 3)
5949 {
5950 return gl::error(GL_INVALID_OPERATION);
5951 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005952
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005953 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005954 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005955 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005956 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005957 {
5958 return;
5959 }
5960
Geoff Langc41e42d2014-04-28 10:58:16 -04005961 // Zero sized uploads are valid but no-ops
5962 if (width == 0 || height == 0 || depth == 0)
5963 {
5964 return;
5965 }
5966
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005967 switch(target)
5968 {
5969 case GL_TEXTURE_3D:
5970 {
5971 gl::Texture3D *texture = context->getTexture3D();
Shannon Woods53a94a82014-06-24 15:20:36 -04005972 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getState().getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005973 }
5974 break;
5975
5976 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005977 {
5978 gl::Texture2DArray *texture = context->getTexture2DArray();
Shannon Woods53a94a82014-06-24 15:20:36 -04005979 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getState().getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005980 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005981 break;
5982
5983 default:
5984 return gl::error(GL_INVALID_ENUM);
5985 }
5986 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005987 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04005988 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005989 {
5990 return gl::error(GL_OUT_OF_MEMORY);
5991 }
5992}
5993
5994void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
5995{
5996 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
5997 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
5998 target, level, xoffset, yoffset, zoffset, x, y, width, height);
5999
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006000 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006001 {
6002 gl::Context *context = gl::getNonLostContext();
6003
6004 if (context)
6005 {
6006 if (context->getClientVersion() < 3)
6007 {
6008 return gl::error(GL_INVALID_OPERATION);
6009 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006010
Jamie Madill6f38f822014-06-06 17:12:20 -04006011 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006012 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006013 {
6014 return;
6015 }
6016
Shannon Woods53a94a82014-06-24 15:20:36 -04006017 gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006018 gl::Texture *texture = NULL;
6019 switch (target)
6020 {
6021 case GL_TEXTURE_3D:
6022 texture = context->getTexture3D();
6023 break;
6024
6025 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006026 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006027 break;
6028
6029 default:
6030 return gl::error(GL_INVALID_ENUM);
6031 }
6032
6033 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6034 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006035 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006036 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006037 {
6038 return gl::error(GL_OUT_OF_MEMORY);
6039 }
6040}
6041
6042void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6043{
Geoff Langeef52cc2013-10-16 15:07:39 -04006044 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 +00006045 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6046 "const GLvoid* data = 0x%0.8p)",
6047 target, level, internalformat, width, height, depth, border, imageSize, data);
6048
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006049 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006050 {
6051 gl::Context *context = gl::getNonLostContext();
6052
6053 if (context)
6054 {
6055 if (context->getClientVersion() < 3)
6056 {
6057 return gl::error(GL_INVALID_OPERATION);
6058 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006059
Geoff Lange4a492b2014-06-19 14:14:41 -04006060 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, width, height))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006061 {
6062 return gl::error(GL_INVALID_VALUE);
6063 }
6064
6065 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006066 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006067 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006068 {
6069 return;
6070 }
6071
6072 switch(target)
6073 {
6074 case GL_TEXTURE_3D:
6075 {
6076 gl::Texture3D *texture = context->getTexture3D();
6077 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6078 }
6079 break;
6080
6081 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006082 {
6083 gl::Texture2DArray *texture = context->getTexture2DArray();
6084 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6085 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006086 break;
6087
6088 default:
6089 return gl::error(GL_INVALID_ENUM);
6090 }
6091 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006092 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006093 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006094 {
6095 return gl::error(GL_OUT_OF_MEMORY);
6096 }
6097}
6098
6099void __stdcall glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
6100{
6101 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6102 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6103 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6104 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6105
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006106 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006107 {
6108 gl::Context *context = gl::getNonLostContext();
6109
6110 if (context)
6111 {
6112 if (context->getClientVersion() < 3)
6113 {
6114 return gl::error(GL_INVALID_OPERATION);
6115 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006116
Geoff Lange4a492b2014-06-19 14:14:41 -04006117 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, width, height))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006118 {
6119 return gl::error(GL_INVALID_VALUE);
6120 }
6121
6122 if (!data)
6123 {
6124 return gl::error(GL_INVALID_VALUE);
6125 }
6126
6127 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006128 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006129 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006130 {
6131 return;
6132 }
6133
Geoff Langc41e42d2014-04-28 10:58:16 -04006134 // Zero sized uploads are valid but no-ops
6135 if (width == 0 || height == 0)
6136 {
6137 return;
6138 }
6139
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006140 switch(target)
6141 {
6142 case GL_TEXTURE_3D:
6143 {
6144 gl::Texture3D *texture = context->getTexture3D();
6145 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6146 format, imageSize, data);
6147 }
6148 break;
6149
6150 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006151 {
6152 gl::Texture2DArray *texture = context->getTexture2DArray();
6153 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6154 format, imageSize, data);
6155 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006156 break;
6157
6158 default:
6159 return gl::error(GL_INVALID_ENUM);
6160 }
6161 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006162 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006163 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006164 {
6165 return gl::error(GL_OUT_OF_MEMORY);
6166 }
6167}
6168
6169void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6170{
6171 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6172
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006173 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006174 {
6175 gl::Context *context = gl::getNonLostContext();
6176
6177 if (context)
6178 {
6179 if (context->getClientVersion() < 3)
6180 {
6181 return gl::error(GL_INVALID_OPERATION);
6182 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006183
Geoff Lang37dde692014-01-31 16:34:54 -05006184 if (n < 0)
6185 {
6186 return gl::error(GL_INVALID_VALUE);
6187 }
6188
6189 for (GLsizei i = 0; i < n; i++)
6190 {
6191 ids[i] = context->createQuery();
6192 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006193 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006194 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006195 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006196 {
6197 return gl::error(GL_OUT_OF_MEMORY);
6198 }
6199}
6200
6201void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6202{
6203 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6204
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006205 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006206 {
6207 gl::Context *context = gl::getNonLostContext();
6208
6209 if (context)
6210 {
6211 if (context->getClientVersion() < 3)
6212 {
6213 return gl::error(GL_INVALID_OPERATION);
6214 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006215
Geoff Lang37dde692014-01-31 16:34:54 -05006216 if (n < 0)
6217 {
6218 return gl::error(GL_INVALID_VALUE);
6219 }
6220
6221 for (GLsizei i = 0; i < n; i++)
6222 {
6223 context->deleteQuery(ids[i]);
6224 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006225 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006226 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006227 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006228 {
6229 return gl::error(GL_OUT_OF_MEMORY);
6230 }
6231}
6232
6233GLboolean __stdcall glIsQuery(GLuint id)
6234{
6235 EVENT("(GLuint id = %u)", id);
6236
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006237 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006238 {
6239 gl::Context *context = gl::getNonLostContext();
6240
6241 if (context)
6242 {
6243 if (context->getClientVersion() < 3)
6244 {
6245 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6246 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006247
Geoff Lang37dde692014-01-31 16:34:54 -05006248 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006249 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006250 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006251 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006252 {
6253 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6254 }
6255
6256 return GL_FALSE;
6257}
6258
6259void __stdcall glBeginQuery(GLenum target, GLuint id)
6260{
6261 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6262
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006263 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006264 {
6265 gl::Context *context = gl::getNonLostContext();
6266
6267 if (context)
6268 {
6269 if (context->getClientVersion() < 3)
6270 {
6271 return gl::error(GL_INVALID_OPERATION);
6272 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006273
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006274 if (!ValidateBeginQuery(context, target, id))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006275 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006276 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006277 }
Geoff Lang37dde692014-01-31 16:34:54 -05006278 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006279 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006280 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006281 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006282 {
6283 return gl::error(GL_OUT_OF_MEMORY);
6284 }
6285}
6286
6287void __stdcall glEndQuery(GLenum target)
6288{
6289 EVENT("(GLenum target = 0x%X)", target);
6290
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006291 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006292 {
6293 gl::Context *context = gl::getNonLostContext();
6294
6295 if (context)
6296 {
6297 if (context->getClientVersion() < 3)
6298 {
6299 return gl::error(GL_INVALID_OPERATION);
6300 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006301
Jamie Madill45c785d2014-05-13 14:09:34 -04006302 if (!ValidateEndQuery(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006303 {
Jamie Madill45c785d2014-05-13 14:09:34 -04006304 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006305 }
Geoff Lang37dde692014-01-31 16:34:54 -05006306
6307 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006308 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006309 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006310 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006311 {
6312 return gl::error(GL_OUT_OF_MEMORY);
6313 }
6314}
6315
6316void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6317{
6318 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6319
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006320 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006321 {
6322 gl::Context *context = gl::getNonLostContext();
6323
6324 if (context)
6325 {
6326 if (context->getClientVersion() < 3)
6327 {
6328 return gl::error(GL_INVALID_OPERATION);
6329 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006330
Geoff Lang37dde692014-01-31 16:34:54 -05006331 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006332 {
Geoff Lang37dde692014-01-31 16:34:54 -05006333 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006334 }
Geoff Lang37dde692014-01-31 16:34:54 -05006335
6336 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006337 {
Geoff Lang37dde692014-01-31 16:34:54 -05006338 case GL_CURRENT_QUERY:
Shannon Woods53a94a82014-06-24 15:20:36 -04006339 params[0] = static_cast<GLint>(context->getState().getActiveQueryId(target));
Geoff Lang37dde692014-01-31 16:34:54 -05006340 break;
6341
6342 default:
6343 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006344 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006345 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006346 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006347 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006348 {
6349 return gl::error(GL_OUT_OF_MEMORY);
6350 }
6351}
6352
6353void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6354{
6355 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6356
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006357 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006358 {
6359 gl::Context *context = gl::getNonLostContext();
6360
6361 if (context)
6362 {
6363 if (context->getClientVersion() < 3)
6364 {
6365 return gl::error(GL_INVALID_OPERATION);
6366 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006367
Geoff Lang37dde692014-01-31 16:34:54 -05006368 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6369
6370 if (!queryObject)
6371 {
6372 return gl::error(GL_INVALID_OPERATION);
6373 }
6374
Shannon Woods53a94a82014-06-24 15:20:36 -04006375 if (context->getState().getActiveQueryId(queryObject->getType()) == id)
Geoff Lang37dde692014-01-31 16:34:54 -05006376 {
6377 return gl::error(GL_INVALID_OPERATION);
6378 }
6379
6380 switch(pname)
6381 {
6382 case GL_QUERY_RESULT:
6383 params[0] = queryObject->getResult();
6384 break;
6385 case GL_QUERY_RESULT_AVAILABLE:
6386 params[0] = queryObject->isResultAvailable();
6387 break;
6388 default:
6389 return gl::error(GL_INVALID_ENUM);
6390 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006391 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006392 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006393 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006394 {
6395 return gl::error(GL_OUT_OF_MEMORY);
6396 }
6397}
6398
6399GLboolean __stdcall glUnmapBuffer(GLenum target)
6400{
6401 EVENT("(GLenum target = 0x%X)", target);
6402
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006403 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006404 {
6405 gl::Context *context = gl::getNonLostContext();
6406
6407 if (context)
6408 {
6409 if (context->getClientVersion() < 3)
6410 {
6411 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6412 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006413
Shannon Woodsb3801742014-03-27 14:59:19 -04006414 return glUnmapBufferOES(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006415 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006416 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006417 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006418 {
6419 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6420 }
6421
6422 return GL_FALSE;
6423}
6424
6425void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6426{
6427 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6428
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006429 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006430 {
6431 gl::Context *context = gl::getNonLostContext();
6432
6433 if (context)
6434 {
6435 if (context->getClientVersion() < 3)
6436 {
6437 return gl::error(GL_INVALID_OPERATION);
6438 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006439
Shannon Woodsb3801742014-03-27 14:59:19 -04006440 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006441 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006442 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006443 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006444 {
6445 return gl::error(GL_OUT_OF_MEMORY);
6446 }
6447}
6448
6449void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6450{
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006451 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006452 {
6453 gl::Context *context = gl::getNonLostContext();
6454
6455 if (context)
6456 {
6457 if (context->getClientVersion() < 3)
6458 {
6459 return gl::error(GL_INVALID_OPERATION);
6460 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006461
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006462 glDrawBuffersEXT(n, bufs);
6463 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006464 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006465 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006466 {
6467 return gl::error(GL_OUT_OF_MEMORY);
6468 }
6469}
6470
6471void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6472{
6473 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6474 location, count, transpose, value);
6475
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006476 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006477 {
6478 gl::Context *context = gl::getNonLostContext();
6479
6480 if (context)
6481 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006482 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006483 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006484 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006485 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006486
Shannon Woods53a94a82014-06-24 15:20:36 -04006487 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006488 programBinary->setUniformMatrix2x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006489 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006490 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006491 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006492 {
6493 return gl::error(GL_OUT_OF_MEMORY);
6494 }
6495}
6496
6497void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6498{
6499 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6500 location, count, transpose, value);
6501
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006502 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006503 {
6504 gl::Context *context = gl::getNonLostContext();
6505
6506 if (context)
6507 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006508 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006509 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006510 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006511 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006512
Shannon Woods53a94a82014-06-24 15:20:36 -04006513 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006514 programBinary->setUniformMatrix3x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006515 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006516 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006517 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006518 {
6519 return gl::error(GL_OUT_OF_MEMORY);
6520 }
6521}
6522
6523void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6524{
6525 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6526 location, count, transpose, value);
6527
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006528 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006529 {
6530 gl::Context *context = gl::getNonLostContext();
6531
6532 if (context)
6533 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006534 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006535 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006536 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006537 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006538
Shannon Woods53a94a82014-06-24 15:20:36 -04006539 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006540 programBinary->setUniformMatrix2x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006541 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006542 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006543 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006544 {
6545 return gl::error(GL_OUT_OF_MEMORY);
6546 }
6547}
6548
6549void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6550{
6551 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6552 location, count, transpose, value);
6553
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006554 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006555 {
6556 gl::Context *context = gl::getNonLostContext();
6557
6558 if (context)
6559 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006560 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006561 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006562 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006563 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006564
Shannon Woods53a94a82014-06-24 15:20:36 -04006565 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006566 programBinary->setUniformMatrix4x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006567 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006568 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006569 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006570 {
6571 return gl::error(GL_OUT_OF_MEMORY);
6572 }
6573}
6574
6575void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6576{
6577 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6578 location, count, transpose, value);
6579
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006580 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006581 {
6582 gl::Context *context = gl::getNonLostContext();
6583
6584 if (context)
6585 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006586 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006587 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006588 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006589 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006590
Shannon Woods53a94a82014-06-24 15:20:36 -04006591 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006592 programBinary->setUniformMatrix3x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006593 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006594 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006595 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006596 {
6597 return gl::error(GL_OUT_OF_MEMORY);
6598 }
6599}
6600
6601void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6602{
6603 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6604 location, count, transpose, value);
6605
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006606 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006607 {
6608 gl::Context *context = gl::getNonLostContext();
6609
6610 if (context)
6611 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006612 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006613 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006614 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006615 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006616
Shannon Woods53a94a82014-06-24 15:20:36 -04006617 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006618 programBinary->setUniformMatrix4x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006619 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006620 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006621 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006622 {
6623 return gl::error(GL_OUT_OF_MEMORY);
6624 }
6625}
6626
6627void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6628{
6629 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6630 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6631 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6632
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006633 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006634 {
6635 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006636 if (context)
6637 {
6638 if (context->getClientVersion() < 3)
6639 {
6640 return gl::error(GL_INVALID_OPERATION);
6641 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006642
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006643 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006644 dstX0, dstY0, dstX1, dstY1, mask, filter,
6645 false))
6646 {
6647 return;
6648 }
6649
6650 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6651 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006652 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006653 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006654 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006655 {
6656 return gl::error(GL_OUT_OF_MEMORY);
6657 }
6658}
6659
6660void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
6661{
6662 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6663 target, samples, internalformat, width, height);
6664
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006665 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006666 {
6667 gl::Context *context = gl::getNonLostContext();
6668
6669 if (context)
6670 {
6671 if (context->getClientVersion() < 3)
6672 {
6673 return gl::error(GL_INVALID_OPERATION);
6674 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006675
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006676 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04006677 width, height, false))
6678 {
6679 return;
6680 }
6681
6682 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006683 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006684 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006685 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006686 {
6687 return gl::error(GL_OUT_OF_MEMORY);
6688 }
6689}
6690
6691void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
6692{
6693 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
6694 target, attachment, texture, level, layer);
6695
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006696 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006697 {
6698 gl::Context *context = gl::getNonLostContext();
6699
6700 if (context)
6701 {
Jamie Madill570f7c82014-07-03 10:38:54 -04006702 if (!ValidateFramebufferTextureLayer(context, target, attachment, texture,
6703 level, layer))
Geoff Lang3ed0c482013-07-25 17:03:18 -04006704 {
6705 return;
6706 }
6707
Shannon Woods53a94a82014-06-24 15:20:36 -04006708 gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05006709 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04006710
6711 gl::Texture *textureObject = context->getTexture(texture);
6712 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
6713
6714 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
6715 {
6716 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
6717 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
6718 }
6719 else
6720 {
6721 switch (attachment)
6722 {
Jamie Madill570f7c82014-07-03 10:38:54 -04006723 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
6724 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
6725 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
Geoff Lang3ed0c482013-07-25 17:03:18 -04006726 }
6727 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006728 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006729 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006730 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006731 {
6732 return gl::error(GL_OUT_OF_MEMORY);
6733 }
6734}
6735
6736GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
6737{
6738 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
6739 target, offset, length, access);
6740
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006741 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006742 {
6743 gl::Context *context = gl::getNonLostContext();
6744
6745 if (context)
6746 {
6747 if (context->getClientVersion() < 3)
6748 {
6749 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
6750 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006751
Shannon Woods916e7692014-03-27 16:58:22 -04006752 return glMapBufferRangeEXT(target, offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006753 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006754 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006755 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006756 {
6757 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
6758 }
6759
6760 return NULL;
6761}
6762
6763void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
6764{
6765 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
6766
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006767 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006768 {
6769 gl::Context *context = gl::getNonLostContext();
6770
6771 if (context)
6772 {
6773 if (context->getClientVersion() < 3)
6774 {
6775 return gl::error(GL_INVALID_OPERATION);
6776 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006777
Shannon Woods916e7692014-03-27 16:58:22 -04006778 glFlushMappedBufferRangeEXT(target, offset, length);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006779 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006780 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006781 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006782 {
6783 return gl::error(GL_OUT_OF_MEMORY);
6784 }
6785}
6786
6787void __stdcall glBindVertexArray(GLuint array)
6788{
6789 EVENT("(GLuint array = %u)", array);
6790
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006791 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006792 {
6793 gl::Context *context = gl::getNonLostContext();
6794
6795 if (context)
6796 {
6797 if (context->getClientVersion() < 3)
6798 {
6799 return gl::error(GL_INVALID_OPERATION);
6800 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006801
Jamie Madilld1028542013-07-02 11:57:04 -04006802 gl::VertexArray *vao = context->getVertexArray(array);
6803
6804 if (!vao)
6805 {
6806 // The default VAO should always exist
6807 ASSERT(array != 0);
6808 return gl::error(GL_INVALID_OPERATION);
6809 }
6810
6811 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006812 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006813 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006814 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006815 {
6816 return gl::error(GL_OUT_OF_MEMORY);
6817 }
6818}
6819
6820void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
6821{
6822 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
6823
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006824 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006825 {
6826 gl::Context *context = gl::getNonLostContext();
6827
6828 if (context)
6829 {
6830 if (context->getClientVersion() < 3)
6831 {
6832 return gl::error(GL_INVALID_OPERATION);
6833 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006834
Jamie Madilld1028542013-07-02 11:57:04 -04006835 if (n < 0)
6836 {
6837 return gl::error(GL_INVALID_VALUE);
6838 }
6839
6840 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6841 {
6842 if (arrays[arrayIndex] != 0)
6843 {
6844 context->deleteVertexArray(arrays[arrayIndex]);
6845 }
6846 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006847 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006848 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006849 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006850 {
6851 return gl::error(GL_OUT_OF_MEMORY);
6852 }
6853}
6854
6855void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
6856{
6857 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
6858
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006859 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006860 {
6861 gl::Context *context = gl::getNonLostContext();
6862
6863 if (context)
6864 {
6865 if (context->getClientVersion() < 3)
6866 {
6867 return gl::error(GL_INVALID_OPERATION);
6868 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006869
Jamie Madilld1028542013-07-02 11:57:04 -04006870 if (n < 0)
6871 {
6872 return gl::error(GL_INVALID_VALUE);
6873 }
6874
6875 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6876 {
6877 arrays[arrayIndex] = context->createVertexArray();
6878 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006879 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006880 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006881 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006882 {
6883 return gl::error(GL_OUT_OF_MEMORY);
6884 }
6885}
6886
6887GLboolean __stdcall glIsVertexArray(GLuint array)
6888{
6889 EVENT("(GLuint array = %u)", array);
6890
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006891 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006892 {
6893 gl::Context *context = gl::getNonLostContext();
6894
6895 if (context)
6896 {
6897 if (context->getClientVersion() < 3)
6898 {
6899 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6900 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006901
Jamie Madilld1028542013-07-02 11:57:04 -04006902 if (array == 0)
6903 {
6904 return GL_FALSE;
6905 }
6906
6907 gl::VertexArray *vao = context->getVertexArray(array);
6908
6909 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006910 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006911 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006912 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006913 {
6914 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6915 }
6916
6917 return GL_FALSE;
6918}
6919
6920void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
6921{
6922 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
6923 target, index, data);
6924
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006925 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006926 {
6927 gl::Context *context = gl::getNonLostContext();
6928
6929 if (context)
6930 {
6931 if (context->getClientVersion() < 3)
6932 {
6933 return gl::error(GL_INVALID_OPERATION);
6934 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006935
Shannon Woods15934d52013-08-19 14:28:49 -04006936 switch (target)
6937 {
6938 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
6939 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
6940 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
6941 if (index >= context->getMaxTransformFeedbackBufferBindings())
6942 return gl::error(GL_INVALID_VALUE);
6943 break;
6944 case GL_UNIFORM_BUFFER_START:
6945 case GL_UNIFORM_BUFFER_SIZE:
6946 case GL_UNIFORM_BUFFER_BINDING:
6947 if (index >= context->getMaximumCombinedUniformBufferBindings())
6948 return gl::error(GL_INVALID_VALUE);
6949 break;
6950 default:
6951 return gl::error(GL_INVALID_ENUM);
6952 }
6953
6954 if (!(context->getIndexedIntegerv(target, index, data)))
6955 {
6956 GLenum nativeType;
6957 unsigned int numParams = 0;
6958 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
6959 return gl::error(GL_INVALID_ENUM);
6960
6961 if (numParams == 0)
6962 return; // it is known that pname is valid, but there are no parameters to return
6963
6964 if (nativeType == GL_INT_64_ANGLEX)
6965 {
6966 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
6967 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
6968 GLint64 *int64Params = new GLint64[numParams];
6969
6970 context->getIndexedInteger64v(target, index, int64Params);
6971
6972 for (unsigned int i = 0; i < numParams; ++i)
6973 {
6974 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
6975 data[i] = static_cast<GLint>(clampedValue);
6976 }
6977
6978 delete [] int64Params;
6979 }
6980 else
6981 {
6982 UNREACHABLE();
6983 }
6984 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006985 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006986 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006987 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006988 {
6989 return gl::error(GL_OUT_OF_MEMORY);
6990 }
6991}
6992
6993void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
6994{
6995 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
6996
Ehsan Akhgari10530c32014-07-02 20:37:53 -04006997 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006998 {
6999 gl::Context *context = gl::getNonLostContext();
7000
7001 if (context)
7002 {
7003 if (context->getClientVersion() < 3)
7004 {
7005 return gl::error(GL_INVALID_OPERATION);
7006 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007007
Geoff Langc8058452014-02-03 12:04:11 -05007008 switch (primitiveMode)
7009 {
7010 case GL_TRIANGLES:
7011 case GL_LINES:
7012 case GL_POINTS:
7013 break;
7014 default:
7015 return gl::error(GL_INVALID_ENUM);
7016 }
7017
Shannon Woods53a94a82014-06-24 15:20:36 -04007018 gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
Geoff Langc8058452014-02-03 12:04:11 -05007019 ASSERT(transformFeedback != NULL);
7020
7021 if (transformFeedback->isStarted())
7022 {
7023 return gl::error(GL_INVALID_OPERATION);
7024 }
7025
7026 if (transformFeedback->isPaused())
7027 {
7028 transformFeedback->resume();
7029 }
7030 else
7031 {
7032 transformFeedback->start(primitiveMode);
7033 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007034 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007035 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007036 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007037 {
7038 return gl::error(GL_OUT_OF_MEMORY);
7039 }
7040}
7041
7042void __stdcall glEndTransformFeedback(void)
7043{
7044 EVENT("(void)");
7045
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007046 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007047 {
7048 gl::Context *context = gl::getNonLostContext();
7049
7050 if (context)
7051 {
7052 if (context->getClientVersion() < 3)
7053 {
7054 return gl::error(GL_INVALID_OPERATION);
7055 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007056
Shannon Woods53a94a82014-06-24 15:20:36 -04007057 gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
Geoff Langc8058452014-02-03 12:04:11 -05007058 ASSERT(transformFeedback != NULL);
7059
7060 if (!transformFeedback->isStarted())
7061 {
7062 return gl::error(GL_INVALID_OPERATION);
7063 }
7064
7065 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007066 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007067 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007068 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007069 {
7070 return gl::error(GL_OUT_OF_MEMORY);
7071 }
7072}
7073
7074void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7075{
7076 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7077 target, index, buffer, offset, size);
7078
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007079 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007080 {
7081 gl::Context *context = gl::getNonLostContext();
7082
7083 if (context)
7084 {
7085 if (context->getClientVersion() < 3)
7086 {
7087 return gl::error(GL_INVALID_OPERATION);
7088 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007089
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007090 switch (target)
7091 {
7092 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007093 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007094 {
7095 return gl::error(GL_INVALID_VALUE);
7096 }
7097 break;
7098
7099 case GL_UNIFORM_BUFFER:
7100 if (index >= context->getMaximumCombinedUniformBufferBindings())
7101 {
7102 return gl::error(GL_INVALID_VALUE);
7103 }
7104 break;
7105
7106 default:
7107 return gl::error(GL_INVALID_ENUM);
7108 }
7109
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007110 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007111 {
7112 return gl::error(GL_INVALID_VALUE);
7113 }
7114
7115 switch (target)
7116 {
7117 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007118
7119 // size and offset must be a multiple of 4
7120 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7121 {
7122 return gl::error(GL_INVALID_VALUE);
7123 }
7124
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007125 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7126 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007127 break;
7128
7129 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007130
7131 // it is an error to bind an offset not a multiple of the alignment
7132 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7133 {
7134 return gl::error(GL_INVALID_VALUE);
7135 }
7136
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007137 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7138 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007139 break;
7140
7141 default:
7142 UNREACHABLE();
7143 }
7144 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007145 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007146 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007147 {
7148 return gl::error(GL_OUT_OF_MEMORY);
7149 }
7150}
7151
7152void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7153{
7154 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7155 target, index, buffer);
7156
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007157 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007158 {
7159 gl::Context *context = gl::getNonLostContext();
7160
7161 if (context)
7162 {
7163 if (context->getClientVersion() < 3)
7164 {
7165 return gl::error(GL_INVALID_OPERATION);
7166 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007167
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007168 switch (target)
7169 {
7170 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007171 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007172 {
7173 return gl::error(GL_INVALID_VALUE);
7174 }
7175 break;
7176
7177 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007178 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007179 {
7180 return gl::error(GL_INVALID_VALUE);
7181 }
7182 break;
7183
7184 default:
7185 return gl::error(GL_INVALID_ENUM);
7186 }
7187
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007188 switch (target)
7189 {
7190 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007191 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007192 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007193 break;
7194
7195 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007196 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007197 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007198 break;
7199
7200 default:
7201 UNREACHABLE();
7202 }
7203 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007204 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007205 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007206 {
7207 return gl::error(GL_OUT_OF_MEMORY);
7208 }
7209}
7210
7211void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7212{
7213 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7214 program, count, varyings, bufferMode);
7215
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007216 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007217 {
7218 gl::Context *context = gl::getNonLostContext();
7219
7220 if (context)
7221 {
7222 if (context->getClientVersion() < 3)
7223 {
7224 return gl::error(GL_INVALID_OPERATION);
7225 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007226
Geoff Lang48dcae72014-02-05 16:28:24 -05007227 if (count < 0)
7228 {
7229 return gl::error(GL_INVALID_VALUE);
7230 }
7231
7232 switch (bufferMode)
7233 {
7234 case GL_INTERLEAVED_ATTRIBS:
7235 break;
7236 case GL_SEPARATE_ATTRIBS:
7237 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7238 {
7239 return gl::error(GL_INVALID_VALUE);
7240 }
7241 break;
7242 default:
7243 return gl::error(GL_INVALID_ENUM);
7244 }
7245
7246 if (!gl::ValidProgram(context, program))
7247 {
7248 return;
7249 }
7250
7251 gl::Program *programObject = context->getProgram(program);
7252 ASSERT(programObject);
7253
7254 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007255 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007256 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007257 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007258 {
7259 return gl::error(GL_OUT_OF_MEMORY);
7260 }
7261}
7262
7263void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7264{
7265 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7266 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7267 program, index, bufSize, length, size, type, name);
7268
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007269 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007270 {
7271 gl::Context *context = gl::getNonLostContext();
7272
7273 if (context)
7274 {
7275 if (context->getClientVersion() < 3)
7276 {
7277 return gl::error(GL_INVALID_OPERATION);
7278 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007279
Geoff Lang48dcae72014-02-05 16:28:24 -05007280 if (bufSize < 0)
7281 {
7282 return gl::error(GL_INVALID_VALUE);
7283 }
7284
7285 if (!gl::ValidProgram(context, program))
7286 {
7287 return;
7288 }
7289
7290 gl::Program *programObject = context->getProgram(program);
7291 ASSERT(programObject);
7292
7293 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7294 {
7295 return gl::error(GL_INVALID_VALUE);
7296 }
7297
7298 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007299 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007300 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007301 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007302 {
7303 return gl::error(GL_OUT_OF_MEMORY);
7304 }
7305}
7306
7307void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7308{
7309 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7310 index, size, type, stride, pointer);
7311
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007312 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007313 {
7314 gl::Context *context = gl::getNonLostContext();
7315
7316 if (context)
7317 {
7318 if (context->getClientVersion() < 3)
7319 {
7320 return gl::error(GL_INVALID_OPERATION);
7321 }
7322 }
7323
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007324 if (index >= gl::MAX_VERTEX_ATTRIBS)
7325 {
7326 return gl::error(GL_INVALID_VALUE);
7327 }
7328
7329 if (size < 1 || size > 4)
7330 {
7331 return gl::error(GL_INVALID_VALUE);
7332 }
7333
7334 switch (type)
7335 {
7336 case GL_BYTE:
7337 case GL_UNSIGNED_BYTE:
7338 case GL_SHORT:
7339 case GL_UNSIGNED_SHORT:
7340 case GL_INT:
7341 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007342 case GL_INT_2_10_10_10_REV:
7343 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007344 break;
7345 default:
7346 return gl::error(GL_INVALID_ENUM);
7347 }
7348
7349 if (stride < 0)
7350 {
7351 return gl::error(GL_INVALID_VALUE);
7352 }
7353
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007354 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7355 {
7356 return gl::error(GL_INVALID_OPERATION);
7357 }
7358
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007359 if (context)
7360 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007361 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7362 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7363 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7364 // and the pointer argument is not NULL.
Shannon Woods53a94a82014-06-24 15:20:36 -04007365 if (context->getState().getVertexArray()->id() != 0 && context->getState().getArrayBufferId() == 0 && pointer != NULL)
Jamie Madilld8db8662013-07-02 11:57:04 -04007366 {
7367 return gl::error(GL_INVALID_OPERATION);
7368 }
7369
Shannon Woods53a94a82014-06-24 15:20:36 -04007370 context->getState().setVertexAttribState(index, context->getState().getTargetBuffer(GL_ARRAY_BUFFER), size, type, false, true,
7371 stride, pointer);
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007372 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007373 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007374 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007375 {
7376 return gl::error(GL_OUT_OF_MEMORY);
7377 }
7378}
7379
7380void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7381{
7382 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7383 index, pname, params);
7384
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007385 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007386 {
7387 gl::Context *context = gl::getNonLostContext();
7388
7389 if (context)
7390 {
7391 if (context->getClientVersion() < 3)
7392 {
7393 return gl::error(GL_INVALID_OPERATION);
7394 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007395
Jamie Madilla7d05862013-07-02 11:57:06 -04007396 if (index >= gl::MAX_VERTEX_ATTRIBS)
7397 {
7398 return gl::error(GL_INVALID_VALUE);
7399 }
7400
Shannon Woods53a94a82014-06-24 15:20:36 -04007401 const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index);
Jamie Madilla7d05862013-07-02 11:57:06 -04007402
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007403 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007404 {
7405 return;
7406 }
7407
7408 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7409 {
Shannon Woods53a94a82014-06-24 15:20:36 -04007410 const gl::VertexAttribCurrentValueData &currentValueData = context->getState().getVertexAttribCurrentValue(index);
Jamie Madilla7d05862013-07-02 11:57:06 -04007411 for (int i = 0; i < 4; ++i)
7412 {
7413 params[i] = currentValueData.IntValues[i];
7414 }
7415 }
7416 else
7417 {
Brandon Jones5bf98292014-06-06 17:19:38 -07007418 *params = gl::QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
Jamie Madilla7d05862013-07-02 11:57:06 -04007419 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007420 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007421 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007422 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007423 {
7424 return gl::error(GL_OUT_OF_MEMORY);
7425 }
7426}
7427
7428void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7429{
7430 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7431 index, pname, params);
7432
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007433 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007434 {
7435 gl::Context *context = gl::getNonLostContext();
7436
7437 if (context)
7438 {
7439 if (context->getClientVersion() < 3)
7440 {
7441 return gl::error(GL_INVALID_OPERATION);
7442 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007443
Jamie Madilla7d05862013-07-02 11:57:06 -04007444 if (index >= gl::MAX_VERTEX_ATTRIBS)
7445 {
7446 return gl::error(GL_INVALID_VALUE);
7447 }
7448
Shannon Woods53a94a82014-06-24 15:20:36 -04007449 const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index);
Jamie Madilla7d05862013-07-02 11:57:06 -04007450
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007451 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007452 {
7453 return;
7454 }
7455
7456 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7457 {
Shannon Woods53a94a82014-06-24 15:20:36 -04007458 const gl::VertexAttribCurrentValueData &currentValueData = context->getState().getVertexAttribCurrentValue(index);
Jamie Madilla7d05862013-07-02 11:57:06 -04007459 for (int i = 0; i < 4; ++i)
7460 {
7461 params[i] = currentValueData.UnsignedIntValues[i];
7462 }
7463 }
7464 else
7465 {
Brandon Jones5bf98292014-06-06 17:19:38 -07007466 *params = gl::QuerySingleVertexAttributeParameter<GLuint>(attribState, pname);
Jamie Madilla7d05862013-07-02 11:57:06 -04007467 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007468 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007469 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007470 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007471 {
7472 return gl::error(GL_OUT_OF_MEMORY);
7473 }
7474}
7475
7476void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7477{
7478 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7479 index, x, y, z, w);
7480
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007481 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007482 {
7483 gl::Context *context = gl::getNonLostContext();
7484
7485 if (context)
7486 {
7487 if (context->getClientVersion() < 3)
7488 {
7489 return gl::error(GL_INVALID_OPERATION);
7490 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007491
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007492 if (index >= gl::MAX_VERTEX_ATTRIBS)
7493 {
7494 return gl::error(GL_INVALID_VALUE);
7495 }
7496
7497 GLint vals[4] = { x, y, z, w };
Shannon Woods53a94a82014-06-24 15:20:36 -04007498 context->getState().setVertexAttribi(index, vals);
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007499 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007500 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007501 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007502 {
7503 return gl::error(GL_OUT_OF_MEMORY);
7504 }
7505}
7506
7507void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7508{
7509 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7510 index, x, y, z, w);
7511
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007512 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007513 {
7514 gl::Context *context = gl::getNonLostContext();
7515
7516 if (context)
7517 {
7518 if (context->getClientVersion() < 3)
7519 {
7520 return gl::error(GL_INVALID_OPERATION);
7521 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007522
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007523 if (index >= gl::MAX_VERTEX_ATTRIBS)
7524 {
7525 return gl::error(GL_INVALID_VALUE);
7526 }
7527
7528 GLuint vals[4] = { x, y, z, w };
Shannon Woods53a94a82014-06-24 15:20:36 -04007529 context->getState().setVertexAttribu(index, vals);
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007530 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007531 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007532 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007533 {
7534 return gl::error(GL_OUT_OF_MEMORY);
7535 }
7536}
7537
7538void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7539{
7540 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7541
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007542 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007543 {
7544 gl::Context *context = gl::getNonLostContext();
7545
7546 if (context)
7547 {
7548 if (context->getClientVersion() < 3)
7549 {
7550 return gl::error(GL_INVALID_OPERATION);
7551 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007552
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007553 if (index >= gl::MAX_VERTEX_ATTRIBS)
7554 {
7555 return gl::error(GL_INVALID_VALUE);
7556 }
7557
Shannon Woods53a94a82014-06-24 15:20:36 -04007558 context->getState().setVertexAttribi(index, v);
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007559 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007560 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007561 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007562 {
7563 return gl::error(GL_OUT_OF_MEMORY);
7564 }
7565}
7566
7567void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7568{
7569 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7570
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007571 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007572 {
7573 gl::Context *context = gl::getNonLostContext();
7574
7575 if (context)
7576 {
7577 if (context->getClientVersion() < 3)
7578 {
7579 return gl::error(GL_INVALID_OPERATION);
7580 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007581
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007582 if (index >= gl::MAX_VERTEX_ATTRIBS)
7583 {
7584 return gl::error(GL_INVALID_VALUE);
7585 }
7586
Shannon Woods53a94a82014-06-24 15:20:36 -04007587 context->getState().setVertexAttribu(index, v);
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007588 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007589 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007590 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007591 {
7592 return gl::error(GL_OUT_OF_MEMORY);
7593 }
7594}
7595
7596void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7597{
7598 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7599 program, location, params);
7600
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007601 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007602 {
7603 gl::Context *context = gl::getNonLostContext();
7604
7605 if (context)
7606 {
7607 if (context->getClientVersion() < 3)
7608 {
7609 return gl::error(GL_INVALID_OPERATION);
7610 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007611
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007612 if (program == 0)
7613 {
7614 return gl::error(GL_INVALID_VALUE);
7615 }
7616
7617 gl::Program *programObject = context->getProgram(program);
7618
7619 if (!programObject || !programObject->isLinked())
7620 {
7621 return gl::error(GL_INVALID_OPERATION);
7622 }
7623
7624 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7625 if (!programBinary)
7626 {
7627 return gl::error(GL_INVALID_OPERATION);
7628 }
7629
7630 if (!programBinary->getUniformuiv(location, NULL, params))
7631 {
7632 return gl::error(GL_INVALID_OPERATION);
7633 }
7634 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007635 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007636 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007637 {
7638 return gl::error(GL_OUT_OF_MEMORY);
7639 }
7640}
7641
7642GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7643{
7644 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7645 program, name);
7646
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007647 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007648 {
7649 gl::Context *context = gl::getNonLostContext();
7650
7651 if (context)
7652 {
7653 if (context->getClientVersion() < 3)
7654 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007655 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007657
Jamie Madilld1e78c92013-06-20 11:55:50 -04007658 if (program == 0)
7659 {
7660 return gl::error(GL_INVALID_VALUE, -1);
7661 }
7662
7663 gl::Program *programObject = context->getProgram(program);
7664
7665 if (!programObject || !programObject->isLinked())
7666 {
7667 return gl::error(GL_INVALID_OPERATION, -1);
7668 }
7669
7670 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7671 if (!programBinary)
7672 {
7673 return gl::error(GL_INVALID_OPERATION, -1);
7674 }
7675
7676 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007677 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007678 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007679 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007680 {
7681 return gl::error(GL_OUT_OF_MEMORY, 0);
7682 }
7683
7684 return 0;
7685}
7686
7687void __stdcall glUniform1ui(GLint location, GLuint v0)
7688{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007689 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007690}
7691
7692void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
7693{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007694 const GLuint xy[] = { v0, v1 };
7695 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007696}
7697
7698void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
7699{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007700 const GLuint xyz[] = { v0, v1, v2 };
7701 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007702}
7703
7704void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
7705{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007706 const GLuint xyzw[] = { v0, v1, v2, v3 };
7707 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007708}
7709
7710void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
7711{
7712 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7713 location, count, value);
7714
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007715 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007716 {
7717 gl::Context *context = gl::getNonLostContext();
7718
7719 if (context)
7720 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007721 if (!ValidateUniform(context, GL_UNSIGNED_INT, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007722 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007723 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007724 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007725
Shannon Woods53a94a82014-06-24 15:20:36 -04007726 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007727 programBinary->setUniform1uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007728 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007729 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007730 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007731 {
7732 return gl::error(GL_OUT_OF_MEMORY);
7733 }
7734}
7735
7736void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
7737{
7738 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7739 location, count, value);
7740
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007741 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007742 {
7743 gl::Context *context = gl::getNonLostContext();
7744
7745 if (context)
7746 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007747 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC2, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007748 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007749 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007750 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007751
Shannon Woods53a94a82014-06-24 15:20:36 -04007752 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007753 programBinary->setUniform2uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007754 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007755 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007756 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007757 {
7758 return gl::error(GL_OUT_OF_MEMORY);
7759 }
7760}
7761
7762void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
7763{
7764 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
7765 location, count, value);
7766
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007767 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007768 {
7769 gl::Context *context = gl::getNonLostContext();
7770
7771 if (context)
7772 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007773 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC3, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007774 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007775 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007776 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007777
Shannon Woods53a94a82014-06-24 15:20:36 -04007778 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007779 programBinary->setUniform3uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007780 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007781 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007782 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007783 {
7784 return gl::error(GL_OUT_OF_MEMORY);
7785 }
7786}
7787
7788void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
7789{
7790 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7791 location, count, value);
7792
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007793 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007794 {
7795 gl::Context *context = gl::getNonLostContext();
7796
7797 if (context)
7798 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007799 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC4, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007800 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007801 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007802 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007803
Shannon Woods53a94a82014-06-24 15:20:36 -04007804 gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007805 programBinary->setUniform4uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007806 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007807 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007808 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007809 {
7810 return gl::error(GL_OUT_OF_MEMORY);
7811 }
7812}
7813
7814void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
7815{
7816 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
7817 buffer, drawbuffer, value);
7818
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007819 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007820 {
7821 gl::Context *context = gl::getNonLostContext();
7822
7823 if (context)
7824 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007825 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007826 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007827 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007828 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007829
Geoff Lang42359ca2013-08-21 13:25:17 -04007830 switch (buffer)
7831 {
7832 case GL_COLOR:
Geoff Langaae65a42014-05-26 12:43:44 -04007833 if (drawbuffer < 0 || static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers)
Geoff Lang42359ca2013-08-21 13:25:17 -04007834 {
7835 return gl::error(GL_INVALID_VALUE);
7836 }
7837 break;
7838 case GL_STENCIL:
7839 if (drawbuffer != 0)
7840 {
7841 return gl::error(GL_INVALID_VALUE);
7842 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05007843 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04007844 default:
7845 return gl::error(GL_INVALID_ENUM);
7846 }
7847
7848 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007849 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007850 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007851 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007852 {
7853 return gl::error(GL_OUT_OF_MEMORY);
7854 }
7855}
7856
7857void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
7858{
7859 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
7860 buffer, drawbuffer, value);
7861
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007862 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007863 {
7864 gl::Context *context = gl::getNonLostContext();
7865
7866 if (context)
7867 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007868 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007869 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007870 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007871 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007872
Geoff Lang42359ca2013-08-21 13:25:17 -04007873 switch (buffer)
7874 {
7875 case GL_COLOR:
Geoff Langaae65a42014-05-26 12:43:44 -04007876 if (drawbuffer < 0 || static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers)
Geoff Lang42359ca2013-08-21 13:25:17 -04007877 {
7878 return gl::error(GL_INVALID_VALUE);
7879 }
7880 break;
7881 default:
7882 return gl::error(GL_INVALID_ENUM);
7883 }
7884
7885 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007886 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007887 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007888 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007889 {
7890 return gl::error(GL_OUT_OF_MEMORY);
7891 }
7892}
7893
7894void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
7895{
7896 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
7897 buffer, drawbuffer, value);
7898
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007899 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007900 {
7901 gl::Context *context = gl::getNonLostContext();
7902
7903 if (context)
7904 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007905 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007906 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007907 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007908 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007909
Geoff Lang42359ca2013-08-21 13:25:17 -04007910 switch (buffer)
7911 {
7912 case GL_COLOR:
Geoff Langaae65a42014-05-26 12:43:44 -04007913 if (drawbuffer < 0 || static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers)
Geoff Lang42359ca2013-08-21 13:25:17 -04007914 {
7915 return gl::error(GL_INVALID_VALUE);
7916 }
7917 break;
7918 case GL_DEPTH:
7919 if (drawbuffer != 0)
7920 {
7921 return gl::error(GL_INVALID_VALUE);
7922 }
7923 break;
7924 default:
7925 return gl::error(GL_INVALID_ENUM);
7926 }
7927
7928 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007929 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007930 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007931 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007932 {
7933 return gl::error(GL_OUT_OF_MEMORY);
7934 }
7935}
7936
7937void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
7938{
7939 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
7940 buffer, drawbuffer, depth, stencil);
7941
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007942 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007943 {
7944 gl::Context *context = gl::getNonLostContext();
7945
7946 if (context)
7947 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007948 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007949 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007950 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007951 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007952
Geoff Lang42359ca2013-08-21 13:25:17 -04007953 switch (buffer)
7954 {
7955 case GL_DEPTH_STENCIL:
7956 if (drawbuffer != 0)
7957 {
7958 return gl::error(GL_INVALID_VALUE);
7959 }
7960 break;
7961 default:
7962 return gl::error(GL_INVALID_ENUM);
7963 }
7964
7965 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007966 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007967 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007968 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007969 {
7970 return gl::error(GL_OUT_OF_MEMORY);
7971 }
7972}
7973
7974const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
7975{
7976 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
7977
Ehsan Akhgari10530c32014-07-02 20:37:53 -04007978 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007979 {
7980 gl::Context *context = gl::getNonLostContext();
7981
7982 if (context)
7983 {
7984 if (context->getClientVersion() < 3)
7985 {
7986 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
7987 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007988
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00007989 if (name != GL_EXTENSIONS)
7990 {
7991 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
7992 }
7993
Geoff Langcec35902014-04-16 10:52:36 -04007994 if (index >= context->getExtensionStringCount())
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00007995 {
7996 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
7997 }
Geoff Langcec35902014-04-16 10:52:36 -04007998
Geoff Langc0b9ef42014-07-02 10:02:37 -04007999 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index).c_str());
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008000 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008001 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008002 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008003 {
8004 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8005 }
8006
8007 return NULL;
8008}
8009
8010void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8011{
8012 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8013 readTarget, writeTarget, readOffset, writeOffset, size);
8014
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008015 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008016 {
8017 gl::Context *context = gl::getNonLostContext();
8018
8019 if (context)
8020 {
8021 if (context->getClientVersion() < 3)
8022 {
8023 return gl::error(GL_INVALID_OPERATION);
8024 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008025
Jamie Madill8c96d582014-03-05 15:01:23 -05008026 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008027 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008028 return gl::error(GL_INVALID_ENUM);
8029 }
8030
Shannon Woods53a94a82014-06-24 15:20:36 -04008031 gl::Buffer *readBuffer = context->getState().getTargetBuffer(readTarget);
8032 gl::Buffer *writeBuffer = context->getState().getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008033
8034 if (!readBuffer || !writeBuffer)
8035 {
8036 return gl::error(GL_INVALID_OPERATION);
8037 }
8038
Brandon Jonesd38f9262014-06-18 16:26:45 -07008039 if (readBuffer->isMapped() || writeBuffer->isMapped())
Jamie Madill7a5f7382014-03-05 15:01:24 -05008040 {
8041 return gl::error(GL_INVALID_OPERATION);
8042 }
8043
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008044 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
Brandon Jonesd38f9262014-06-18 16:26:45 -07008045 static_cast<unsigned int>(readOffset + size) > readBuffer->getSize() ||
8046 static_cast<unsigned int>(writeOffset + size) > writeBuffer->getSize())
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008047 {
8048 return gl::error(GL_INVALID_VALUE);
8049 }
8050
8051 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8052 {
8053 return gl::error(GL_INVALID_VALUE);
8054 }
8055
8056 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8057
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008058 // if size is zero, the copy is a successful no-op
8059 if (size > 0)
8060 {
8061 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8062 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008063 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008064 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008065 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008066 {
8067 return gl::error(GL_OUT_OF_MEMORY);
8068 }
8069}
8070
8071void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8072{
8073 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8074 program, uniformCount, uniformNames, uniformIndices);
8075
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008076 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008077 {
8078 gl::Context *context = gl::getNonLostContext();
8079
8080 if (context)
8081 {
8082 if (context->getClientVersion() < 3)
8083 {
8084 return gl::error(GL_INVALID_OPERATION);
8085 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008086
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008087 if (uniformCount < 0)
8088 {
8089 return gl::error(GL_INVALID_VALUE);
8090 }
8091
8092 gl::Program *programObject = context->getProgram(program);
8093
8094 if (!programObject)
8095 {
8096 if (context->getShader(program))
8097 {
8098 return gl::error(GL_INVALID_OPERATION);
8099 }
8100 else
8101 {
8102 return gl::error(GL_INVALID_VALUE);
8103 }
8104 }
8105
8106 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8107 if (!programObject->isLinked() || !programBinary)
8108 {
8109 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8110 {
8111 uniformIndices[uniformId] = GL_INVALID_INDEX;
8112 }
8113 }
8114 else
8115 {
8116 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8117 {
8118 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8119 }
8120 }
8121 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008122 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008123 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008124 {
8125 return gl::error(GL_OUT_OF_MEMORY);
8126 }
8127}
8128
8129void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8130{
8131 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8132 program, uniformCount, uniformIndices, pname, params);
8133
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008134 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008135 {
8136 gl::Context *context = gl::getNonLostContext();
8137
8138 if (context)
8139 {
8140 if (context->getClientVersion() < 3)
8141 {
8142 return gl::error(GL_INVALID_OPERATION);
8143 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008144
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008145 if (uniformCount < 0)
8146 {
8147 return gl::error(GL_INVALID_VALUE);
8148 }
8149
8150 gl::Program *programObject = context->getProgram(program);
8151
8152 if (!programObject)
8153 {
8154 if (context->getShader(program))
8155 {
8156 return gl::error(GL_INVALID_OPERATION);
8157 }
8158 else
8159 {
8160 return gl::error(GL_INVALID_VALUE);
8161 }
8162 }
8163
8164 switch (pname)
8165 {
8166 case GL_UNIFORM_TYPE:
8167 case GL_UNIFORM_SIZE:
8168 case GL_UNIFORM_NAME_LENGTH:
8169 case GL_UNIFORM_BLOCK_INDEX:
8170 case GL_UNIFORM_OFFSET:
8171 case GL_UNIFORM_ARRAY_STRIDE:
8172 case GL_UNIFORM_MATRIX_STRIDE:
8173 case GL_UNIFORM_IS_ROW_MAJOR:
8174 break;
8175 default:
8176 return gl::error(GL_INVALID_ENUM);
8177 }
8178
8179 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8180
8181 if (!programBinary && uniformCount > 0)
8182 {
8183 return gl::error(GL_INVALID_VALUE);
8184 }
8185
8186 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8187 {
8188 const GLuint index = uniformIndices[uniformId];
8189
8190 if (index >= (GLuint)programBinary->getActiveUniformCount())
8191 {
8192 return gl::error(GL_INVALID_VALUE);
8193 }
8194 }
8195
8196 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8197 {
8198 const GLuint index = uniformIndices[uniformId];
8199 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8200 }
8201 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008202 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008203 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008204 {
8205 return gl::error(GL_OUT_OF_MEMORY);
8206 }
8207}
8208
8209GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8210{
8211 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8212
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008213 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008214 {
8215 gl::Context *context = gl::getNonLostContext();
8216
8217 if (context)
8218 {
8219 if (context->getClientVersion() < 3)
8220 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008221 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008222 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008223
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008224 gl::Program *programObject = context->getProgram(program);
8225
8226 if (!programObject)
8227 {
8228 if (context->getShader(program))
8229 {
8230 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8231 }
8232 else
8233 {
8234 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8235 }
8236 }
8237
8238 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8239 if (!programBinary)
8240 {
8241 return GL_INVALID_INDEX;
8242 }
8243
8244 return programBinary->getUniformBlockIndex(uniformBlockName);
8245 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008246 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008247 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008248 {
8249 return gl::error(GL_OUT_OF_MEMORY, 0);
8250 }
8251
8252 return 0;
8253}
8254
8255void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8256{
8257 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8258 program, uniformBlockIndex, pname, params);
8259
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008260 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008261 {
8262 gl::Context *context = gl::getNonLostContext();
8263
8264 if (context)
8265 {
8266 if (context->getClientVersion() < 3)
8267 {
8268 return gl::error(GL_INVALID_OPERATION);
8269 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008270 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008271
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008272 if (!programObject)
8273 {
8274 if (context->getShader(program))
8275 {
8276 return gl::error(GL_INVALID_OPERATION);
8277 }
8278 else
8279 {
8280 return gl::error(GL_INVALID_VALUE);
8281 }
8282 }
8283
8284 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8285
8286 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8287 {
8288 return gl::error(GL_INVALID_VALUE);
8289 }
8290
8291 switch (pname)
8292 {
8293 case GL_UNIFORM_BLOCK_BINDING:
8294 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8295 break;
8296
8297 case GL_UNIFORM_BLOCK_DATA_SIZE:
8298 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8299 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8300 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8301 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8302 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8303 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8304 break;
8305
8306 default:
8307 return gl::error(GL_INVALID_ENUM);
8308 }
8309 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008310 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008311 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008312 {
8313 return gl::error(GL_OUT_OF_MEMORY);
8314 }
8315}
8316
8317void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8318{
8319 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8320 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8321
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008322 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008323 {
8324 gl::Context *context = gl::getNonLostContext();
8325
8326 if (context)
8327 {
8328 if (context->getClientVersion() < 3)
8329 {
8330 return gl::error(GL_INVALID_OPERATION);
8331 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008332
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008333 gl::Program *programObject = context->getProgram(program);
8334
8335 if (!programObject)
8336 {
8337 if (context->getShader(program))
8338 {
8339 return gl::error(GL_INVALID_OPERATION);
8340 }
8341 else
8342 {
8343 return gl::error(GL_INVALID_VALUE);
8344 }
8345 }
8346
8347 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8348
8349 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8350 {
8351 return gl::error(GL_INVALID_VALUE);
8352 }
8353
8354 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8355 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008356 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008357 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008358 {
8359 return gl::error(GL_OUT_OF_MEMORY);
8360 }
8361}
8362
8363void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8364{
8365 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8366 program, uniformBlockIndex, uniformBlockBinding);
8367
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008368 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008369 {
8370 gl::Context *context = gl::getNonLostContext();
8371
8372 if (context)
8373 {
8374 if (context->getClientVersion() < 3)
8375 {
8376 return gl::error(GL_INVALID_OPERATION);
8377 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008378
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008379 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8380 {
8381 return gl::error(GL_INVALID_VALUE);
8382 }
8383
8384 gl::Program *programObject = context->getProgram(program);
8385
8386 if (!programObject)
8387 {
8388 if (context->getShader(program))
8389 {
8390 return gl::error(GL_INVALID_OPERATION);
8391 }
8392 else
8393 {
8394 return gl::error(GL_INVALID_VALUE);
8395 }
8396 }
8397
8398 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8399
8400 // if never linked, there won't be any uniform blocks
8401 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8402 {
8403 return gl::error(GL_INVALID_VALUE);
8404 }
8405
8406 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8407 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008408 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008409 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008410 {
8411 return gl::error(GL_OUT_OF_MEMORY);
8412 }
8413}
8414
8415void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8416{
8417 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8418 mode, first, count, instanceCount);
8419
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008420 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008421 {
8422 gl::Context *context = gl::getNonLostContext();
8423
8424 if (context)
8425 {
8426 if (context->getClientVersion() < 3)
8427 {
8428 return gl::error(GL_INVALID_OPERATION);
8429 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008430
Jamie Madill54133512013-06-21 09:33:07 -04008431 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008432 UNIMPLEMENTED();
8433 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008434 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008435 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008436 {
8437 return gl::error(GL_OUT_OF_MEMORY);
8438 }
8439}
8440
8441void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8442{
8443 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8444 mode, count, type, indices, instanceCount);
8445
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008446 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008447 {
8448 gl::Context *context = gl::getNonLostContext();
8449
8450 if (context)
8451 {
8452 if (context->getClientVersion() < 3)
8453 {
8454 return gl::error(GL_INVALID_OPERATION);
8455 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008456
Jamie Madill54133512013-06-21 09:33:07 -04008457 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008458 UNIMPLEMENTED();
8459 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008460 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008461 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008462 {
8463 return gl::error(GL_OUT_OF_MEMORY);
8464 }
8465}
8466
8467GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8468{
8469 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8470
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008471 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008472 {
8473 gl::Context *context = gl::getNonLostContext();
8474
8475 if (context)
8476 {
8477 if (context->getClientVersion() < 3)
8478 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008479 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008480 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008481
Jamie Madill5215e1a2013-07-26 11:55:19 -04008482 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8483 {
8484 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8485 }
8486
8487 if (flags != 0)
8488 {
8489 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8490 }
8491
8492 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008493 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008494 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008495 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008496 {
8497 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8498 }
8499
8500 return NULL;
8501}
8502
8503GLboolean __stdcall glIsSync(GLsync sync)
8504{
8505 EVENT("(GLsync sync = 0x%0.8p)", sync);
8506
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008507 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008508 {
8509 gl::Context *context = gl::getNonLostContext();
8510
8511 if (context)
8512 {
8513 if (context->getClientVersion() < 3)
8514 {
8515 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8516 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008517
Jamie Madill5215e1a2013-07-26 11:55:19 -04008518 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008519 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008520 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008521 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008522 {
8523 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8524 }
8525
8526 return GL_FALSE;
8527}
8528
8529void __stdcall glDeleteSync(GLsync sync)
8530{
8531 EVENT("(GLsync sync = 0x%0.8p)", sync);
8532
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008533 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008534 {
8535 gl::Context *context = gl::getNonLostContext();
8536
8537 if (context)
8538 {
8539 if (context->getClientVersion() < 3)
8540 {
8541 return gl::error(GL_INVALID_OPERATION);
8542 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008543
Jamie Madill5215e1a2013-07-26 11:55:19 -04008544 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8545 {
8546 return gl::error(GL_INVALID_VALUE);
8547 }
8548
8549 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008550 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008551 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008552 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008553 {
8554 return gl::error(GL_OUT_OF_MEMORY);
8555 }
8556}
8557
8558GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8559{
8560 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8561 sync, flags, timeout);
8562
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008563 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008564 {
8565 gl::Context *context = gl::getNonLostContext();
8566
8567 if (context)
8568 {
8569 if (context->getClientVersion() < 3)
8570 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008571 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008572 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008573
Jamie Madill5215e1a2013-07-26 11:55:19 -04008574 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8575 {
8576 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8577 }
8578
8579 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8580
8581 if (!fenceSync)
8582 {
8583 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8584 }
8585
8586 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008587 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008588 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008589 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008590 {
8591 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8592 }
8593
8594 return GL_FALSE;
8595}
8596
8597void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8598{
8599 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8600 sync, flags, timeout);
8601
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008602 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008603 {
8604 gl::Context *context = gl::getNonLostContext();
8605
8606 if (context)
8607 {
8608 if (context->getClientVersion() < 3)
8609 {
8610 return gl::error(GL_INVALID_OPERATION);
8611 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008612
Jamie Madill5215e1a2013-07-26 11:55:19 -04008613 if (flags != 0)
8614 {
8615 return gl::error(GL_INVALID_VALUE);
8616 }
8617
8618 if (timeout != GL_TIMEOUT_IGNORED)
8619 {
8620 return gl::error(GL_INVALID_VALUE);
8621 }
8622
8623 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8624
8625 if (!fenceSync)
8626 {
8627 return gl::error(GL_INVALID_VALUE);
8628 }
8629
8630 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008631 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008632 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008633 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008634 {
8635 return gl::error(GL_OUT_OF_MEMORY);
8636 }
8637}
8638
8639void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8640{
8641 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8642 pname, params);
8643
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008644 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008645 {
8646 gl::Context *context = gl::getNonLostContext();
8647
8648 if (context)
8649 {
8650 if (context->getClientVersion() < 3)
8651 {
8652 return gl::error(GL_INVALID_OPERATION);
8653 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008654
Jamie Madill79f2f452013-12-19 11:13:02 -05008655 GLenum nativeType;
8656 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04008657 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
8658 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008659 return;
Jamie Madill893ab082014-05-16 16:56:10 -04008660 }
Jamie Madill79f2f452013-12-19 11:13:02 -05008661
8662 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04008663 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008664 context->getInteger64v(pname, params);
8665 }
Jamie Madill55856b12014-01-02 13:59:50 -05008666 else
Jamie Madill79f2f452013-12-19 11:13:02 -05008667 {
Jamie Madill55856b12014-01-02 13:59:50 -05008668 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04008669 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008670 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008671 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008672 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008673 {
8674 return gl::error(GL_OUT_OF_MEMORY);
8675 }
8676}
8677
8678void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8679{
8680 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8681 sync, pname, bufSize, length, values);
8682
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008683 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008684 {
8685 gl::Context *context = gl::getNonLostContext();
8686
8687 if (context)
8688 {
8689 if (context->getClientVersion() < 3)
8690 {
8691 return gl::error(GL_INVALID_OPERATION);
8692 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008693
Jamie Madill5215e1a2013-07-26 11:55:19 -04008694 if (bufSize < 0)
8695 {
8696 return gl::error(GL_INVALID_VALUE);
8697 }
8698
8699 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8700
8701 if (!fenceSync)
8702 {
8703 return gl::error(GL_INVALID_VALUE);
8704 }
8705
8706 switch (pname)
8707 {
8708 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
8709 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
8710 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
8711 case GL_SYNC_FLAGS: values[0] = 0; break;
8712
8713 default:
8714 return gl::error(GL_INVALID_ENUM);
8715 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008716 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008717 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008718 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008719 {
8720 return gl::error(GL_OUT_OF_MEMORY);
8721 }
8722}
8723
8724void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8725{
8726 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8727 target, index, data);
8728
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008729 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008730 {
8731 gl::Context *context = gl::getNonLostContext();
8732
8733 if (context)
8734 {
8735 if (context->getClientVersion() < 3)
8736 {
8737 return gl::error(GL_INVALID_OPERATION);
8738 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008739
Shannon Woods15934d52013-08-19 14:28:49 -04008740 switch (target)
8741 {
8742 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
8743 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
8744 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
8745 if (index >= context->getMaxTransformFeedbackBufferBindings())
8746 return gl::error(GL_INVALID_VALUE);
8747 break;
8748 case GL_UNIFORM_BUFFER_START:
8749 case GL_UNIFORM_BUFFER_SIZE:
8750 case GL_UNIFORM_BUFFER_BINDING:
8751 if (index >= context->getMaximumCombinedUniformBufferBindings())
8752 return gl::error(GL_INVALID_VALUE);
8753 break;
8754 default:
8755 return gl::error(GL_INVALID_ENUM);
8756 }
8757
8758 if (!(context->getIndexedInteger64v(target, index, data)))
8759 {
8760 GLenum nativeType;
8761 unsigned int numParams = 0;
8762 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
8763 return gl::error(GL_INVALID_ENUM);
8764
8765 if (numParams == 0)
8766 return; // it is known that pname is valid, but there are no parameters to return
8767
8768 if (nativeType == GL_INT)
8769 {
8770 GLint *intParams = new GLint[numParams];
8771
8772 context->getIndexedIntegerv(target, index, intParams);
8773
8774 for (unsigned int i = 0; i < numParams; ++i)
8775 {
8776 data[i] = static_cast<GLint64>(intParams[i]);
8777 }
8778
8779 delete [] intParams;
8780 }
8781 else
8782 {
8783 UNREACHABLE();
8784 }
8785 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008786 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008787 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008788 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008789 {
8790 return gl::error(GL_OUT_OF_MEMORY);
8791 }
8792}
8793
8794void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8795{
8796 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8797 target, pname, params);
8798
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008799 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008800 {
8801 gl::Context *context = gl::getNonLostContext();
8802
8803 if (context)
8804 {
8805 if (context->getClientVersion() < 3)
8806 {
8807 return gl::error(GL_INVALID_OPERATION);
8808 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008809
Jamie Madill70656a62014-03-05 15:01:26 -05008810 if (!gl::ValidBufferTarget(context, target))
8811 {
8812 return gl::error(GL_INVALID_ENUM);
8813 }
8814
8815 if (!gl::ValidBufferParameter(context, pname))
8816 {
8817 return gl::error(GL_INVALID_ENUM);
8818 }
8819
Shannon Woods53a94a82014-06-24 15:20:36 -04008820 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill70656a62014-03-05 15:01:26 -05008821
8822 if (!buffer)
8823 {
8824 // A null buffer means that "0" is bound to the requested buffer target
8825 return gl::error(GL_INVALID_OPERATION);
8826 }
8827
8828 switch (pname)
8829 {
8830 case GL_BUFFER_USAGE:
Brandon Jonesd38f9262014-06-18 16:26:45 -07008831 *params = static_cast<GLint64>(buffer->getUsage());
Jamie Madill70656a62014-03-05 15:01:26 -05008832 break;
8833 case GL_BUFFER_SIZE:
Brandon Jonesd38f9262014-06-18 16:26:45 -07008834 *params = buffer->getSize();
Jamie Madill70656a62014-03-05 15:01:26 -05008835 break;
8836 case GL_BUFFER_ACCESS_FLAGS:
Brandon Jonesd38f9262014-06-18 16:26:45 -07008837 *params = static_cast<GLint64>(buffer->getAccessFlags());
Jamie Madill70656a62014-03-05 15:01:26 -05008838 break;
8839 case GL_BUFFER_MAPPED:
Brandon Jonesd38f9262014-06-18 16:26:45 -07008840 *params = static_cast<GLint64>(buffer->isMapped());
Jamie Madill70656a62014-03-05 15:01:26 -05008841 break;
8842 case GL_BUFFER_MAP_OFFSET:
Brandon Jonesd38f9262014-06-18 16:26:45 -07008843 *params = buffer->getMapOffset();
Jamie Madill70656a62014-03-05 15:01:26 -05008844 break;
8845 case GL_BUFFER_MAP_LENGTH:
Brandon Jonesd38f9262014-06-18 16:26:45 -07008846 *params = buffer->getMapLength();
Jamie Madill70656a62014-03-05 15:01:26 -05008847 break;
8848 default: UNREACHABLE(); break;
8849 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008850 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008851 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008852 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008853 {
8854 return gl::error(GL_OUT_OF_MEMORY);
8855 }
8856}
8857
8858void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
8859{
8860 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
8861
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008862 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008863 {
8864 gl::Context *context = gl::getNonLostContext();
8865
8866 if (context)
8867 {
8868 if (context->getClientVersion() < 3)
8869 {
8870 return gl::error(GL_INVALID_OPERATION);
8871 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008872
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008873 if (count < 0)
8874 {
8875 return gl::error(GL_INVALID_VALUE);
8876 }
8877
8878 for (int i = 0; i < count; i++)
8879 {
8880 samplers[i] = context->createSampler();
8881 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008882 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008883 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008884 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008885 {
8886 return gl::error(GL_OUT_OF_MEMORY);
8887 }
8888}
8889
8890void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
8891{
8892 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
8893
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008894 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008895 {
8896 gl::Context *context = gl::getNonLostContext();
8897
8898 if (context)
8899 {
8900 if (context->getClientVersion() < 3)
8901 {
8902 return gl::error(GL_INVALID_OPERATION);
8903 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008904
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008905 if (count < 0)
8906 {
8907 return gl::error(GL_INVALID_VALUE);
8908 }
8909
8910 for (int i = 0; i < count; i++)
8911 {
8912 context->deleteSampler(samplers[i]);
8913 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008914 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008915 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008916 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008917 {
8918 return gl::error(GL_OUT_OF_MEMORY);
8919 }
8920}
8921
8922GLboolean __stdcall glIsSampler(GLuint sampler)
8923{
8924 EVENT("(GLuint sampler = %u)", sampler);
8925
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008926 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008927 {
8928 gl::Context *context = gl::getNonLostContext();
8929
8930 if (context)
8931 {
8932 if (context->getClientVersion() < 3)
8933 {
8934 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8935 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008936
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008937 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008938 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008939 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008940 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008941 {
8942 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8943 }
8944
8945 return GL_FALSE;
8946}
8947
8948void __stdcall glBindSampler(GLuint unit, GLuint sampler)
8949{
8950 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
8951
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008952 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008953 {
8954 gl::Context *context = gl::getNonLostContext();
8955
8956 if (context)
8957 {
8958 if (context->getClientVersion() < 3)
8959 {
8960 return gl::error(GL_INVALID_OPERATION);
8961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008962
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008963 if (sampler != 0 && !context->isSampler(sampler))
8964 {
8965 return gl::error(GL_INVALID_OPERATION);
8966 }
8967
8968 if (unit >= context->getMaximumCombinedTextureImageUnits())
8969 {
8970 return gl::error(GL_INVALID_VALUE);
8971 }
8972
8973 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008974 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008975 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008976 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008977 {
8978 return gl::error(GL_OUT_OF_MEMORY);
8979 }
8980}
8981
8982void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
8983{
8984 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
8985
Ehsan Akhgari10530c32014-07-02 20:37:53 -04008986 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008987 {
8988 gl::Context *context = gl::getNonLostContext();
8989
8990 if (context)
8991 {
8992 if (context->getClientVersion() < 3)
8993 {
8994 return gl::error(GL_INVALID_OPERATION);
8995 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008996
Geoff Lang34dbb6f2013-08-05 15:05:47 -04008997 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008998 {
8999 return;
9000 }
9001
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009002 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009003 {
9004 return;
9005 }
9006
9007 if (!context->isSampler(sampler))
9008 {
9009 return gl::error(GL_INVALID_OPERATION);
9010 }
9011
9012 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009013 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009014 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009015 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009016 {
9017 return gl::error(GL_OUT_OF_MEMORY);
9018 }
9019}
9020
9021void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9022{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009023 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009024}
9025
9026void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9027{
9028 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9029
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009030 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009031 {
9032 gl::Context *context = gl::getNonLostContext();
9033
9034 if (context)
9035 {
9036 if (context->getClientVersion() < 3)
9037 {
9038 return gl::error(GL_INVALID_OPERATION);
9039 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009040
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009041 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009042 {
9043 return;
9044 }
9045
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009046 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009047 {
9048 return;
9049 }
9050
9051 if (!context->isSampler(sampler))
9052 {
9053 return gl::error(GL_INVALID_OPERATION);
9054 }
9055
9056 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009057 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009058 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009059 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009060 {
9061 return gl::error(GL_OUT_OF_MEMORY);
9062 }
9063}
9064
9065void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9066{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009067 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009068}
9069
9070void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9071{
9072 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9073
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009074 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009075 {
9076 gl::Context *context = gl::getNonLostContext();
9077
9078 if (context)
9079 {
9080 if (context->getClientVersion() < 3)
9081 {
9082 return gl::error(GL_INVALID_OPERATION);
9083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009084
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009085 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009086 {
9087 return;
9088 }
9089
9090 if (!context->isSampler(sampler))
9091 {
9092 return gl::error(GL_INVALID_OPERATION);
9093 }
9094
9095 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009096 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009097 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009098 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009099 {
9100 return gl::error(GL_OUT_OF_MEMORY);
9101 }
9102}
9103
9104void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9105{
9106 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9107
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009108 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009109 {
9110 gl::Context *context = gl::getNonLostContext();
9111
9112 if (context)
9113 {
9114 if (context->getClientVersion() < 3)
9115 {
9116 return gl::error(GL_INVALID_OPERATION);
9117 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009118
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009119 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009120 {
9121 return;
9122 }
9123
9124 if (!context->isSampler(sampler))
9125 {
9126 return gl::error(GL_INVALID_OPERATION);
9127 }
9128
9129 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009130 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009131 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009132 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009133 {
9134 return gl::error(GL_OUT_OF_MEMORY);
9135 }
9136}
9137
9138void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9139{
9140 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9141
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009142 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009143 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009144 if (index >= gl::MAX_VERTEX_ATTRIBS)
9145 {
9146 return gl::error(GL_INVALID_VALUE);
9147 }
9148
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009149 gl::Context *context = gl::getNonLostContext();
9150
9151 if (context)
9152 {
9153 if (context->getClientVersion() < 3)
9154 {
9155 return gl::error(GL_INVALID_OPERATION);
9156 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009157
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009158 context->setVertexAttribDivisor(index, divisor);
9159 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009160 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009161 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009162 {
9163 return gl::error(GL_OUT_OF_MEMORY);
9164 }
9165}
9166
9167void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9168{
9169 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9170
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009171 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009172 {
9173 gl::Context *context = gl::getNonLostContext();
9174
9175 if (context)
9176 {
9177 if (context->getClientVersion() < 3)
9178 {
9179 return gl::error(GL_INVALID_OPERATION);
9180 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009181
Geoff Langc8058452014-02-03 12:04:11 -05009182 switch (target)
9183 {
9184 case GL_TRANSFORM_FEEDBACK:
9185 {
9186 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
Shannon Woods53a94a82014-06-24 15:20:36 -04009187 gl::TransformFeedback *curTransformFeedback = context->getState().getCurrentTransformFeedback();
Geoff Langc8058452014-02-03 12:04:11 -05009188 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9189 {
9190 return gl::error(GL_INVALID_OPERATION);
9191 }
9192
9193 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9194 if (context->getTransformFeedback(id) == NULL)
9195 {
9196 return gl::error(GL_INVALID_OPERATION);
9197 }
9198
9199 context->bindTransformFeedback(id);
9200 }
9201 break;
9202
9203 default:
9204 return gl::error(GL_INVALID_ENUM);
9205 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009206 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009207 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009208 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009209 {
9210 return gl::error(GL_OUT_OF_MEMORY);
9211 }
9212}
9213
9214void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9215{
9216 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9217
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009218 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009219 {
9220 gl::Context *context = gl::getNonLostContext();
9221
9222 if (context)
9223 {
9224 if (context->getClientVersion() < 3)
9225 {
9226 return gl::error(GL_INVALID_OPERATION);
9227 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009228
Geoff Langc8058452014-02-03 12:04:11 -05009229 for (int i = 0; i < n; i++)
9230 {
9231 context->deleteTransformFeedback(ids[i]);
9232 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009233 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009234 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009235 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009236 {
9237 return gl::error(GL_OUT_OF_MEMORY);
9238 }
9239}
9240
9241void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9242{
9243 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9244
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009245 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009246 {
9247 gl::Context *context = gl::getNonLostContext();
9248
9249 if (context)
9250 {
9251 if (context->getClientVersion() < 3)
9252 {
9253 return gl::error(GL_INVALID_OPERATION);
9254 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009255
Geoff Langc8058452014-02-03 12:04:11 -05009256 for (int i = 0; i < n; i++)
9257 {
9258 ids[i] = context->createTransformFeedback();
9259 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009260 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009261 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009262 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009263 {
9264 return gl::error(GL_OUT_OF_MEMORY);
9265 }
9266}
9267
9268GLboolean __stdcall glIsTransformFeedback(GLuint id)
9269{
9270 EVENT("(GLuint id = %u)", id);
9271
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009272 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009273 {
9274 gl::Context *context = gl::getNonLostContext();
9275
9276 if (context)
9277 {
9278 if (context->getClientVersion() < 3)
9279 {
9280 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9281 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009282
Geoff Langc8058452014-02-03 12:04:11 -05009283 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009284 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009285 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009286 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009287 {
9288 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9289 }
9290
9291 return GL_FALSE;
9292}
9293
9294void __stdcall glPauseTransformFeedback(void)
9295{
9296 EVENT("(void)");
9297
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009298 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009299 {
9300 gl::Context *context = gl::getNonLostContext();
9301
9302 if (context)
9303 {
9304 if (context->getClientVersion() < 3)
9305 {
9306 return gl::error(GL_INVALID_OPERATION);
9307 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009308
Shannon Woods53a94a82014-06-24 15:20:36 -04009309 gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
Geoff Langc8058452014-02-03 12:04:11 -05009310 ASSERT(transformFeedback != NULL);
9311
9312 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9313 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9314 {
9315 return gl::error(GL_INVALID_OPERATION);
9316 }
9317
9318 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009319 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009320 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009321 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009322 {
9323 return gl::error(GL_OUT_OF_MEMORY);
9324 }
9325}
9326
9327void __stdcall glResumeTransformFeedback(void)
9328{
9329 EVENT("(void)");
9330
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009331 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009332 {
9333 gl::Context *context = gl::getNonLostContext();
9334
9335 if (context)
9336 {
9337 if (context->getClientVersion() < 3)
9338 {
9339 return gl::error(GL_INVALID_OPERATION);
9340 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009341
Shannon Woods53a94a82014-06-24 15:20:36 -04009342 gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
Geoff Langc8058452014-02-03 12:04:11 -05009343 ASSERT(transformFeedback != NULL);
9344
9345 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9346 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9347 {
9348 return gl::error(GL_INVALID_OPERATION);
9349 }
9350
9351 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009352 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009353 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009354 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009355 {
9356 return gl::error(GL_OUT_OF_MEMORY);
9357 }
9358}
9359
9360void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9361{
9362 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9363 program, bufSize, length, binaryFormat, binary);
9364
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009365 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009366 {
9367 gl::Context *context = gl::getNonLostContext();
9368
9369 if (context)
9370 {
9371 if (context->getClientVersion() < 3)
9372 {
9373 return gl::error(GL_INVALID_OPERATION);
9374 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009375
Jamie Madill54133512013-06-21 09:33:07 -04009376 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009377 UNIMPLEMENTED();
9378 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009379 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009380 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009381 {
9382 return gl::error(GL_OUT_OF_MEMORY);
9383 }
9384}
9385
9386void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9387{
9388 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9389 program, binaryFormat, binary, length);
9390
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009391 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009392 {
9393 gl::Context *context = gl::getNonLostContext();
9394
9395 if (context)
9396 {
9397 if (context->getClientVersion() < 3)
9398 {
9399 return gl::error(GL_INVALID_OPERATION);
9400 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009401
Jamie Madill54133512013-06-21 09:33:07 -04009402 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009403 UNIMPLEMENTED();
9404 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009405 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009406 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009407 {
9408 return gl::error(GL_OUT_OF_MEMORY);
9409 }
9410}
9411
9412void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9413{
9414 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9415 program, pname, value);
9416
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009417 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009418 {
9419 gl::Context *context = gl::getNonLostContext();
9420
9421 if (context)
9422 {
9423 if (context->getClientVersion() < 3)
9424 {
9425 return gl::error(GL_INVALID_OPERATION);
9426 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009427
Jamie Madill54133512013-06-21 09:33:07 -04009428 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009429 UNIMPLEMENTED();
9430 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009431 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009432 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009433 {
9434 return gl::error(GL_OUT_OF_MEMORY);
9435 }
9436}
9437
9438void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9439{
9440 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9441 target, numAttachments, attachments);
9442
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009443 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009444 {
9445 gl::Context *context = gl::getNonLostContext();
9446
9447 if (context)
9448 {
9449 if (context->getClientVersion() < 3)
9450 {
9451 return gl::error(GL_INVALID_OPERATION);
9452 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009453
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009454 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009455 {
9456 return;
9457 }
9458
Geoff Langaae65a42014-05-26 12:43:44 -04009459 GLuint maxDimension = context->getCaps().maxRenderbufferSize;
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009460 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9461 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009462 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009463 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009464 {
9465 return gl::error(GL_OUT_OF_MEMORY);
9466 }
9467}
9468
9469void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9470{
9471 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9472 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9473 target, numAttachments, attachments, x, y, width, height);
9474
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009475 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009476 {
9477 gl::Context *context = gl::getNonLostContext();
9478
9479 if (context)
9480 {
9481 if (context->getClientVersion() < 3)
9482 {
9483 return gl::error(GL_INVALID_OPERATION);
9484 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009485
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009486 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009487 {
9488 return;
9489 }
9490
9491 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9492 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009493 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009494 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009495 {
9496 return gl::error(GL_OUT_OF_MEMORY);
9497 }
9498}
9499
9500void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9501{
9502 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9503 target, levels, internalformat, width, height);
9504
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009505 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009506 {
9507 gl::Context *context = gl::getNonLostContext();
9508
9509 if (context)
9510 {
9511 if (context->getClientVersion() < 3)
9512 {
9513 return gl::error(GL_INVALID_OPERATION);
9514 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009515
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009516 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009517 {
9518 return;
9519 }
9520
9521 switch (target)
9522 {
9523 case GL_TEXTURE_2D:
9524 {
9525 gl::Texture2D *texture2d = context->getTexture2D();
9526 texture2d->storage(levels, internalformat, width, height);
9527 }
9528 break;
9529
Geoff Lang01c21d22013-09-24 11:52:16 -04009530 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009531 {
9532 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9533 textureCube->storage(levels, internalformat, width);
9534 }
9535 break;
9536
9537 default:
9538 return gl::error(GL_INVALID_ENUM);
9539 }
9540 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009541 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009542 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009543 {
9544 return gl::error(GL_OUT_OF_MEMORY);
9545 }
9546}
9547
9548void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9549{
9550 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9551 "GLsizei height = %d, GLsizei depth = %d)",
9552 target, levels, internalformat, width, height, depth);
9553
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009554 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009555 {
9556 gl::Context *context = gl::getNonLostContext();
9557
9558 if (context)
9559 {
9560 if (context->getClientVersion() < 3)
9561 {
9562 return gl::error(GL_INVALID_OPERATION);
9563 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009564
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009565 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009566 {
9567 return;
9568 }
9569
9570 switch (target)
9571 {
9572 case GL_TEXTURE_3D:
9573 {
9574 gl::Texture3D *texture3d = context->getTexture3D();
9575 texture3d->storage(levels, internalformat, width, height, depth);
9576 }
9577 break;
9578
9579 case GL_TEXTURE_2D_ARRAY:
9580 {
9581 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9582 texture2darray->storage(levels, internalformat, width, height, depth);
9583 }
9584 break;
9585
9586 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009587 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009588 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009589 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009590 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009591 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009592 {
9593 return gl::error(GL_OUT_OF_MEMORY);
9594 }
9595}
9596
9597void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9598{
9599 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9600 "GLint* params = 0x%0.8p)",
9601 target, internalformat, pname, bufSize, params);
9602
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009603 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009604 {
9605 gl::Context *context = gl::getNonLostContext();
9606
9607 if (context)
9608 {
9609 if (context->getClientVersion() < 3)
9610 {
9611 return gl::error(GL_INVALID_OPERATION);
9612 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009613
Geoff Langc0b9ef42014-07-02 10:02:37 -04009614 const gl::TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
Geoff Lang6cf8e1b2014-07-03 13:03:57 -04009615 if (!formatCaps.renderable)
Shannon Woods809d2502013-07-08 10:32:18 -04009616 {
9617 return gl::error(GL_INVALID_ENUM);
9618 }
9619
9620 if (target != GL_RENDERBUFFER)
9621 {
9622 return gl::error(GL_INVALID_ENUM);
9623 }
9624
9625 if (bufSize < 0)
9626 {
9627 return gl::error(GL_INVALID_VALUE);
9628 }
9629
9630 switch (pname)
9631 {
9632 case GL_NUM_SAMPLE_COUNTS:
9633 if (bufSize != 0)
9634 *params = context->getNumSampleCounts(internalformat);
9635 break;
9636 case GL_SAMPLES:
9637 context->getSampleCounts(internalformat, bufSize, params);
9638 break;
9639 default:
9640 return gl::error(GL_INVALID_ENUM);
9641 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009642 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009643 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009644 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009645 {
9646 return gl::error(GL_OUT_OF_MEMORY);
9647 }
9648}
9649
9650// Extension functions
9651
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009652void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9653 GLbitfield mask, GLenum filter)
9654{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009655 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009656 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9657 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9658 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9659
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009660 ANGLE_TRY
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009661 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009662 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009663
9664 if (context)
9665 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009666 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04009667 dstX0, dstY0, dstX1, dstY1, mask, filter,
9668 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009669 {
Geoff Lang758d5b22013-06-11 11:42:50 -04009670 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009671 }
9672
Geoff Lang758d5b22013-06-11 11:42:50 -04009673 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
9674 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009675 }
9676 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009677 ANGLE_CATCH_ALL
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009679 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009680 }
9681}
9682
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009683void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9684 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009685{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009686 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009687 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009688 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009689 target, level, internalformat, width, height, depth, border, format, type, pixels);
9690
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009691 ANGLE_TRY
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009692 {
9693 UNIMPLEMENTED(); // FIXME
9694 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009695 ANGLE_CATCH_ALL
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009697 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009698 }
9699}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009700
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009701void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9702 GLenum *binaryFormat, void *binary)
9703{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009704 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 +00009705 program, bufSize, length, binaryFormat, binary);
9706
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009707 ANGLE_TRY
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009708 {
9709 gl::Context *context = gl::getNonLostContext();
9710
9711 if (context)
9712 {
9713 gl::Program *programObject = context->getProgram(program);
9714
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009715 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009717 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009718 }
9719
9720 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9721
9722 if (!programBinary)
9723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009724 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009725 }
9726
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009727 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009729 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009730 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009731
9732 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009733 }
9734 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009735 ANGLE_CATCH_ALL
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009737 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009738 }
9739}
9740
9741void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9742 const void *binary, GLint length)
9743{
9744 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9745 program, binaryFormat, binary, length);
9746
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009747 ANGLE_TRY
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009748 {
9749 gl::Context *context = gl::getNonLostContext();
9750
9751 if (context)
9752 {
9753 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009755 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009756 }
9757
9758 gl::Program *programObject = context->getProgram(program);
9759
9760 if (!programObject)
9761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009762 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009763 }
9764
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009765 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009766 }
9767 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009768 ANGLE_CATCH_ALL
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009770 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009771 }
9772}
9773
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009774void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9775{
9776 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9777
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009778 ANGLE_TRY
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009779 {
9780 gl::Context *context = gl::getNonLostContext();
9781
9782 if (context)
9783 {
Geoff Langaae65a42014-05-26 12:43:44 -04009784 if (n < 0 || static_cast<GLuint>(n) > context->getCaps().maxDrawBuffers)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009785 {
9786 return gl::error(GL_INVALID_VALUE);
9787 }
9788
Shannon Woods53a94a82014-06-24 15:20:36 -04009789 if (context->getState().getDrawFramebuffer()->id() == 0)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009790 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009791 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009792 {
9793 return gl::error(GL_INVALID_OPERATION);
9794 }
9795
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009796 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009797 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009798 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009799 }
9800 }
9801 else
9802 {
9803 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9804 {
9805 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9806 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9807 {
9808 return gl::error(GL_INVALID_OPERATION);
9809 }
9810 }
9811 }
9812
Shannon Woods53a94a82014-06-24 15:20:36 -04009813 gl::Framebuffer *framebuffer = context->getState().getDrawFramebuffer();
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009814
Geoff Langaae65a42014-05-26 12:43:44 -04009815 for (unsigned int colorAttachment = 0; colorAttachment < static_cast<unsigned int>(n); colorAttachment++)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009816 {
9817 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9818 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009819
Geoff Langaae65a42014-05-26 12:43:44 -04009820 for (unsigned int colorAttachment = n; colorAttachment < context->getCaps().maxDrawBuffers; colorAttachment++)
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009821 {
9822 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9823 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009824 }
9825 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009826 ANGLE_CATCH_ALL
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009827 {
9828 return gl::error(GL_OUT_OF_MEMORY);
9829 }
9830}
9831
Shannon Woodsb3801742014-03-27 14:59:19 -04009832void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
9833{
9834 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
9835
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009836 ANGLE_TRY
Shannon Woodsb3801742014-03-27 14:59:19 -04009837 {
9838 gl::Context *context = gl::getNonLostContext();
9839
9840 if (context)
9841 {
Shannon Woodsb3801742014-03-27 14:59:19 -04009842 if (!gl::ValidBufferTarget(context, target))
9843 {
9844 return gl::error(GL_INVALID_ENUM);
9845 }
9846
9847 if (pname != GL_BUFFER_MAP_POINTER)
9848 {
9849 return gl::error(GL_INVALID_ENUM);
9850 }
9851
Shannon Woods53a94a82014-06-24 15:20:36 -04009852 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
Shannon Woodsb3801742014-03-27 14:59:19 -04009853
Brandon Jonesd38f9262014-06-18 16:26:45 -07009854 if (!buffer || !buffer->isMapped())
Shannon Woodsb3801742014-03-27 14:59:19 -04009855 {
9856 *params = NULL;
9857 }
Shannon Woods6dc7f362014-06-25 21:12:02 -04009858 else
9859 {
9860 *params = buffer->getMapPointer();
9861 }
Shannon Woodsb3801742014-03-27 14:59:19 -04009862 }
9863 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009864 ANGLE_CATCH_ALL
Shannon Woodsb3801742014-03-27 14:59:19 -04009865 {
9866 return gl::error(GL_OUT_OF_MEMORY);
9867 }
9868}
9869
9870void * __stdcall glMapBufferOES(GLenum target, GLenum access)
9871{
9872 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
9873
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009874 ANGLE_TRY
Shannon Woodsb3801742014-03-27 14:59:19 -04009875 {
9876 gl::Context *context = gl::getNonLostContext();
9877
9878 if (context)
9879 {
9880 if (!gl::ValidBufferTarget(context, target))
9881 {
9882 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9883 }
9884
Shannon Woods53a94a82014-06-24 15:20:36 -04009885 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
Shannon Woodsb3801742014-03-27 14:59:19 -04009886
9887 if (buffer == NULL)
9888 {
9889 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9890 }
9891
9892 if (access != GL_WRITE_ONLY_OES)
9893 {
9894 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9895 }
9896
Brandon Jonesd38f9262014-06-18 16:26:45 -07009897 if (buffer->isMapped())
Shannon Woodsb3801742014-03-27 14:59:19 -04009898 {
9899 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9900 }
9901
Brandon Jonesd38f9262014-06-18 16:26:45 -07009902 return buffer->mapRange(0, buffer->getSize(), GL_MAP_WRITE_BIT);
Shannon Woodsb3801742014-03-27 14:59:19 -04009903 }
9904 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009905 ANGLE_CATCH_ALL
Shannon Woodsb3801742014-03-27 14:59:19 -04009906 {
9907 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
9908 }
9909
9910 return NULL;
9911}
9912
9913GLboolean __stdcall glUnmapBufferOES(GLenum target)
9914{
9915 EVENT("(GLenum target = 0x%X)", target);
9916
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009917 ANGLE_TRY
Shannon Woodsb3801742014-03-27 14:59:19 -04009918 {
9919 gl::Context *context = gl::getNonLostContext();
9920
9921 if (context)
9922 {
9923 if (!gl::ValidBufferTarget(context, target))
9924 {
9925 return gl::error(GL_INVALID_ENUM, GL_FALSE);
9926 }
9927
Shannon Woods53a94a82014-06-24 15:20:36 -04009928 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
Shannon Woodsb3801742014-03-27 14:59:19 -04009929
Brandon Jonesd38f9262014-06-18 16:26:45 -07009930 if (buffer == NULL || !buffer->isMapped())
Shannon Woodsb3801742014-03-27 14:59:19 -04009931 {
9932 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9933 }
9934
9935 // TODO: detect if we had corruption. if so, throw an error and return false.
9936
9937 buffer->unmap();
9938
9939 return GL_TRUE;
9940 }
9941 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009942 ANGLE_CATCH_ALL
Shannon Woodsb3801742014-03-27 14:59:19 -04009943 {
9944 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9945 }
9946
9947 return GL_FALSE;
9948}
9949
Shannon Woods916e7692014-03-27 16:58:22 -04009950void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
9951{
9952 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
9953 target, offset, length, access);
9954
Ehsan Akhgari10530c32014-07-02 20:37:53 -04009955 ANGLE_TRY
Shannon Woods916e7692014-03-27 16:58:22 -04009956 {
9957 gl::Context *context = gl::getNonLostContext();
9958
9959 if (context)
9960 {
9961 if (!gl::ValidBufferTarget(context, target))
9962 {
9963 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9964 }
9965
9966 if (offset < 0 || length < 0)
9967 {
9968 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
9969 }
9970
Shannon Woods53a94a82014-06-24 15:20:36 -04009971 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
Shannon Woods916e7692014-03-27 16:58:22 -04009972
9973 if (buffer == NULL)
9974 {
9975 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9976 }
9977
9978 // Check for buffer overflow
9979 size_t offsetSize = static_cast<size_t>(offset);
9980 size_t lengthSize = static_cast<size_t>(length);
9981
9982 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
Brandon Jonesd38f9262014-06-18 16:26:45 -07009983 offsetSize + lengthSize > static_cast<size_t>(buffer->getSize()))
Shannon Woods916e7692014-03-27 16:58:22 -04009984 {
9985 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
9986 }
9987
9988 // Check for invalid bits in the mask
9989 GLbitfield allAccessBits = GL_MAP_READ_BIT |
9990 GL_MAP_WRITE_BIT |
9991 GL_MAP_INVALIDATE_RANGE_BIT |
9992 GL_MAP_INVALIDATE_BUFFER_BIT |
9993 GL_MAP_FLUSH_EXPLICIT_BIT |
9994 GL_MAP_UNSYNCHRONIZED_BIT;
9995
9996 if (access & ~(allAccessBits))
9997 {
9998 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
9999 }
10000
Brandon Jonesd38f9262014-06-18 16:26:45 -070010001 if (length == 0 || buffer->isMapped())
Shannon Woods916e7692014-03-27 16:58:22 -040010002 {
10003 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10004 }
10005
10006 // Check for invalid bit combinations
10007 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10008 {
10009 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10010 }
10011
10012 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10013 GL_MAP_INVALIDATE_BUFFER_BIT |
10014 GL_MAP_UNSYNCHRONIZED_BIT;
10015
10016 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10017 {
10018 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10019 }
10020
10021 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10022 {
10023 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10024 }
10025
10026 return buffer->mapRange(offset, length, access);
10027 }
10028 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -040010029 ANGLE_CATCH_ALL
Shannon Woods916e7692014-03-27 16:58:22 -040010030 {
10031 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10032 }
10033
10034 return NULL;
10035}
10036
10037void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10038{
10039 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10040
Ehsan Akhgari10530c32014-07-02 20:37:53 -040010041 ANGLE_TRY
Shannon Woods916e7692014-03-27 16:58:22 -040010042 {
10043 gl::Context *context = gl::getNonLostContext();
10044
10045 if (context)
10046 {
10047 if (offset < 0 || length < 0)
10048 {
10049 return gl::error(GL_INVALID_VALUE);
10050 }
10051
10052 if (!gl::ValidBufferTarget(context, target))
10053 {
10054 return gl::error(GL_INVALID_ENUM);
10055 }
10056
Shannon Woods53a94a82014-06-24 15:20:36 -040010057 gl::Buffer *buffer = context->getState().getTargetBuffer(target);
Shannon Woods916e7692014-03-27 16:58:22 -040010058
10059 if (buffer == NULL)
10060 {
10061 return gl::error(GL_INVALID_OPERATION);
10062 }
10063
Brandon Jonesd38f9262014-06-18 16:26:45 -070010064 if (!buffer->isMapped() || (buffer->getAccessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
Shannon Woods916e7692014-03-27 16:58:22 -040010065 {
10066 return gl::error(GL_INVALID_OPERATION);
10067 }
10068
10069 // Check for buffer overflow
10070 size_t offsetSize = static_cast<size_t>(offset);
10071 size_t lengthSize = static_cast<size_t>(length);
10072
10073 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
Brandon Jonesd38f9262014-06-18 16:26:45 -070010074 offsetSize + lengthSize > static_cast<size_t>(buffer->getMapLength()))
Shannon Woods916e7692014-03-27 16:58:22 -040010075 {
10076 return gl::error(GL_INVALID_VALUE);
10077 }
10078
10079 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10080 }
10081 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -040010082 ANGLE_CATCH_ALL
Shannon Woods916e7692014-03-27 16:58:22 -040010083 {
10084 return gl::error(GL_OUT_OF_MEMORY);
10085 }
10086}
10087
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010088__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10089{
10090 struct Extension
10091 {
10092 const char *name;
10093 __eglMustCastToProperFunctionPointerType address;
10094 };
10095
10096 static const Extension glExtensions[] =
10097 {
10098 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010099 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010100 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010101 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10102 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10103 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10104 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10105 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10106 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10107 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010108 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010109 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010110 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10111 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10112 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10113 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010114 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10115 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10116 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10117 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10118 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10119 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10120 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010121 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010122 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10123 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10124 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010125 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010126 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10127 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10128 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -040010129 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10130 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10131 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010132
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010133 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010134 {
10135 if (strcmp(procname, glExtensions[ext].name) == 0)
10136 {
10137 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10138 }
10139 }
10140
10141 return NULL;
10142}
10143
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010144// Non-public functions used by EGL
10145
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010146bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010147{
10148 EVENT("(egl::Surface* surface = 0x%0.8p)",
10149 surface);
10150
Ehsan Akhgari10530c32014-07-02 20:37:53 -040010151 ANGLE_TRY
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010152 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010153 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010154
10155 if (context)
10156 {
10157 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010158 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010159
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010160 if (textureObject->isImmutable())
10161 {
10162 return false;
10163 }
10164
Geoff Lang32d508e2014-02-11 09:39:48 -050010165 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010166 }
10167 }
Ehsan Akhgari10530c32014-07-02 20:37:53 -040010168 ANGLE_CATCH_ALL
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010170 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010171 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010172
10173 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010174}
10175
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010176}