1 // SwiftShader Software Renderer
\r
3 // Copyright(c) 2015 Google Inc.
\r
5 // All rights reserved. No part of this software may be copied, distributed, transmitted,
\r
6 // transcribed, stored in a retrieval system, translated into any human or computer
\r
7 // language by any means, or disclosed to third parties without the explicit written
\r
8 // agreement of Google Inc. Without such an agreement, no rights or licenses, express
\r
9 // or implied, including but not limited to any patent rights, are granted to you.
\r
11 // libGLESv3.cpp: Implements the exported OpenGL ES 3.0 functions.
\r
15 #include "Framebuffer.h"
\r
16 #include "Program.h"
\r
18 #include "Sampler.h"
\r
19 #include "Texture.h"
\r
20 #include "common/debug.h"
\r
23 #include <GLES3/gl3.h>
\r
24 #include <GLES2/gl2ext.h>
\r
26 typedef std::pair<GLenum, GLenum> InternalFormatTypePair;
\r
27 typedef std::map<InternalFormatTypePair, GLenum> FormatMap;
\r
29 // A helper function to insert data into the format map with fewer characters.
\r
30 static void InsertFormatMapping(FormatMap& map, GLenum internalformat, GLenum format, GLenum type)
\r
32 map[InternalFormatTypePair(internalformat, type)] = format;
\r
35 static bool validImageSize(GLint level, GLsizei width, GLsizei height)
\r
37 if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || width < 0 || height < 0)
\r
45 static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei height, GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, es2::Texture *texture)
\r
49 return error(GL_INVALID_OPERATION, false);
\r
52 if(compressed != texture->isCompressed(target, level))
\r
54 return error(GL_INVALID_OPERATION, false);
\r
57 if(format != GL_NONE && format != texture->getFormat(target, level))
\r
59 return error(GL_INVALID_OPERATION, false);
\r
64 if((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
\r
65 (height % 4 != 0 && height != texture->getHeight(target, 0)))
\r
67 return error(GL_INVALID_OPERATION, false);
\r
71 if(xoffset + width > texture->getWidth(target, level) ||
\r
72 yoffset + height > texture->getHeight(target, level))
\r
74 return error(GL_INVALID_VALUE, false);
\r
80 static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei height, GLsizei depth, GLint xoffset, GLint yoffset, GLint zoffset, GLenum target, GLint level, GLenum format, es2::Texture *texture)
\r
84 return error(GL_INVALID_OPERATION, false);
\r
87 if(compressed != texture->isCompressed(target, level))
\r
89 return error(GL_INVALID_OPERATION, false);
\r
92 if(format != GL_NONE && format != texture->getFormat(target, level))
\r
94 return error(GL_INVALID_OPERATION, false);
\r
99 if((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
\r
100 (height % 4 != 0 && height != texture->getHeight(target, 0)) ||
\r
101 (depth % 4 != 0 && depth != texture->getDepth(target, 0)))
\r
103 return error(GL_INVALID_OPERATION, false);
\r
107 if(xoffset + width > texture->getWidth(target, level) ||
\r
108 yoffset + height > texture->getHeight(target, level) ||
\r
109 zoffset + depth > texture->getDepth(target, level))
\r
111 return error(GL_INVALID_VALUE, false);
\r
117 static bool validateColorBufferFormat(GLenum textureFormat, GLenum colorbufferFormat)
\r
119 switch(textureFormat)
\r
122 if(colorbufferFormat != GL_ALPHA &&
\r
123 colorbufferFormat != GL_RGBA &&
\r
124 colorbufferFormat != GL_RGBA4 &&
\r
125 colorbufferFormat != GL_RGB5_A1 &&
\r
126 colorbufferFormat != GL_RGBA8)
\r
128 return error(GL_INVALID_OPERATION, false);
\r
133 if(colorbufferFormat != GL_RGB &&
\r
134 colorbufferFormat != GL_RGB565 &&
\r
135 colorbufferFormat != GL_RGB8 &&
\r
136 colorbufferFormat != GL_RGBA &&
\r
137 colorbufferFormat != GL_RGBA4 &&
\r
138 colorbufferFormat != GL_RGB5_A1 &&
\r
139 colorbufferFormat != GL_RGBA8)
\r
141 return error(GL_INVALID_OPERATION, false);
\r
144 case GL_LUMINANCE_ALPHA:
\r
146 if(colorbufferFormat != GL_RGBA &&
\r
147 colorbufferFormat != GL_RGBA4 &&
\r
148 colorbufferFormat != GL_RGB5_A1 &&
\r
149 colorbufferFormat != GL_RGBA8)
\r
151 return error(GL_INVALID_OPERATION, false);
\r
154 case GL_ETC1_RGB8_OES:
\r
155 return error(GL_INVALID_OPERATION, false);
\r
156 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
\r
157 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
\r
158 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
\r
159 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
\r
162 return error(GL_INVALID_OPERATION, false);
\r
166 return error(GL_INVALID_ENUM, false);
\r
168 case GL_DEPTH_COMPONENT:
\r
169 case GL_DEPTH_STENCIL:
\r
170 return error(GL_INVALID_OPERATION, false);
\r
172 return error(GL_INVALID_ENUM, false);
\r
177 static FormatMap BuildFormatMap3D()
\r
181 // Internal format | Format | Type
\r
182 InsertFormatMapping(map, GL_RGB, GL_RGB, GL_UNSIGNED_BYTE);
\r
183 InsertFormatMapping(map, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
\r
184 InsertFormatMapping(map, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE);
\r
185 InsertFormatMapping(map, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
\r
186 InsertFormatMapping(map, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
\r
187 InsertFormatMapping(map, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
\r
188 InsertFormatMapping(map, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE);
\r
189 InsertFormatMapping(map, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE);
\r
190 InsertFormatMapping(map, GL_R8, GL_RED, GL_UNSIGNED_BYTE);
\r
191 InsertFormatMapping(map, GL_R8_SNORM, GL_RED, GL_UNSIGNED_BYTE);
\r
192 InsertFormatMapping(map, GL_R16F, GL_RED, GL_HALF_FLOAT);
\r
193 InsertFormatMapping(map, GL_R16F, GL_RED, GL_FLOAT);
\r
194 InsertFormatMapping(map, GL_R32F, GL_RED, GL_FLOAT);
\r
195 InsertFormatMapping(map, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE);
\r
196 InsertFormatMapping(map, GL_R8I, GL_RED_INTEGER, GL_BYTE);
\r
197 InsertFormatMapping(map, GL_R16UI, GL_RED_INTEGER, GL_UNSIGNED_SHORT);
\r
198 InsertFormatMapping(map, GL_R16I, GL_RED_INTEGER, GL_SHORT);
\r
199 InsertFormatMapping(map, GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT);
\r
200 InsertFormatMapping(map, GL_R32I, GL_RED_INTEGER, GL_INT);
\r
201 InsertFormatMapping(map, GL_RG8, GL_RG, GL_UNSIGNED_BYTE);
\r
202 InsertFormatMapping(map, GL_RG8_SNORM, GL_RG, GL_BYTE);
\r
203 InsertFormatMapping(map, GL_R16F, GL_RED, GL_HALF_FLOAT);
\r
204 InsertFormatMapping(map, GL_R16F, GL_RED, GL_FLOAT);
\r
205 InsertFormatMapping(map, GL_RG32F, GL_RG, GL_FLOAT);
\r
206 InsertFormatMapping(map, GL_RG8UI, GL_RG_INTEGER, GL_UNSIGNED_BYTE);
\r
207 InsertFormatMapping(map, GL_RG8I, GL_RG_INTEGER, GL_BYTE);
\r
208 InsertFormatMapping(map, GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT);
\r
209 InsertFormatMapping(map, GL_RG16I, GL_RG_INTEGER, GL_SHORT);
\r
210 InsertFormatMapping(map, GL_RG32UI, GL_RG_INTEGER, GL_UNSIGNED_INT);
\r
211 InsertFormatMapping(map, GL_RG32I, GL_RG_INTEGER, GL_INT);
\r
212 InsertFormatMapping(map, GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE);
\r
213 InsertFormatMapping(map, GL_SRGB8, GL_RGB, GL_UNSIGNED_BYTE);
\r
214 InsertFormatMapping(map, GL_RGB565, GL_RGB, GL_UNSIGNED_BYTE);
\r
215 InsertFormatMapping(map, GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
\r
216 InsertFormatMapping(map, GL_RGB8_SNORM, GL_RGB, GL_BYTE);
\r
217 InsertFormatMapping(map, GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV);
\r
218 InsertFormatMapping(map, GL_R11F_G11F_B10F, GL_RGB, GL_HALF_FLOAT);
\r
219 InsertFormatMapping(map, GL_R11F_G11F_B10F, GL_RGB, GL_FLOAT);
\r
220 InsertFormatMapping(map, GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV);
\r
221 InsertFormatMapping(map, GL_RGB9_E5, GL_RGB, GL_HALF_FLOAT);
\r
222 InsertFormatMapping(map, GL_RGB9_E5, GL_RGB, GL_FLOAT);
\r
223 InsertFormatMapping(map, GL_RGB16F, GL_RGB, GL_HALF_FLOAT);
\r
224 InsertFormatMapping(map, GL_RGB16F, GL_RGB, GL_FLOAT);
\r
225 InsertFormatMapping(map, GL_RGB32F, GL_RGB, GL_FLOAT);
\r
226 InsertFormatMapping(map, GL_RGB8UI, GL_RGB_INTEGER, GL_UNSIGNED_BYTE);
\r
227 InsertFormatMapping(map, GL_RGB8I, GL_RGB_INTEGER, GL_BYTE);
\r
228 InsertFormatMapping(map, GL_RGB16UI, GL_RGB_INTEGER, GL_UNSIGNED_SHORT);
\r
229 InsertFormatMapping(map, GL_RGB16I, GL_RGB_INTEGER, GL_SHORT);
\r
230 InsertFormatMapping(map, GL_RGB32UI, GL_RGB_INTEGER, GL_UNSIGNED_INT);
\r
231 InsertFormatMapping(map, GL_RGB32I, GL_RGB_INTEGER, GL_INT);
\r
232 InsertFormatMapping(map, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE);
\r
233 InsertFormatMapping(map, GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE);
\r
234 InsertFormatMapping(map, GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_BYTE);
\r
235 InsertFormatMapping(map, GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
\r
236 InsertFormatMapping(map, GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV);
\r
237 InsertFormatMapping(map, GL_RGBA4, GL_RGBA, GL_UNSIGNED_BYTE);
\r
238 InsertFormatMapping(map, GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
\r
239 InsertFormatMapping(map, GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV);
\r
240 InsertFormatMapping(map, GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT);
\r
241 InsertFormatMapping(map, GL_RGBA16F, GL_RGBA, GL_FLOAT);
\r
242 InsertFormatMapping(map, GL_RGBA32F, GL_RGBA, GL_FLOAT);
\r
243 InsertFormatMapping(map, GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE);
\r
244 InsertFormatMapping(map, GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE);
\r
245 InsertFormatMapping(map, GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV);
\r
246 InsertFormatMapping(map, GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT);
\r
247 InsertFormatMapping(map, GL_RGBA16I, GL_RGBA_INTEGER, GL_SHORT);
\r
248 InsertFormatMapping(map, GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT);
\r
249 InsertFormatMapping(map, GL_RGBA32I, GL_RGBA_INTEGER, GL_INT);
\r
251 InsertFormatMapping(map, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT);
\r
252 InsertFormatMapping(map, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT);
\r
253 InsertFormatMapping(map, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT);
\r
254 InsertFormatMapping(map, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT);
\r
255 InsertFormatMapping(map, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8);
\r
256 InsertFormatMapping(map, GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
\r
261 static bool ValidateType3D(GLenum type)
\r
265 case GL_UNSIGNED_BYTE:
\r
267 case GL_UNSIGNED_SHORT:
\r
269 case GL_UNSIGNED_INT:
\r
271 case GL_HALF_FLOAT:
\r
273 case GL_UNSIGNED_SHORT_5_6_5:
\r
274 case GL_UNSIGNED_SHORT_4_4_4_4:
\r
275 case GL_UNSIGNED_SHORT_5_5_5_1:
\r
276 case GL_UNSIGNED_INT_2_10_10_10_REV:
\r
277 case GL_UNSIGNED_INT_10F_11F_11F_REV:
\r
278 case GL_UNSIGNED_INT_5_9_9_9_REV:
\r
279 case GL_UNSIGNED_INT_24_8:
\r
280 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
\r
288 static bool ValidateFormat3D(GLenum format)
\r
296 case GL_DEPTH_COMPONENT:
\r
297 case GL_DEPTH_STENCIL:
\r
298 case GL_LUMINANCE_ALPHA:
\r
301 case GL_RED_INTEGER:
\r
302 case GL_RG_INTEGER:
\r
303 case GL_RGB_INTEGER:
\r
304 case GL_RGBA_INTEGER:
\r
312 static bool ValidateInternalFormat3D(GLenum internalformat, GLenum format, GLenum type)
\r
314 static const FormatMap formatMap = BuildFormatMap3D();
\r
315 FormatMap::const_iterator iter = formatMap.find(InternalFormatTypePair(internalformat, type));
\r
316 if(iter != formatMap.end())
\r
318 return iter->second == format;
\r
323 static bool ValidateQueryTarget(GLenum target)
\r
327 case GL_ANY_SAMPLES_PASSED:
\r
328 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
\r
329 case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
\r
338 static bool ValidateBufferTarget(GLenum target)
\r
342 case GL_ARRAY_BUFFER:
\r
343 case GL_COPY_READ_BUFFER:
\r
344 case GL_COPY_WRITE_BUFFER:
\r
345 case GL_ELEMENT_ARRAY_BUFFER:
\r
346 case GL_PIXEL_PACK_BUFFER:
\r
347 case GL_PIXEL_UNPACK_BUFFER:
\r
348 case GL_TRANSFORM_FEEDBACK_BUFFER:
\r
349 case GL_UNIFORM_BUFFER:
\r
361 void GL_APIENTRY glReadBuffer(GLenum src)
\r
363 TRACE("(GLenum src = 0x%X)", src);
\r
365 es2::Context *context = es2::getContext();
\r
372 case GL_COLOR_ATTACHMENT0:
\r
373 case GL_COLOR_ATTACHMENT1:
\r
374 case GL_COLOR_ATTACHMENT2:
\r
375 case GL_COLOR_ATTACHMENT3:
\r
376 case GL_COLOR_ATTACHMENT4:
\r
377 case GL_COLOR_ATTACHMENT5:
\r
378 case GL_COLOR_ATTACHMENT6:
\r
379 case GL_COLOR_ATTACHMENT7:
\r
380 case GL_COLOR_ATTACHMENT8:
\r
381 case GL_COLOR_ATTACHMENT9:
\r
382 case GL_COLOR_ATTACHMENT10:
\r
383 case GL_COLOR_ATTACHMENT11:
\r
384 case GL_COLOR_ATTACHMENT12:
\r
385 case GL_COLOR_ATTACHMENT13:
\r
386 case GL_COLOR_ATTACHMENT14:
\r
387 case GL_COLOR_ATTACHMENT15:
\r
388 if((src - GL_COLOR_ATTACHMENT0) >= es2::IMPLEMENTATION_MAX_COLOR_ATTACHMENTS)
\r
390 return error(GL_INVALID_ENUM);
\r
394 error(GL_INVALID_ENUM);
\r
400 void GL_APIENTRY glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices)
\r
402 TRACE("(GLenum mode = 0x%X, GLuint start = %d, GLuint end = %d, "
\r
403 "GLsizei count = %d, GLenum type = 0x%x, const void* indices = 0x%0.8p)",
\r
404 mode, start, end, count, type, indices);
\r
411 case GL_LINE_STRIP:
\r
413 case GL_TRIANGLE_FAN:
\r
414 case GL_TRIANGLE_STRIP:
\r
417 return error(GL_INVALID_ENUM);
\r
422 case GL_UNSIGNED_BYTE:
\r
423 case GL_UNSIGNED_SHORT:
\r
424 case GL_UNSIGNED_INT:
\r
427 return error(GL_INVALID_ENUM);
\r
430 if((count < 0) || (end < start))
\r
432 return error(GL_INVALID_VALUE);
\r
438 void GL_APIENTRY glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)
\r
440 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
\r
441 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
\r
442 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
\r
443 target, level, internalformat, width, height, depth, border, format, type, pixels);
\r
447 case GL_TEXTURE_3D:
\r
448 case GL_TEXTURE_2D_ARRAY:
\r
451 return error(GL_INVALID_ENUM);
\r
454 if(!ValidateType3D(type) || !ValidateFormat3D(format))
\r
456 return error(GL_INVALID_ENUM);
\r
459 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
\r
461 return error(GL_INVALID_VALUE);
\r
464 const GLsizei maxSize3D = es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level;
\r
465 if((width < 0) || (height < 0) || (depth < 0) || (width > maxSize3D) || (height > maxSize3D) || (depth > maxSize3D))
\r
467 return error(GL_INVALID_VALUE);
\r
472 return error(GL_INVALID_VALUE);
\r
475 if(!ValidateInternalFormat3D(internalformat, format, type))
\r
477 return error(GL_INVALID_OPERATION);
\r
480 es2::Context *context = es2::getContext();
\r
484 es2::Texture3D *texture = context->getTexture3D();
\r
488 return error(GL_INVALID_OPERATION);
\r
491 texture->setImage(level, width, height, depth, internalformat, type, context->getUnpackAlignment(), pixels);
\r
495 void GL_APIENTRY glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
\r
497 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
\r
498 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
\r
499 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
\r
500 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
\r
504 case GL_TEXTURE_3D:
\r
505 case GL_TEXTURE_2D_ARRAY:
\r
508 return error(GL_INVALID_ENUM);
\r
511 if(!ValidateType3D(type) || !ValidateFormat3D(format))
\r
513 return error(GL_INVALID_ENUM);
\r
516 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
\r
518 return error(GL_INVALID_VALUE);
\r
521 if((width < 0) || (height < 0) || (depth < 0))
\r
523 return error(GL_INVALID_VALUE);
\r
526 es2::Context *context = es2::getContext();
\r
530 es2::Texture3D *texture = context->getTexture3D();
\r
532 if(validateSubImageParams(false, width, height, depth, xoffset, yoffset, zoffset, target, level, format, texture))
\r
534 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
\r
539 void GL_APIENTRY glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
\r
541 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
\r
542 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
\r
543 target, level, xoffset, yoffset, zoffset, x, y, width, height);
\r
547 case GL_TEXTURE_3D:
\r
548 case GL_TEXTURE_2D_ARRAY:
\r
551 return error(GL_INVALID_ENUM);
\r
554 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
\r
556 return error(GL_INVALID_VALUE);
\r
559 es2::Context *context = es2::getContext();
\r
563 es2::Framebuffer *framebuffer = context->getReadFramebuffer();
\r
565 if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
\r
567 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
\r
570 if(context->getReadFramebufferName() != 0 && framebuffer->getColorbuffer()->getSamples() > 1)
\r
572 return error(GL_INVALID_OPERATION);
\r
575 es2::Renderbuffer *source = framebuffer->getColorbuffer();
\r
576 GLenum colorbufferFormat = source->getFormat();
\r
577 es2::Texture3D *texture = context->getTexture3D();
\r
579 if(!validateSubImageParams(false, width, height, 1, xoffset, yoffset, zoffset, target, level, GL_NONE, texture))
\r
584 GLenum textureFormat = texture->getFormat(target, level);
\r
586 if(!validateColorBufferFormat(textureFormat, colorbufferFormat))
\r
591 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
\r
595 void GL_APIENTRY glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data)
\r
597 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
\r
598 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
\r
599 target, level, internalformat, width, height, depth, border, imageSize, data);
\r
603 case GL_TEXTURE_3D:
\r
604 case GL_TEXTURE_2D_ARRAY:
\r
607 return error(GL_INVALID_ENUM);
\r
610 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
\r
612 return error(GL_INVALID_VALUE);
\r
615 const GLsizei maxSize3D = es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level;
\r
616 if((width < 0) || (height < 0) || (depth < 0) || (width > maxSize3D) || (height > maxSize3D) || (depth > maxSize3D) || (border != 0) || (imageSize < 0))
\r
618 return error(GL_INVALID_VALUE);
\r
621 switch(internalformat)
\r
623 case GL_ETC1_RGB8_OES:
\r
624 case GL_COMPRESSED_R11_EAC:
\r
625 case GL_COMPRESSED_SIGNED_R11_EAC:
\r
626 case GL_COMPRESSED_RG11_EAC:
\r
627 case GL_COMPRESSED_SIGNED_RG11_EAC:
\r
628 case GL_COMPRESSED_RGB8_ETC2:
\r
629 case GL_COMPRESSED_SRGB8_ETC2:
\r
630 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
\r
631 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
\r
632 case GL_COMPRESSED_RGBA8_ETC2_EAC:
\r
633 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
\r
635 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
\r
636 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
\r
637 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
\r
638 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
\r
641 return error(GL_INVALID_ENUM);
\r
644 case GL_DEPTH_COMPONENT:
\r
645 case GL_DEPTH_COMPONENT16:
\r
646 case GL_DEPTH_COMPONENT32_OES:
\r
647 case GL_DEPTH_STENCIL:
\r
648 case GL_DEPTH24_STENCIL8:
\r
649 return error(GL_INVALID_OPERATION);
\r
651 return error(GL_INVALID_ENUM);
\r
654 if(imageSize != es2::ComputeCompressedSize(width, height, internalformat) * depth)
\r
656 return error(GL_INVALID_VALUE);
\r
659 es2::Context *context = es2::getContext();
\r
663 es2::Texture3D *texture = context->getTexture3D();
\r
667 return error(GL_INVALID_OPERATION);
\r
670 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
\r
674 void GL_APIENTRY glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
\r
676 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
\r
677 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
\r
678 "GLenum format = 0x%X, GLsizei imageSize = %d, const void *data = 0x%0.8p)",
\r
679 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
\r
683 case GL_TEXTURE_3D:
\r
684 case GL_TEXTURE_2D_ARRAY:
\r
687 return error(GL_INVALID_ENUM);
\r
690 if(xoffset < 0 || yoffset < 0 || zoffset < 0 || !validImageSize(level, width, height) || depth < 0 || imageSize < 0)
\r
692 return error(GL_INVALID_VALUE);
\r
697 case GL_ETC1_RGB8_OES:
\r
698 case GL_COMPRESSED_R11_EAC:
\r
699 case GL_COMPRESSED_SIGNED_R11_EAC:
\r
700 case GL_COMPRESSED_RG11_EAC:
\r
701 case GL_COMPRESSED_SIGNED_RG11_EAC:
\r
702 case GL_COMPRESSED_RGB8_ETC2:
\r
703 case GL_COMPRESSED_SRGB8_ETC2:
\r
704 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
\r
705 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
\r
706 case GL_COMPRESSED_RGBA8_ETC2_EAC:
\r
707 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
\r
709 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
\r
710 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
\r
711 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
\r
712 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
\r
715 return error(GL_INVALID_ENUM);
\r
719 return error(GL_INVALID_ENUM);
\r
722 if(width == 0 || height == 0 || depth == 0 || data == NULL)
\r
727 es2::Context *context = es2::getContext();
\r
731 es2::Texture3D *texture = context->getTexture3D();
\r
735 return error(GL_INVALID_OPERATION);
\r
738 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
\r
742 void GL_APIENTRY glGenQueries(GLsizei n, GLuint *ids)
\r
744 TRACE("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
\r
748 return error(GL_INVALID_VALUE);
\r
751 es2::Context *context = es2::getContext();
\r
755 for(int i = 0; i < n; i++)
\r
757 ids[i] = context->createQuery();
\r
762 void GL_APIENTRY glDeleteQueries(GLsizei n, const GLuint *ids)
\r
764 TRACE("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
\r
768 return error(GL_INVALID_VALUE);
\r
771 es2::Context *context = es2::getContext();
\r
775 for(int i = 0; i < n; i++)
\r
777 context->deleteQuery(ids[i]);
\r
782 GLboolean GL_APIENTRY glIsQuery(GLuint id)
\r
784 TRACE("(GLuint id = %d)", id);
\r
791 es2::Context *context = es2::getContext();
\r
795 es2::Query *queryObject = context->getQuery(id, false, GL_NONE);
\r
806 void GL_APIENTRY glBeginQuery(GLenum target, GLuint id)
\r
808 TRACE("(GLenum target = 0x%X, GLuint id = %d)", target, id);
\r
810 if(!ValidateQueryTarget(target))
\r
812 return error(GL_INVALID_ENUM);
\r
817 return error(GL_INVALID_OPERATION);
\r
820 es2::Context *context = es2::getContext();
\r
824 context->beginQuery(target, id);
\r
828 void GL_APIENTRY glEndQuery(GLenum target)
\r
830 TRACE("(GLenum target = 0x%X)", target);
\r
832 if(!ValidateQueryTarget(target))
\r
834 return error(GL_INVALID_ENUM);
\r
837 es2::Context *context = es2::getContext();
\r
841 context->endQuery(target);
\r
845 void GL_APIENTRY glGetQueryiv(GLenum target, GLenum pname, GLint *params)
\r
847 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)",
\r
848 target, pname, params);
\r
850 if(!ValidateQueryTarget(target) || (pname != GL_CURRENT_QUERY))
\r
852 return error(GL_INVALID_ENUM);
\r
855 es2::Context *context = es2::getContext();
\r
859 params[0] = context->getActiveQuery(target);
\r
863 void GL_APIENTRY glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
\r
865 TRACE("(GLuint id = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)",
\r
866 id, pname, params);
\r
870 case GL_QUERY_RESULT:
\r
871 case GL_QUERY_RESULT_AVAILABLE:
\r
874 return error(GL_INVALID_ENUM);
\r
877 es2::Context *context = es2::getContext();
\r
881 es2::Query *queryObject = context->getQuery(id, false, GL_NONE);
\r
885 return error(GL_INVALID_OPERATION);
\r
888 if(context->getActiveQuery(queryObject->getType()) == id)
\r
890 return error(GL_INVALID_OPERATION);
\r
895 case GL_QUERY_RESULT:
\r
896 params[0] = queryObject->getResult();
\r
898 case GL_QUERY_RESULT_AVAILABLE:
\r
899 params[0] = queryObject->isResultAvailable();
\r
907 GLboolean GL_APIENTRY glUnmapBuffer(GLenum target)
\r
909 TRACE("(GLenum target = 0x%X)", target);
\r
915 void GL_APIENTRY glGetBufferPointerv(GLenum target, GLenum pname, void **params)
\r
917 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)",
\r
918 target, pname, params);
\r
920 if(!ValidateBufferTarget(target))
\r
922 return error(GL_INVALID_ENUM);
\r
925 if(pname != GL_BUFFER_MAP_POINTER)
\r
927 return error(GL_INVALID_ENUM);
\r
933 void GL_APIENTRY glDrawBuffers(GLsizei n, const GLenum *bufs)
\r
935 TRACE("(GLsizei n = %d, const GLenum *bufs = 0x%0.8p)", n, bufs);
\r
940 void GL_APIENTRY glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
\r
942 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = 0x%0.8p)", location, count, transpose, value);
\r
944 if(count < 0 || transpose != GL_FALSE)
\r
946 return error(GL_INVALID_VALUE);
\r
954 es2::Context *context = es2::getContext();
\r
958 es2::Program *program = context->getCurrentProgram();
\r
962 return error(GL_INVALID_OPERATION);
\r
965 if(!program->setUniformMatrix2x3fv(location, count, value))
\r
967 return error(GL_INVALID_OPERATION);
\r
972 void GL_APIENTRY glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
\r
974 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = 0x%0.8p)", location, count, transpose, value);
\r
976 if(count < 0 || transpose != GL_FALSE)
\r
978 return error(GL_INVALID_VALUE);
\r
986 es2::Context *context = es2::getContext();
\r
990 es2::Program *program = context->getCurrentProgram();
\r
994 return error(GL_INVALID_OPERATION);
\r
997 if(!program->setUniformMatrix3x2fv(location, count, value))
\r
999 return error(GL_INVALID_OPERATION);
\r
1004 void GL_APIENTRY glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
\r
1006 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = 0x%0.8p)", location, count, transpose, value);
\r
1008 if(count < 0 || transpose != GL_FALSE)
\r
1010 return error(GL_INVALID_VALUE);
\r
1013 if(location == -1)
\r
1018 es2::Context *context = es2::getContext();
\r
1022 es2::Program *program = context->getCurrentProgram();
\r
1026 return error(GL_INVALID_OPERATION);
\r
1029 if(!program->setUniformMatrix2x4fv(location, count, value))
\r
1031 return error(GL_INVALID_OPERATION);
\r
1036 void GL_APIENTRY glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
\r
1038 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = 0x%0.8p)", location, count, transpose, value);
\r
1040 if(count < 0 || transpose != GL_FALSE)
\r
1042 return error(GL_INVALID_VALUE);
\r
1045 if(location == -1)
\r
1050 es2::Context *context = es2::getContext();
\r
1054 es2::Program *program = context->getCurrentProgram();
\r
1058 return error(GL_INVALID_OPERATION);
\r
1061 if(!program->setUniformMatrix4x2fv(location, count, value))
\r
1063 return error(GL_INVALID_OPERATION);
\r
1068 void GL_APIENTRY glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
\r
1070 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = 0x%0.8p)", location, count, transpose, value);
\r
1072 if(count < 0 || transpose != GL_FALSE)
\r
1074 return error(GL_INVALID_VALUE);
\r
1077 if(location == -1)
\r
1082 es2::Context *context = es2::getContext();
\r
1086 es2::Program *program = context->getCurrentProgram();
\r
1090 return error(GL_INVALID_OPERATION);
\r
1093 if(!program->setUniformMatrix3x4fv(location, count, value))
\r
1095 return error(GL_INVALID_OPERATION);
\r
1100 void GL_APIENTRY glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
\r
1102 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = 0x%0.8p)", location, count, transpose, value);
\r
1104 if(count < 0 || transpose != GL_FALSE)
\r
1106 return error(GL_INVALID_VALUE);
\r
1109 if(location == -1)
\r
1114 es2::Context *context = es2::getContext();
\r
1118 es2::Program *program = context->getCurrentProgram();
\r
1122 return error(GL_INVALID_OPERATION);
\r
1125 if(!program->setUniformMatrix4x3fv(location, count, value))
\r
1127 return error(GL_INVALID_OPERATION);
\r
1132 void GL_APIENTRY glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
\r
1134 TRACE("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
\r
1135 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
\r
1136 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
\r
1137 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
\r
1145 return error(GL_INVALID_ENUM);
\r
1148 if((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
\r
1150 return error(GL_INVALID_VALUE);
\r
1153 es2::Context *context = es2::getContext();
\r
1157 if(context->getReadFramebufferName() == context->getDrawFramebufferName())
\r
1159 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
\r
1160 return error(GL_INVALID_OPERATION);
\r
1163 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
\r
1167 void GL_APIENTRY glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
\r
1169 TRACE("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
\r
1170 target, samples, internalformat, width, height);
\r
1174 case GL_RENDERBUFFER:
\r
1177 return error(GL_INVALID_ENUM);
\r
1180 if(!es2::IsColorRenderable(internalformat) && !es2::IsDepthRenderable(internalformat) && !es2::IsStencilRenderable(internalformat))
\r
1182 return error(GL_INVALID_ENUM);
\r
1185 if(width < 0 || height < 0 || samples < 0)
\r
1187 return error(GL_INVALID_VALUE);
\r
1190 es2::Context *context = es2::getContext();
\r
1194 if(width > es2::IMPLEMENTATION_MAX_RENDERBUFFER_SIZE ||
\r
1195 height > es2::IMPLEMENTATION_MAX_RENDERBUFFER_SIZE ||
\r
1196 samples > es2::IMPLEMENTATION_MAX_SAMPLES)
\r
1198 return error(GL_INVALID_VALUE);
\r
1201 GLuint handle = context->getRenderbufferName();
\r
1204 return error(GL_INVALID_OPERATION);
\r
1207 switch(internalformat)
\r
1209 case GL_DEPTH_COMPONENT16:
\r
1210 case GL_DEPTH_COMPONENT24:
\r
1211 case GL_DEPTH_COMPONENT32F:
\r
1212 context->setRenderbufferStorage(new es2::Depthbuffer(width, height, samples));
\r
1234 case GL_RGB10_A2UI:
\r
1241 return error(GL_INVALID_OPERATION);
\r
1246 case GL_SRGB8_ALPHA8:
\r
1252 context->setRenderbufferStorage(new es2::Colorbuffer(width, height, internalformat, samples));
\r
1254 case GL_STENCIL_INDEX8:
\r
1255 context->setRenderbufferStorage(new es2::Stencilbuffer(width, height, samples));
\r
1257 case GL_DEPTH24_STENCIL8:
\r
1258 case GL_DEPTH32F_STENCIL8:
\r
1259 context->setRenderbufferStorage(new es2::DepthStencilbuffer(width, height, samples));
\r
1263 return error(GL_INVALID_ENUM);
\r
1268 void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
\r
1270 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %d, GLint level = %d, GLint layer = %d)",
\r
1271 target, attachment, texture, level, layer);
\r
1275 case GL_DRAW_FRAMEBUFFER:
\r
1276 case GL_READ_FRAMEBUFFER:
\r
1277 case GL_FRAMEBUFFER:
\r
1280 return error(GL_INVALID_ENUM);
\r
1283 switch(attachment)
\r
1285 case GL_COLOR_ATTACHMENT0:
\r
1286 case GL_COLOR_ATTACHMENT1:
\r
1287 case GL_COLOR_ATTACHMENT2:
\r
1288 case GL_COLOR_ATTACHMENT3:
\r
1289 case GL_COLOR_ATTACHMENT4:
\r
1290 case GL_COLOR_ATTACHMENT5:
\r
1291 case GL_COLOR_ATTACHMENT6:
\r
1292 case GL_COLOR_ATTACHMENT7:
\r
1293 case GL_COLOR_ATTACHMENT8:
\r
1294 case GL_COLOR_ATTACHMENT9:
\r
1295 case GL_COLOR_ATTACHMENT10:
\r
1296 case GL_COLOR_ATTACHMENT11:
\r
1297 case GL_COLOR_ATTACHMENT12:
\r
1298 case GL_COLOR_ATTACHMENT13:
\r
1299 case GL_COLOR_ATTACHMENT14:
\r
1300 case GL_COLOR_ATTACHMENT15:
\r
1301 case GL_DEPTH_ATTACHMENT:
\r
1302 case GL_STENCIL_ATTACHMENT:
\r
1303 case GL_DEPTH_STENCIL_ATTACHMENT:
\r
1306 return error(GL_INVALID_ENUM);
\r
1312 void *GL_APIENTRY glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
\r
1314 TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = %X)",
\r
1315 target, offset, length, access);
\r
1318 glGetBufferParameteriv(target, GL_BUFFER_SIZE, &bufferSize);
\r
1319 if((offset < 0) || (length<0) || ((offset + length) > bufferSize))
\r
1321 error(GL_INVALID_VALUE);
\r
1324 if((access & ~(GL_MAP_READ_BIT |
\r
1325 GL_MAP_WRITE_BIT |
\r
1326 GL_MAP_INVALIDATE_RANGE_BIT |
\r
1327 GL_MAP_INVALIDATE_BUFFER_BIT |
\r
1328 GL_MAP_FLUSH_EXPLICIT_BIT |
\r
1329 GL_MAP_UNSYNCHRONIZED_BIT)) != 0)
\r
1331 error(GL_INVALID_VALUE);
\r
1338 void GL_APIENTRY glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
\r
1340 TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)",
\r
1341 target, offset, length);
\r
1343 if(!ValidateBufferTarget(target))
\r
1345 return error(GL_INVALID_ENUM);
\r
1348 if((offset < 0) || (length<0)) // FIXME: also check if offset + length exceeds the size of the mapping
\r
1350 error(GL_INVALID_VALUE);
\r
1356 void GL_APIENTRY glBindVertexArray(GLuint array)
\r
1358 TRACE("(GLuint array = %d)", array);
\r
1365 es2::Context *context = es2::getContext();
\r
1367 if(context && !context->bindVertexArray(array))
\r
1369 return error(GL_INVALID_OPERATION);
\r
1373 void GL_APIENTRY glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
\r
1375 TRACE("(GLsizei n = %d, const GLuint *arrays = 0x%0.8p)", n, arrays);
\r
1379 return error(GL_INVALID_VALUE);
\r
1382 es2::Context *context = es2::getContext();
\r
1386 for(int i = 0; i < n; i++)
\r
1388 context->deleteVertexArray(arrays[i]);
\r
1393 void GL_APIENTRY glGenVertexArrays(GLsizei n, GLuint *arrays)
\r
1395 TRACE("(GLsizei n = %d, const GLuint *arrays = 0x%0.8p)", n, arrays);
\r
1399 return error(GL_INVALID_VALUE);
\r
1402 es2::Context *context = es2::getContext();
\r
1406 for(int i = 0; i < n; i++)
\r
1408 arrays[i] = context->createVertexArray();
\r
1413 GLboolean GL_APIENTRY glIsVertexArray(GLuint array)
\r
1415 TRACE("(GLuint array = %d)", array);
\r
1422 es2::Context *context = es2::getContext();
\r
1426 es2::VertexArray *arrayObject = context->getVertexArray(array);
\r
1437 void GL_APIENTRY glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
\r
1439 TRACE("(GLenum target = 0x%X, GLuint index = %d, GLint* data = 0x%0.8p)",
\r
1440 target, index, data);
\r
1442 es2::Context *context = es2::getContext();
\r
1446 if(!context->getTransformFeedbackiv(index, target, data) &&
\r
1447 !context->getIntegerv(target, data))
\r
1449 GLenum nativeType;
\r
1450 unsigned int numParams = 0;
\r
1451 if(!context->getQueryParameterInfo(target, &nativeType, &numParams))
\r
1452 return error(GL_INVALID_ENUM);
\r
1454 if(numParams == 0)
\r
1455 return; // it is known that target is valid, but there are no parameters to return
\r
1457 if(nativeType == GL_BOOL)
\r
1459 GLboolean *boolParams = NULL;
\r
1460 boolParams = new GLboolean[numParams];
\r
1462 context->getBooleanv(target, boolParams);
\r
1464 for(unsigned int i = 0; i < numParams; ++i)
\r
1466 data[i] = (boolParams[i] == GL_FALSE) ? 0 : 1;
\r
1469 delete[] boolParams;
\r
1471 else if(nativeType == GL_FLOAT)
\r
1473 GLfloat *floatParams = NULL;
\r
1474 floatParams = new GLfloat[numParams];
\r
1476 context->getFloatv(target, floatParams);
\r
1478 for(unsigned int i = 0; i < numParams; ++i)
\r
1480 if(target == GL_DEPTH_RANGE || target == GL_COLOR_CLEAR_VALUE || target == GL_DEPTH_CLEAR_VALUE || target == GL_BLEND_COLOR)
\r
1482 data[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) * 0.5f);
\r
1486 data[i] = (GLint)(floatParams[i] > 0.0f ? floor(floatParams[i] + 0.5) : ceil(floatParams[i] - 0.5));
\r
1490 delete[] floatParams;
\r
1496 void GL_APIENTRY glBeginTransformFeedback(GLenum primitiveMode)
\r
1498 TRACE("(GLenum primitiveMode = 0x%X)", primitiveMode);
\r
1500 switch(primitiveMode)
\r
1504 case GL_TRIANGLES:
\r
1507 return error(GL_INVALID_ENUM);
\r
1510 es2::Context *context = es2::getContext();
\r
1514 es2::TransformFeedback *transformFeedbackObject = context->getTransformFeedback();
\r
1516 if(transformFeedbackObject)
\r
1518 if(transformFeedbackObject->isActive())
\r
1520 return error(GL_INVALID_OPERATION);
\r
1522 transformFeedbackObject->begin(primitiveMode);
\r
1526 return error(GL_INVALID_OPERATION);
\r
1531 void GL_APIENTRY glEndTransformFeedback(void)
\r
1535 es2::Context *context = es2::getContext();
\r
1539 es2::TransformFeedback *transformFeedbackObject = context->getTransformFeedback();
\r
1541 if(transformFeedbackObject)
\r
1543 if(!transformFeedbackObject->isActive())
\r
1545 return error(GL_INVALID_OPERATION);
\r
1547 transformFeedbackObject->end();
\r
1551 return error(GL_INVALID_OPERATION);
\r
1556 void GL_APIENTRY glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
\r
1558 TRACE("(GLenum target = 0x%X, GLuint index = %d, GLuint buffer = %d, GLintptr offset = %d, GLsizeiptr size = %d)",
\r
1559 target, index, buffer, offset, size);
\r
1561 if(buffer != 0 && size <= 0)
\r
1563 return error(GL_INVALID_VALUE);
\r
1566 es2::Context *context = es2::getContext();
\r
1572 case GL_TRANSFORM_FEEDBACK_BUFFER:
\r
1573 if(index >= es2::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS)
\r
1575 return error(GL_INVALID_VALUE);
\r
1577 if(size & 0x3 || offset & 0x3) // size and offset must be multiples of 4
\r
1579 return error(GL_INVALID_VALUE);
\r
1583 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
\r
1584 transformFeedback->setBuffer(index, context->getBuffer(buffer), offset, size);
\r
1587 case GL_UNIFORM_BUFFER:
\r
1588 if(index >= es2::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS)
\r
1590 return error(GL_INVALID_VALUE);
\r
1592 if(offset % es2::IMPLEMENTATION_UNIFORM_BUFFER_OFFSET_ALIGNMENT != 0)
\r
1594 return error(GL_INVALID_VALUE);
\r
1599 return error(GL_INVALID_ENUM);
\r
1604 void GL_APIENTRY glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
\r
1606 TRACE("(GLenum target = 0x%X, GLuint index = %d, GLuint buffer = %d)",
\r
1607 target, index, buffer);
\r
1609 es2::Context *context = es2::getContext();
\r
1615 case GL_TRANSFORM_FEEDBACK_BUFFER:
\r
1616 if(index >= es2::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS)
\r
1618 return error(GL_INVALID_VALUE);
\r
1622 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
\r
1623 transformFeedback->setBuffer(index, context->getBuffer(buffer));
\r
1626 case GL_UNIFORM_BUFFER:
\r
1627 if(index >= es2::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS)
\r
1629 return error(GL_INVALID_VALUE);
\r
1634 return error(GL_INVALID_ENUM);
\r
1639 void GL_APIENTRY glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode)
\r
1641 TRACE("(GLuint program = %d, GLsizei count = %d, const GLchar *const*varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
\r
1642 program, count, varyings, bufferMode);
\r
1644 switch(bufferMode)
\r
1646 case GL_SEPARATE_ATTRIBS:
\r
1647 if(count > es2::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS)
\r
1649 return error(GL_INVALID_VALUE);
\r
1651 case GL_INTERLEAVED_ATTRIBS:
\r
1654 return error(GL_INVALID_ENUM);
\r
1657 es2::Context *context = es2::getContext();
\r
1661 es2::Program *programObject = context->getProgram(program);
\r
1663 if(!programObject)
\r
1665 return error(GL_INVALID_VALUE);
\r
1672 void GL_APIENTRY glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
\r
1674 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufSize = %d, GLsizei *length = 0x%0.8p, GLsizei *size = 0x%0.8p, GLenum *type = 0x%0.8p, GLchar *name = 0x%0.8p)",
\r
1675 program, index, bufSize, length, size, type, name);
\r
1677 es2::Context *context = es2::getContext();
\r
1681 es2::Program *programObject = context->getProgram(program);
\r
1683 if(!programObject)
\r
1685 return error(GL_INVALID_VALUE);
\r
1692 void GL_APIENTRY glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
\r
1694 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufSize = %d, GLsizei *length = 0x%0.8p, GLsizei *size = 0x%0.8p, GLenum *type = 0x%0.8p, GLchar *name = 0x%0.8p)",
\r
1695 index, size, type, stride, pointer);
\r
1697 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
1699 return error(GL_INVALID_VALUE);
\r
1702 if(size < 1 || size > 4 || stride < 0)
\r
1704 return error(GL_INVALID_VALUE);
\r
1710 case GL_UNSIGNED_BYTE:
\r
1712 case GL_UNSIGNED_SHORT:
\r
1714 case GL_UNSIGNED_INT:
\r
1717 return error(GL_INVALID_ENUM);
\r
1720 es2::Context *context = es2::getContext();
\r
1724 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, stride, pointer);
\r
1728 void GL_APIENTRY glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
\r
1730 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)",
\r
1731 index, pname, params);
\r
1733 es2::Context *context = es2::getContext();
\r
1737 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
1739 return error(GL_INVALID_VALUE);
\r
1742 const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
\r
1746 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
\r
1747 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
\r
1749 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
\r
1750 *params = attribState.mSize;
\r
1752 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
\r
1753 *params = attribState.mStride;
\r
1755 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
\r
1756 *params = attribState.mType;
\r
1758 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
\r
1759 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
\r
1761 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
\r
1762 *params = attribState.mBoundBuffer.name();
\r
1764 case GL_CURRENT_VERTEX_ATTRIB:
\r
1765 for(int i = 0; i < 4; ++i)
\r
1767 params[i] = attribState.getCurrentValueI(i);
\r
1770 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
\r
1771 switch(attribState.mType)
\r
1774 case GL_UNSIGNED_BYTE:
\r
1776 case GL_UNSIGNED_SHORT:
\r
1778 case GL_INT_2_10_10_10_REV:
\r
1779 case GL_UNSIGNED_INT:
\r
1781 *params = GL_TRUE;
\r
1784 *params = GL_FALSE;
\r
1788 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
\r
1789 *params = attribState.mDivisor;
\r
1791 default: return error(GL_INVALID_ENUM);
\r
1796 void GL_APIENTRY glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
\r
1798 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)",
\r
1799 index, pname, params);
\r
1801 es2::Context *context = es2::getContext();
\r
1805 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
1807 return error(GL_INVALID_VALUE);
\r
1810 const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
\r
1814 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
\r
1815 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
\r
1817 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
\r
1818 *params = attribState.mSize;
\r
1820 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
\r
1821 *params = attribState.mStride;
\r
1823 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
\r
1824 *params = attribState.mType;
\r
1826 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
\r
1827 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
\r
1829 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
\r
1830 *params = attribState.mBoundBuffer.name();
\r
1832 case GL_CURRENT_VERTEX_ATTRIB:
\r
1833 for(int i = 0; i < 4; ++i)
\r
1835 params[i] = attribState.getCurrentValueUI(i);
\r
1838 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
\r
1839 switch(attribState.mType)
\r
1842 case GL_UNSIGNED_BYTE:
\r
1844 case GL_UNSIGNED_SHORT:
\r
1846 case GL_INT_2_10_10_10_REV:
\r
1847 case GL_UNSIGNED_INT:
\r
1849 *params = GL_TRUE;
\r
1852 *params = GL_FALSE;
\r
1856 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
\r
1857 *params = attribState.mDivisor;
\r
1859 default: return error(GL_INVALID_ENUM);
\r
1864 void GL_APIENTRY glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
\r
1866 TRACE("(GLuint index = %d, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
\r
1867 index, x, y, z, w);
\r
1869 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
1871 return error(GL_INVALID_VALUE);
\r
1874 es2::Context *context = es2::getContext();
\r
1878 GLint vals[4] = { x, y, z, w };
\r
1879 context->setVertexAttrib(index, vals);
\r
1883 void GL_APIENTRY glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
\r
1885 TRACE("(GLuint index = %d, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
\r
1886 index, x, y, z, w);
\r
1888 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
1890 return error(GL_INVALID_VALUE);
\r
1893 es2::Context *context = es2::getContext();
\r
1897 GLuint vals[4] = { x, y, z, w };
\r
1898 context->setVertexAttrib(index, vals);
\r
1902 void GL_APIENTRY glVertexAttribI4iv(GLuint index, const GLint *v)
\r
1904 TRACE("(GLuint index = %d, GLint *v = 0x%0.8p)", index, v);
\r
1906 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
1908 return error(GL_INVALID_VALUE);
\r
1911 es2::Context *context = es2::getContext();
\r
1915 context->setVertexAttrib(index, v);
\r
1919 void GL_APIENTRY glVertexAttribI4uiv(GLuint index, const GLuint *v)
\r
1921 TRACE("(GLuint index = %d, GLint *v = 0x%0.8p)", index, v);
\r
1923 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
1925 return error(GL_INVALID_VALUE);
\r
1928 es2::Context *context = es2::getContext();
\r
1932 context->setVertexAttrib(index, v);
\r
1936 void GL_APIENTRY glGetUniformuiv(GLuint program, GLint location, GLuint *params)
\r
1938 TRACE("(GLuint program = %d, GLint location = %d, GLuint *params = 0x%0.8p)",
\r
1939 program, location, params);
\r
1941 es2::Context *context = es2::getContext();
\r
1947 return error(GL_INVALID_VALUE);
\r
1950 es2::Program *programObject = context->getProgram(program);
\r
1952 if(!programObject || !programObject->isLinked())
\r
1954 return error(GL_INVALID_OPERATION);
\r
1957 if(!programObject)
\r
1959 return error(GL_INVALID_OPERATION);
\r
1962 if(!programObject->getUniformuiv(location, NULL, params))
\r
1964 return error(GL_INVALID_OPERATION);
\r
1969 GLint GL_APIENTRY glGetFragDataLocation(GLuint program, const GLchar *name)
\r
1971 TRACE("(GLuint program = %d, const GLchar *name = 0x%0.8p)", program, name);
\r
1973 es2::Context *context = es2::getContext();
\r
1975 if(strstr(name, "gl_") == name)
\r
1982 es2::Program *programObject = context->getProgram(program);
\r
1984 if(!programObject)
\r
1986 if(context->getShader(program))
\r
1988 return error(GL_INVALID_OPERATION, -1);
\r
1992 return error(GL_INVALID_VALUE, -1);
\r
1996 if(!programObject->isLinked())
\r
1998 return error(GL_INVALID_OPERATION, -1);
\r
2006 void GL_APIENTRY glUniform1ui(GLint location, GLuint v0)
\r
2008 glUniform1uiv(location, 1, &v0);
\r
2011 void GL_APIENTRY glUniform2ui(GLint location, GLuint v0, GLuint v1)
\r
2013 GLuint xy[2] = { v0, v1 };
\r
2015 glUniform2uiv(location, 1, (GLuint*)&xy);
\r
2018 void GL_APIENTRY glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
\r
2020 GLuint xyz[3] = { v0, v1, v2 };
\r
2022 glUniform3uiv(location, 1, (GLuint*)&xyz);
\r
2025 void GL_APIENTRY glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
\r
2027 GLuint xyzw[4] = { v0, v1, v2, v3 };
\r
2029 glUniform4uiv(location, 1, (GLuint*)&xyzw);
\r
2032 void GL_APIENTRY glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
\r
2034 TRACE("(GLint location = %d, GLsizei count = %d, const GLuint *value = 0x%0.8p)",
\r
2035 location, count, value);
\r
2039 return error(GL_INVALID_VALUE);
\r
2042 if(location == -1)
\r
2047 es2::Context *context = es2::getContext();
\r
2051 es2::Program *program = context->getCurrentProgram();
\r
2055 return error(GL_INVALID_OPERATION);
\r
2058 if(!program->setUniform1uiv(location, count, value))
\r
2060 return error(GL_INVALID_OPERATION);
\r
2065 void GL_APIENTRY glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
\r
2067 TRACE("(GLint location = %d, GLsizei count = %d, const GLuint *value = 0x%0.8p)",
\r
2068 location, count, value);
\r
2072 return error(GL_INVALID_VALUE);
\r
2075 if(location == -1)
\r
2080 es2::Context *context = es2::getContext();
\r
2084 es2::Program *program = context->getCurrentProgram();
\r
2088 return error(GL_INVALID_OPERATION);
\r
2091 if(!program->setUniform2uiv(location, count, value))
\r
2093 return error(GL_INVALID_OPERATION);
\r
2098 void GL_APIENTRY glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
\r
2100 TRACE("(GLint location = %d, GLsizei count = %d, const GLuint *value = 0x%0.8p)",
\r
2101 location, count, value);
\r
2105 return error(GL_INVALID_VALUE);
\r
2108 if(location == -1)
\r
2113 es2::Context *context = es2::getContext();
\r
2117 es2::Program *program = context->getCurrentProgram();
\r
2121 return error(GL_INVALID_OPERATION);
\r
2124 if(!program->setUniform3uiv(location, count, value))
\r
2126 return error(GL_INVALID_OPERATION);
\r
2131 void GL_APIENTRY glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
\r
2133 TRACE("(GLint location = %d, GLsizei count = %d, const GLuint *value = 0x%0.8p)",
\r
2134 location, count, value);
\r
2138 return error(GL_INVALID_VALUE);
\r
2141 if(location == -1)
\r
2146 es2::Context *context = es2::getContext();
\r
2150 es2::Program *program = context->getCurrentProgram();
\r
2154 return error(GL_INVALID_OPERATION);
\r
2157 if(!program->setUniform4uiv(location, count, value))
\r
2159 return error(GL_INVALID_OPERATION);
\r
2164 void GL_APIENTRY glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
\r
2166 TRACE("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint *value = 0x%0.8p)",
\r
2167 buffer, drawbuffer, value);
\r
2172 if(drawbuffer > es2::IMPLEMENTATION_MAX_DRAW_BUFFERS)
\r
2174 return error(GL_INVALID_VALUE);
\r
2178 if(drawbuffer != 0)
\r
2180 return error(GL_INVALID_VALUE);
\r
2184 return error(GL_INVALID_ENUM);
\r
2190 void GL_APIENTRY glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
\r
2192 TRACE("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint *value = 0x%0.8p)",
\r
2193 buffer, drawbuffer, value);
\r
2198 if(drawbuffer > es2::IMPLEMENTATION_MAX_DRAW_BUFFERS)
\r
2200 return error(GL_INVALID_VALUE);
\r
2204 return error(GL_INVALID_ENUM);
\r
2210 void GL_APIENTRY glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
\r
2212 TRACE("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat *value = 0x%0.8p)",
\r
2213 buffer, drawbuffer, value);
\r
2218 if(drawbuffer > es2::IMPLEMENTATION_MAX_DRAW_BUFFERS)
\r
2220 return error(GL_INVALID_VALUE);
\r
2224 if(drawbuffer != 0)
\r
2226 return error(GL_INVALID_VALUE);
\r
2230 return error(GL_INVALID_ENUM);
\r
2236 void GL_APIENTRY glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
\r
2238 TRACE("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth = %f, GLint stencil = %d)",
\r
2239 buffer, drawbuffer, depth, stencil);
\r
2243 case GL_DEPTH_STENCIL:
\r
2244 if(drawbuffer != 0)
\r
2246 return error(GL_INVALID_VALUE);
\r
2250 return error(GL_INVALID_ENUM);
\r
2256 const GLubyte *GL_APIENTRY glGetStringi(GLenum name, GLuint index)
\r
2258 TRACE("(GLenum name = 0x%X, GLuint index = %d)", name, index);
\r
2260 es2::Context *context = es2::getContext();
\r
2263 GLuint numExtensions;
\r
2264 context->getExtensions(0, &numExtensions);
\r
2266 if(index >= numExtensions)
\r
2268 return error(GL_INVALID_VALUE, (GLubyte*)NULL);
\r
2273 case GL_EXTENSIONS:
\r
2274 return context->getExtensions(index);
\r
2276 return error(GL_INVALID_ENUM, (GLubyte*)NULL);
\r
2280 return (GLubyte*)NULL;
\r
2283 void GL_APIENTRY glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
\r
2285 TRACE("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
\r
2286 readTarget, writeTarget, readOffset, writeOffset, size);
\r
2288 switch(readTarget)
\r
2290 case GL_ARRAY_BUFFER:
\r
2291 case GL_COPY_READ_BUFFER:
\r
2292 case GL_COPY_WRITE_BUFFER:
\r
2293 case GL_ELEMENT_ARRAY_BUFFER:
\r
2294 case GL_PIXEL_PACK_BUFFER:
\r
2295 case GL_PIXEL_UNPACK_BUFFER:
\r
2296 case GL_TRANSFORM_FEEDBACK_BUFFER:
\r
2297 case GL_UNIFORM_BUFFER:
\r
2300 return error(GL_INVALID_ENUM);
\r
2303 switch(writeTarget)
\r
2305 case GL_ARRAY_BUFFER:
\r
2306 case GL_COPY_READ_BUFFER:
\r
2307 case GL_COPY_WRITE_BUFFER:
\r
2308 case GL_ELEMENT_ARRAY_BUFFER:
\r
2309 case GL_PIXEL_PACK_BUFFER:
\r
2310 case GL_PIXEL_UNPACK_BUFFER:
\r
2311 case GL_TRANSFORM_FEEDBACK_BUFFER:
\r
2312 case GL_UNIFORM_BUFFER:
\r
2315 return error(GL_INVALID_ENUM);
\r
2318 if(readOffset < 0 || writeOffset < 0 || size < 0)
\r
2320 return error(GL_INVALID_VALUE);
\r
2326 void GL_APIENTRY glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices)
\r
2328 TRACE("(GLuint program = %d, GLsizei uniformCount = %d, const GLchar *const*uniformNames = 0x%0.8p, GLuint *uniformIndices = 0x%0.8p)",
\r
2329 program, uniformCount, uniformNames, uniformIndices);
\r
2331 es2::Context *context = es2::getContext();
\r
2335 es2::Program *programObject = context->getProgram(program);
\r
2337 if(!programObject)
\r
2339 return error(GL_INVALID_OPERATION);
\r
2346 void GL_APIENTRY glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
\r
2348 TRACE("(GLuint program = %d, GLsizei uniformCount = %d, const GLchar *const*uniformNames = 0x%0.8p, GLenum pname = 0x%X, GLuint *uniformIndices = 0x%0.8p)",
\r
2349 program, uniformCount, uniformIndices, pname, uniformIndices);
\r
2353 case GL_UNIFORM_TYPE:
\r
2354 case GL_UNIFORM_SIZE:
\r
2355 case GL_UNIFORM_NAME_LENGTH:
\r
2356 case GL_UNIFORM_BLOCK_INDEX:
\r
2357 case GL_UNIFORM_OFFSET:
\r
2358 case GL_UNIFORM_ARRAY_STRIDE:
\r
2359 case GL_UNIFORM_MATRIX_STRIDE:
\r
2360 case GL_UNIFORM_IS_ROW_MAJOR:
\r
2363 return error(GL_INVALID_ENUM);
\r
2366 es2::Context *context = es2::getContext();
\r
2370 es2::Program *programObject = context->getProgram(program);
\r
2372 if(!programObject)
\r
2374 return error(GL_INVALID_OPERATION);
\r
2381 GLuint GL_APIENTRY glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
\r
2383 TRACE("(GLuint program = %d, const GLchar *uniformBlockName = 0x%0.8p)",
\r
2384 program, uniformBlockName);
\r
2386 es2::Context *context = es2::getContext();
\r
2390 es2::Program *programObject = context->getProgram(program);
\r
2392 if(!programObject)
\r
2394 return error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
\r
2399 return GL_INVALID_INDEX;
\r
2402 void GL_APIENTRY glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
\r
2404 TRACE("(GLuint program = %d, GLuint uniformBlockIndex = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)",
\r
2405 program, uniformBlockIndex, pname, params);
\r
2409 case GL_UNIFORM_BLOCK_BINDING:
\r
2410 case GL_UNIFORM_BLOCK_DATA_SIZE:
\r
2411 case GL_UNIFORM_BLOCK_NAME_LENGTH:
\r
2412 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
\r
2413 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
\r
2414 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
\r
2415 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
\r
2418 return error(GL_INVALID_ENUM);
\r
2421 es2::Context *context = es2::getContext();
\r
2425 es2::Program *program = context->getCurrentProgram();
\r
2429 return error(GL_INVALID_OPERATION);
\r
2436 void GL_APIENTRY glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
\r
2438 TRACE("(GLuint program = %d, GLuint uniformBlockIndex = %d, GLsizei bufSize = %d, GLsizei *length = 0x%0.8p, GLchar *uniformBlockName = 0x%0.8p)",
\r
2439 program, uniformBlockIndex, bufSize, length, uniformBlockName);
\r
2441 es2::Context *context = es2::getContext();
\r
2445 es2::Program *programObject = context->getProgram(program);
\r
2447 if(!programObject)
\r
2449 return error(GL_INVALID_OPERATION);
\r
2456 void GL_APIENTRY glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
\r
2458 TRACE("(GLuint program = %d, GLuint uniformBlockIndex = %d, GLuint uniformBlockBinding = %d)",
\r
2459 program, uniformBlockIndex, uniformBlockBinding);
\r
2461 es2::Context *context = es2::getContext();
\r
2465 es2::Program *programObject = context->getProgram(program);
\r
2467 if(!programObject)
\r
2469 return error(GL_INVALID_VALUE);
\r
2476 void GL_APIENTRY glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
\r
2478 TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instancecount = %d)",
\r
2479 mode, first, count, instancecount);
\r
2485 case GL_LINE_LOOP:
\r
2486 case GL_LINE_STRIP:
\r
2487 case GL_TRIANGLES:
\r
2488 case GL_TRIANGLE_FAN:
\r
2489 case GL_TRIANGLE_STRIP:
\r
2492 return error(GL_INVALID_ENUM);
\r
2495 if(count < 0 || instancecount < 0)
\r
2497 return error(GL_INVALID_VALUE);
\r
2500 es2::Context *context = es2::getContext();
\r
2504 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
\r
2505 if(transformFeedback && transformFeedback->isActive() && (mode != transformFeedback->primitiveMode()))
\r
2507 return error(GL_INVALID_OPERATION);
\r
2514 void GL_APIENTRY glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount)
\r
2516 TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const void *indices = 0x%0.8p, GLsizei instancecount = %d)",
\r
2517 mode, count, type, indices, instancecount);
\r
2523 case GL_LINE_LOOP:
\r
2524 case GL_LINE_STRIP:
\r
2525 case GL_TRIANGLES:
\r
2526 case GL_TRIANGLE_FAN:
\r
2527 case GL_TRIANGLE_STRIP:
\r
2530 return error(GL_INVALID_ENUM);
\r
2535 case GL_UNSIGNED_BYTE:
\r
2536 case GL_UNSIGNED_SHORT:
\r
2537 case GL_UNSIGNED_INT:
\r
2540 return error(GL_INVALID_ENUM);
\r
2543 if(count < 0 || instancecount < 0)
\r
2545 return error(GL_INVALID_VALUE);
\r
2548 es2::Context *context = es2::getContext();
\r
2552 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
\r
2553 if(transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
\r
2555 return error(GL_INVALID_OPERATION);
\r
2562 GLsync GL_APIENTRY glFenceSync(GLenum condition, GLbitfield flags)
\r
2564 TRACE("(GLenum condition = 0x%X, GLbitfield flags = %X)", condition, flags);
\r
2568 case GL_SYNC_GPU_COMMANDS_COMPLETE:
\r
2571 return error(GL_INVALID_ENUM, nullptr);
\r
2576 return error(GL_INVALID_VALUE, nullptr);
\r
2583 GLboolean GL_APIENTRY glIsSync(GLsync sync)
\r
2585 TRACE("(GLsync sync = 0x%0.8p)", sync);
\r
2591 void GL_APIENTRY glDeleteSync(GLsync sync)
\r
2593 TRACE("(GLsync sync = 0x%0.8p)", sync);
\r
2598 GLenum GL_APIENTRY glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
\r
2600 TRACE("(GLsync sync = 0x%0.8p, GLbitfield flags = %X, GLuint64 timeout = %llu)", sync, flags, timeout);
\r
2602 if((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
\r
2604 error(GL_INVALID_VALUE);
\r
2611 void GL_APIENTRY glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
\r
2613 TRACE("(GLsync sync = 0x%0.8p, GLbitfield flags = %X, GLuint64 timeout = %llu)", sync, flags, timeout);
\r
2617 return error(GL_INVALID_VALUE);
\r
2620 if(timeout != GL_TIMEOUT_IGNORED)
\r
2622 return error(GL_INVALID_VALUE);
\r
2628 void GL_APIENTRY glGetInteger64v(GLenum pname, GLint64 *data)
\r
2630 TRACE("(GLenum pname = 0x%X, GLint64 *data = 0x%0.8p)", pname, data);
\r
2634 void GL_APIENTRY glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
\r
2636 TRACE("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei *length = 0x%0.8p, GLint *values = 0x%0.8p)",
\r
2637 sync, pname, bufSize, length, values);
\r
2642 void GL_APIENTRY glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
\r
2644 TRACE("(GLenum target = 0x%X, GLuint index = %d, GLint64 *data = 0x%0.8p)", target, index, data);
\r
2648 void GL_APIENTRY glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
\r
2650 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64 *params = 0x%0.8p)", target, pname, params);
\r
2654 void GL_APIENTRY glGenSamplers(GLsizei count, GLuint *samplers)
\r
2656 TRACE("(GLsizei count = %d, GLuint *samplers = 0x%0.8p)", count, samplers);
\r
2660 return error(GL_INVALID_VALUE);
\r
2663 es2::Context *context = es2::getContext();
\r
2667 for(int i = 0; i < count; i++)
\r
2669 samplers[i] = context->createSampler();
\r
2674 void GL_APIENTRY glDeleteSamplers(GLsizei count, const GLuint *samplers)
\r
2676 TRACE("(GLsizei count = %d, GLuint *samplers = 0x%0.8p)", count, samplers);
\r
2680 return error(GL_INVALID_VALUE);
\r
2683 es2::Context *context = es2::getContext();
\r
2687 for(int i = 0; i < count; i++)
\r
2689 context->deleteSampler(samplers[i]);
\r
2694 GLboolean GL_APIENTRY glIsSampler(GLuint sampler)
\r
2696 TRACE("(GLuint sampler = %d)", sampler);
\r
2703 es2::Context *context = es2::getContext();
\r
2707 es2::Sampler *samplerObject = context->getSampler(sampler);
\r
2718 void GL_APIENTRY glBindSampler(GLuint unit, GLuint sampler)
\r
2720 TRACE("(GLuint unit = %d, GLuint sampler = %d)", unit, sampler);
\r
2722 if(unit >= es2::MAX_COMBINED_TEXTURE_IMAGE_UNITS)
\r
2724 return error(GL_INVALID_VALUE);
\r
2727 es2::Context *context = es2::getContext();
\r
2733 es2::Sampler *samplerObject = context->getSampler(sampler);
\r
2735 if(!samplerObject)
\r
2737 return error(GL_INVALID_OPERATION);
\r
2741 context->bindSampler(unit, sampler);
\r
2745 void GL_APIENTRY glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
\r
2747 TRACE("(GLuint sampler = %d, GLenum pname = 0x%X, GLint param = %d)",
\r
2748 sampler, pname, param);
\r
2750 glSamplerParameteriv(sampler, pname, ¶m);
\r
2753 void GL_APIENTRY glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
\r
2755 TRACE("(GLuint sampler = %d, GLenum pname = 0x%X, const GLint *param = 0x%0.8p)",
\r
2756 sampler, pname, param);
\r
2758 es2::Context *context = es2::getContext();
\r
2762 es2::Sampler *samplerObject = (sampler != 0) ? context->getSampler(sampler) : nullptr;
\r
2764 if(!samplerObject)
\r
2766 return error(GL_INVALID_VALUE);
\r
2771 case GL_TEXTURE_WRAP_S:
\r
2774 case GL_CLAMP_TO_EDGE:
\r
2775 case GL_MIRRORED_REPEAT:
\r
2777 samplerObject->mWrapModeS = *param;
\r
2780 return error(GL_INVALID_ENUM);
\r
2783 case GL_TEXTURE_WRAP_T:
\r
2786 case GL_CLAMP_TO_EDGE:
\r
2787 case GL_MIRRORED_REPEAT:
\r
2789 samplerObject->mWrapModeT = *param;
\r
2792 return error(GL_INVALID_ENUM);
\r
2795 case GL_TEXTURE_WRAP_R:
\r
2798 case GL_CLAMP_TO_EDGE:
\r
2799 case GL_MIRRORED_REPEAT:
\r
2801 samplerObject->mWrapModeR = *param;
\r
2804 return error(GL_INVALID_ENUM);
\r
2807 case GL_TEXTURE_MIN_FILTER:
\r
2812 case GL_NEAREST_MIPMAP_NEAREST:
\r
2813 case GL_LINEAR_MIPMAP_NEAREST:
\r
2814 case GL_NEAREST_MIPMAP_LINEAR:
\r
2815 case GL_LINEAR_MIPMAP_LINEAR:
\r
2816 samplerObject->mMinFilter = *param;
\r
2819 return error(GL_INVALID_ENUM);
\r
2822 case GL_TEXTURE_MAG_FILTER:
\r
2827 samplerObject->mMagFilter = *param;
\r
2830 return error(GL_INVALID_ENUM);
\r
2833 case GL_TEXTURE_MIN_LOD:
\r
2834 samplerObject->mMinLod = (GLfloat)*param;
\r
2836 case GL_TEXTURE_MAX_LOD:
\r
2837 samplerObject->mMaxLod = (GLfloat)*param;
\r
2839 case GL_TEXTURE_COMPARE_MODE:
\r
2842 case GL_COMPARE_REF_TO_TEXTURE:
\r
2844 samplerObject->mCompareMode = *param;
\r
2847 return error(GL_INVALID_ENUM);
\r
2850 case GL_TEXTURE_COMPARE_FUNC:
\r
2861 samplerObject->mCompareFunc = *param;
\r
2864 return error(GL_INVALID_ENUM);
\r
2868 return error(GL_INVALID_ENUM);
\r
2873 void GL_APIENTRY glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
\r
2875 TRACE("(GLuint sampler = %d, GLenum pname = 0x%X, GLfloat param = %f)",
\r
2876 sampler, pname, param);
\r
2878 glSamplerParameterfv(sampler, pname, ¶m);
\r
2881 void GL_APIENTRY glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
\r
2883 TRACE("(GLuint sampler = %d, GLenum pname = 0x%X, const GLfloat *param = 0x%0.8p)",
\r
2884 sampler, pname, param);
\r
2886 es2::Context *context = es2::getContext();
\r
2890 es2::Sampler *samplerObject = (sampler != 0) ? context->getSampler(sampler) : nullptr;
\r
2892 if(!samplerObject)
\r
2894 return error(GL_INVALID_VALUE);
\r
2899 case GL_TEXTURE_WRAP_S:
\r
2900 switch((GLenum)*param)
\r
2902 case GL_CLAMP_TO_EDGE:
\r
2903 case GL_MIRRORED_REPEAT:
\r
2905 samplerObject->mWrapModeS = (GLenum)*param;
\r
2908 return error(GL_INVALID_ENUM);
\r
2911 case GL_TEXTURE_WRAP_T:
\r
2912 switch((GLenum)*param)
\r
2914 case GL_CLAMP_TO_EDGE:
\r
2915 case GL_MIRRORED_REPEAT:
\r
2917 samplerObject->mWrapModeT = (GLenum)*param;
\r
2920 return error(GL_INVALID_ENUM);
\r
2923 case GL_TEXTURE_WRAP_R:
\r
2924 switch((GLenum)*param)
\r
2926 case GL_CLAMP_TO_EDGE:
\r
2927 case GL_MIRRORED_REPEAT:
\r
2929 samplerObject->mWrapModeR = (GLenum)*param;
\r
2932 return error(GL_INVALID_ENUM);
\r
2935 case GL_TEXTURE_MIN_FILTER:
\r
2936 switch((GLenum)*param)
\r
2940 case GL_NEAREST_MIPMAP_NEAREST:
\r
2941 case GL_LINEAR_MIPMAP_NEAREST:
\r
2942 case GL_NEAREST_MIPMAP_LINEAR:
\r
2943 case GL_LINEAR_MIPMAP_LINEAR:
\r
2944 samplerObject->mMinFilter = (GLenum)*param;
\r
2947 return error(GL_INVALID_ENUM);
\r
2950 case GL_TEXTURE_MAG_FILTER:
\r
2951 switch((GLenum)*param)
\r
2955 samplerObject->mMagFilter = (GLenum)*param;
\r
2958 return error(GL_INVALID_ENUM);
\r
2961 case GL_TEXTURE_MIN_LOD:
\r
2962 samplerObject->mMinLod = *param;
\r
2964 case GL_TEXTURE_MAX_LOD:
\r
2965 samplerObject->mMaxLod = *param;
\r
2967 case GL_TEXTURE_COMPARE_MODE:
\r
2968 switch((GLenum)*param)
\r
2970 case GL_COMPARE_REF_TO_TEXTURE:
\r
2972 samplerObject->mCompareMode = (GLenum)*param;
\r
2975 return error(GL_INVALID_ENUM);
\r
2978 case GL_TEXTURE_COMPARE_FUNC:
\r
2979 switch((GLenum)*param)
\r
2989 samplerObject->mCompareFunc = (GLenum)*param;
\r
2992 return error(GL_INVALID_ENUM);
\r
2996 return error(GL_INVALID_ENUM);
\r
3001 void GL_APIENTRY glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
\r
3003 TRACE("(GLuint sampler = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)",
\r
3004 sampler, pname, params);
\r
3006 es2::Context *context = es2::getContext();
\r
3010 es2::Sampler *samplerObject = (sampler != 0) ? context->getSampler(sampler) : nullptr;
\r
3012 if(!samplerObject)
\r
3014 return error(GL_INVALID_VALUE);
\r
3019 case GL_TEXTURE_WRAP_S:
\r
3020 *params = samplerObject->mWrapModeS;
\r
3022 case GL_TEXTURE_WRAP_T:
\r
3023 *params = samplerObject->mWrapModeT;
\r
3025 case GL_TEXTURE_WRAP_R:
\r
3026 *params = samplerObject->mWrapModeR;
\r
3028 case GL_TEXTURE_MIN_FILTER:
\r
3029 *params = samplerObject->mMinFilter;
\r
3031 case GL_TEXTURE_MAG_FILTER:
\r
3032 *params = samplerObject->mMagFilter;
\r
3034 case GL_TEXTURE_MIN_LOD:
\r
3035 *params = (GLint)samplerObject->mMinLod;
\r
3037 case GL_TEXTURE_MAX_LOD:
\r
3038 *params = (GLint)samplerObject->mMaxLod;
\r
3040 case GL_TEXTURE_COMPARE_MODE:
\r
3041 *params = samplerObject->mCompareMode;
\r
3043 case GL_TEXTURE_COMPARE_FUNC:
\r
3044 *params = samplerObject->mCompareFunc;
\r
3047 return error(GL_INVALID_ENUM);
\r
3052 void GL_APIENTRY glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
\r
3054 TRACE("(GLuint sampler = %d, GLenum pname = 0x%X, GLfloat *params = 0x%0.8p)",
\r
3055 sampler, pname, params);
\r
3057 es2::Context *context = es2::getContext();
\r
3061 es2::Sampler *samplerObject = (sampler != 0) ? context->getSampler(sampler) : nullptr;
\r
3063 if(!samplerObject)
\r
3065 return error(GL_INVALID_VALUE);
\r
3070 case GL_TEXTURE_WRAP_S:
\r
3071 *params = (GLfloat)samplerObject->mWrapModeS;
\r
3073 case GL_TEXTURE_WRAP_T:
\r
3074 *params = (GLfloat)samplerObject->mWrapModeT;
\r
3076 case GL_TEXTURE_WRAP_R:
\r
3077 *params = (GLfloat)samplerObject->mWrapModeR;
\r
3079 case GL_TEXTURE_MIN_FILTER:
\r
3080 *params = (GLfloat)samplerObject->mMinFilter;
\r
3082 case GL_TEXTURE_MAG_FILTER:
\r
3083 *params = (GLfloat)samplerObject->mMagFilter;
\r
3085 case GL_TEXTURE_MIN_LOD:
\r
3086 *params = samplerObject->mMinLod;
\r
3088 case GL_TEXTURE_MAX_LOD:
\r
3089 *params = samplerObject->mMaxLod;
\r
3091 case GL_TEXTURE_COMPARE_MODE:
\r
3092 *params = (GLfloat)samplerObject->mCompareMode;
\r
3094 case GL_TEXTURE_COMPARE_FUNC:
\r
3095 *params = (GLfloat)samplerObject->mCompareFunc;
\r
3098 return error(GL_INVALID_ENUM);
\r
3103 void GL_APIENTRY glVertexAttribDivisor(GLuint index, GLuint divisor)
\r
3105 TRACE("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
\r
3107 es2::Context *context = es2::getContext();
\r
3111 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
3113 return error(GL_INVALID_VALUE);
\r
3116 context->setVertexAttribDivisor(index, divisor);
\r
3120 void GL_APIENTRY glBindTransformFeedback(GLenum target, GLuint id)
\r
3122 TRACE("(GLenum target = 0x%X, GLuint id = %d)", target, id);
\r
3124 if(target != GL_TRANSFORM_FEEDBACK)
\r
3126 return error(GL_INVALID_ENUM);
\r
3129 es2::Context *context = es2::getContext();
\r
3133 es2::TransformFeedback *transformFeedbackObject = context->getTransformFeedback();
\r
3135 if(transformFeedbackObject && transformFeedbackObject->isActive() && !transformFeedbackObject->isPaused())
\r
3137 return error(GL_INVALID_OPERATION);
\r
3140 if(!context->bindTransformFeedback(id))
\r
3142 return error(GL_INVALID_OPERATION);
\r
3147 void GL_APIENTRY glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
\r
3149 TRACE("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
\r
3153 return error(GL_INVALID_VALUE);
\r
3156 es2::Context *context = es2::getContext();
\r
3160 for(int i = 0; i < n; i++)
\r
3164 context->deleteTransformFeedback(ids[i]);
\r
3170 void GL_APIENTRY glGenTransformFeedbacks(GLsizei n, GLuint *ids)
\r
3172 TRACE("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
\r
3176 return error(GL_INVALID_VALUE);
\r
3179 es2::Context *context = es2::getContext();
\r
3183 for(int i = 0; i < n; i++)
\r
3185 ids[i] = context->createTransformFeedback();
\r
3190 GLboolean GL_APIENTRY glIsTransformFeedback(GLuint id)
\r
3192 TRACE("(GLuint id = %d)", id);
\r
3199 es2::Context *context = es2::getContext();
\r
3203 es2::TransformFeedback *transformFeedbackObject = context->getTransformFeedback(id);
\r
3205 if(transformFeedbackObject)
\r
3214 void GL_APIENTRY glPauseTransformFeedback(void)
\r
3218 es2::Context *context = es2::getContext();
\r
3222 es2::TransformFeedback *transformFeedbackObject = context->getTransformFeedback();
\r
3224 if(transformFeedbackObject)
\r
3226 if(!transformFeedbackObject->isActive() || transformFeedbackObject->isPaused())
\r
3228 return error(GL_INVALID_OPERATION);
\r
3230 transformFeedbackObject->setPaused(true);
\r
3235 void GL_APIENTRY glResumeTransformFeedback(void)
\r
3239 es2::Context *context = es2::getContext();
\r
3243 es2::TransformFeedback *transformFeedbackObject = context->getTransformFeedback();
\r
3245 if(transformFeedbackObject)
\r
3247 if(!transformFeedbackObject->isActive() || !transformFeedbackObject->isPaused())
\r
3249 return error(GL_INVALID_OPERATION);
\r
3251 transformFeedbackObject->setPaused(false);
\r
3256 void GL_APIENTRY glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
\r
3258 TRACE("(GLuint program = %d, GLsizei bufSize = %d, GLsizei *length = 0x%0.8p, GLenum *binaryFormat = 0x%0.8p, void *binary = 0x%0.8p)",
\r
3259 program, bufSize, length, binaryFormat, binary);
\r
3264 void GL_APIENTRY glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
\r
3266 TRACE("(GLuint program = %d, GLenum binaryFormat = 0x%X, const void *binary = 0x%0.8p, GLsizei length = %d)",
\r
3267 program, binaryFormat, binaryFormat, length);
\r
3272 void GL_APIENTRY glProgramParameteri(GLuint program, GLenum pname, GLint value)
\r
3274 TRACE("(GLuint program = %d, GLenum pname = 0x%X, GLint value = %d)",
\r
3275 program, pname, value);
\r
3280 void GL_APIENTRY glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
\r
3282 TRACE("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum *attachments = 0x%0.8p)",
\r
3283 target, numAttachments, attachments);
\r
3288 void GL_APIENTRY glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
\r
3290 TRACE("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum *attachments = 0x%0.8p, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
\r
3291 target, numAttachments, attachments, x, y, width, height);
\r
3296 void GL_APIENTRY glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
\r
3298 TRACE("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
\r
3299 target, levels, internalformat, width, height);
\r
3304 void GL_APIENTRY glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
\r
3306 TRACE("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d)",
\r
3307 target, levels, internalformat, width, height, depth);
\r
3312 void GL_APIENTRY glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
\r
3314 TRACE("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, GLint *params = 0x%0.8p)",
\r
3315 target, internalformat, pname, bufSize, params);
\r