1 // SwiftShader Software Renderer
\r
3 // Copyright(c) 2005-2013 TransGaming 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 TransGaming 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 // libRAD.cpp: Implements the exported OpenGL ES 2.0 functions.
\r
14 #include "mathutil.h"
\r
15 #include "utilities.h"
\r
17 #include "Context.h"
\r
19 #include "Framebuffer.h"
\r
20 #include "Program.h"
\r
21 #include "Renderbuffer.h"
\r
23 #include "Texture.h"
\r
25 #include "common/debug.h"
\r
26 #include "Common/Version.h"
\r
27 #include "Main/Register.hpp"
\r
30 #include <GLES2/gl2.h>
\r
31 #include <GLES2/gl2ext.h>
\r
32 #include <RAD/rad.h>
\r
34 #include <exception>
\r
37 static bool validImageSize(GLint level, GLsizei width, GLsizei height)
\r
39 if(level < 0 || level >= rad::IMPLEMENTATION_MAX_TEXTURE_LEVELS || width < 0 || height < 0)
\r
47 static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei height, GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, rad::Texture *texture)
\r
51 return error(GL_INVALID_OPERATION, false);
\r
54 if(compressed != texture->isCompressed(target, level))
\r
56 return error(GL_INVALID_OPERATION, false);
\r
59 if(format != GL_NONE && format != texture->getFormat(target, level))
\r
61 return error(GL_INVALID_OPERATION, false);
\r
66 if((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
\r
67 (height % 4 != 0 && height != texture->getHeight(target, 0)))
\r
69 return error(GL_INVALID_OPERATION, false);
\r
73 if(xoffset + width > texture->getWidth(target, level) ||
\r
74 yoffset + height > texture->getHeight(target, level))
\r
76 return error(GL_INVALID_VALUE, false);
\r
82 // Check for combinations of format and type that are valid for ReadPixels
\r
83 static bool validReadFormatType(GLenum format, GLenum type)
\r
90 case GL_UNSIGNED_BYTE:
\r
99 case GL_UNSIGNED_BYTE:
\r
100 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
\r
101 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
\r
107 case rad::IMPLEMENTATION_COLOR_READ_FORMAT:
\r
110 case rad::IMPLEMENTATION_COLOR_READ_TYPE:
\r
126 void GL_APIENTRY glActiveTexture(GLenum texture)
\r
128 TRACE("(GLenum texture = 0x%X)", texture);
\r
132 rad::Context *context = rad::getContext();
\r
136 if(texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + rad::MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
\r
138 return error(GL_INVALID_ENUM);
\r
141 context->setActiveSampler(texture - GL_TEXTURE0);
\r
144 catch(std::bad_alloc&)
\r
146 return error(GL_OUT_OF_MEMORY);
\r
150 void GL_APIENTRY glAttachShader(GLuint program, GLuint shader)
\r
152 TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
\r
156 rad::Context *context = rad::getContext();
\r
160 rad::Program *programObject = context->getProgram(program);
\r
161 rad::Shader *shaderObject = context->getShader(shader);
\r
165 if(context->getShader(program))
\r
167 return error(GL_INVALID_OPERATION);
\r
171 return error(GL_INVALID_VALUE);
\r
177 if(context->getProgram(shader))
\r
179 return error(GL_INVALID_OPERATION);
\r
183 return error(GL_INVALID_VALUE);
\r
187 if(!programObject->attachShader(shaderObject))
\r
189 return error(GL_INVALID_OPERATION);
\r
193 catch(std::bad_alloc&)
\r
195 return error(GL_OUT_OF_MEMORY);
\r
199 void GL_APIENTRY glBeginQueryEXT(GLenum target, GLuint id)
\r
201 TRACE("(GLenum target = 0x%X, GLuint %d)", target, id);
\r
207 case GL_ANY_SAMPLES_PASSED_EXT:
\r
208 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
\r
211 return error(GL_INVALID_ENUM);
\r
216 return error(GL_INVALID_OPERATION);
\r
219 rad::Context *context = rad::getContext();
\r
223 context->beginQuery(target, id);
\r
226 catch(std::bad_alloc&)
\r
228 return error(GL_OUT_OF_MEMORY);
\r
232 void GL_APIENTRY glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
\r
234 TRACE("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
\r
238 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
240 return error(GL_INVALID_VALUE);
\r
243 rad::Context *context = rad::getContext();
\r
247 rad::Program *programObject = context->getProgram(program);
\r
251 if(context->getShader(program))
\r
253 return error(GL_INVALID_OPERATION);
\r
257 return error(GL_INVALID_VALUE);
\r
261 if(strncmp(name, "gl_", 3) == 0)
\r
263 return error(GL_INVALID_OPERATION);
\r
266 programObject->bindAttributeLocation(index, name);
\r
269 catch(std::bad_alloc&)
\r
271 return error(GL_OUT_OF_MEMORY);
\r
275 void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer)
\r
277 TRACE("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
\r
281 rad::Context *context = rad::getContext();
\r
287 case GL_ARRAY_BUFFER:
\r
288 context->bindArrayBuffer(buffer);
\r
290 case GL_ELEMENT_ARRAY_BUFFER:
\r
291 context->bindElementArrayBuffer(buffer);
\r
294 return error(GL_INVALID_ENUM);
\r
298 catch(std::bad_alloc&)
\r
300 return error(GL_OUT_OF_MEMORY);
\r
304 void GL_APIENTRY glBindFramebuffer(GLenum target, GLuint framebuffer)
\r
306 TRACE("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
\r
310 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
\r
312 return error(GL_INVALID_ENUM);
\r
315 rad::Context *context = rad::getContext();
\r
319 if(target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
\r
321 context->bindReadFramebuffer(framebuffer);
\r
324 if(target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
\r
326 context->bindDrawFramebuffer(framebuffer);
\r
330 catch(std::bad_alloc&)
\r
332 return error(GL_OUT_OF_MEMORY);
\r
336 void GL_APIENTRY glBindRenderbuffer(GLenum target, GLuint renderbuffer)
\r
338 TRACE("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
\r
342 if(target != GL_RENDERBUFFER)
\r
344 return error(GL_INVALID_ENUM);
\r
347 rad::Context *context = rad::getContext();
\r
351 if (renderbuffer != 0 && !context->getRenderbuffer(renderbuffer))
353 // [OpenGL ES 2.0.25] Section 4.4.3 page 112
\r
354 // [OpenGL ES 3.0.2] Section 4.4.2 page 201
\r
355 // 'renderbuffer' must be either zero or the name of an existing renderbuffer object of
\r
356 // type 'renderbuffertarget', otherwise an INVALID_OPERATION error is generated.
\r
357 return error(GL_INVALID_OPERATION);
360 context->bindRenderbuffer(renderbuffer);
\r
363 catch(std::bad_alloc&)
\r
365 return error(GL_OUT_OF_MEMORY);
\r
369 void GL_APIENTRY glBindTexture(GLenum target, GLuint texture)
\r
371 TRACE("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
\r
375 rad::Context *context = rad::getContext();
\r
379 rad::Texture *textureObject = context->getTexture(texture);
\r
381 if(textureObject && textureObject->getTarget() != target && texture != 0)
\r
383 return error(GL_INVALID_OPERATION);
\r
388 case GL_TEXTURE_2D:
\r
389 context->bindTexture2D(texture);
\r
391 case GL_TEXTURE_CUBE_MAP:
\r
392 context->bindTextureCubeMap(texture);
\r
394 case GL_TEXTURE_EXTERNAL_OES:
\r
395 context->bindTextureExternal(texture);
\r
398 return error(GL_INVALID_ENUM);
\r
402 catch(std::bad_alloc&)
\r
404 return error(GL_OUT_OF_MEMORY);
\r
408 void GL_APIENTRY glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
\r
410 TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
\r
411 red, green, blue, alpha);
\r
415 rad::Context* context = rad::getContext();
\r
419 context->setBlendColor(rad::clamp01(red), rad::clamp01(green), rad::clamp01(blue), rad::clamp01(alpha));
\r
422 catch(std::bad_alloc&)
\r
424 return error(GL_OUT_OF_MEMORY);
\r
428 void GL_APIENTRY glBlendEquation(GLenum mode)
\r
430 glBlendEquationSeparate(mode, mode);
\r
433 void GL_APIENTRY glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
\r
435 TRACE("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
\r
442 case GL_FUNC_SUBTRACT:
\r
443 case GL_FUNC_REVERSE_SUBTRACT:
\r
448 return error(GL_INVALID_ENUM);
\r
454 case GL_FUNC_SUBTRACT:
\r
455 case GL_FUNC_REVERSE_SUBTRACT:
\r
460 return error(GL_INVALID_ENUM);
\r
463 rad::Context *context = rad::getContext();
\r
467 context->setBlendEquation(modeRGB, modeAlpha);
\r
470 catch(std::bad_alloc&)
\r
472 return error(GL_OUT_OF_MEMORY);
\r
476 void GL_APIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor)
\r
478 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
\r
481 void GL_APIENTRY glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
\r
483 TRACE("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
\r
484 srcRGB, dstRGB, srcAlpha, dstAlpha);
\r
493 case GL_ONE_MINUS_SRC_COLOR:
\r
495 case GL_ONE_MINUS_DST_COLOR:
\r
497 case GL_ONE_MINUS_SRC_ALPHA:
\r
499 case GL_ONE_MINUS_DST_ALPHA:
\r
500 case GL_CONSTANT_COLOR:
\r
501 case GL_ONE_MINUS_CONSTANT_COLOR:
\r
502 case GL_CONSTANT_ALPHA:
\r
503 case GL_ONE_MINUS_CONSTANT_ALPHA:
\r
504 case GL_SRC_ALPHA_SATURATE:
\r
507 return error(GL_INVALID_ENUM);
\r
515 case GL_ONE_MINUS_SRC_COLOR:
\r
517 case GL_ONE_MINUS_DST_COLOR:
\r
519 case GL_ONE_MINUS_SRC_ALPHA:
\r
521 case GL_ONE_MINUS_DST_ALPHA:
\r
522 case GL_CONSTANT_COLOR:
\r
523 case GL_ONE_MINUS_CONSTANT_COLOR:
\r
524 case GL_CONSTANT_ALPHA:
\r
525 case GL_ONE_MINUS_CONSTANT_ALPHA:
\r
528 return error(GL_INVALID_ENUM);
\r
536 case GL_ONE_MINUS_SRC_COLOR:
\r
538 case GL_ONE_MINUS_DST_COLOR:
\r
540 case GL_ONE_MINUS_SRC_ALPHA:
\r
542 case GL_ONE_MINUS_DST_ALPHA:
\r
543 case GL_CONSTANT_COLOR:
\r
544 case GL_ONE_MINUS_CONSTANT_COLOR:
\r
545 case GL_CONSTANT_ALPHA:
\r
546 case GL_ONE_MINUS_CONSTANT_ALPHA:
\r
547 case GL_SRC_ALPHA_SATURATE:
\r
550 return error(GL_INVALID_ENUM);
\r
558 case GL_ONE_MINUS_SRC_COLOR:
\r
560 case GL_ONE_MINUS_DST_COLOR:
\r
562 case GL_ONE_MINUS_SRC_ALPHA:
\r
564 case GL_ONE_MINUS_DST_ALPHA:
\r
565 case GL_CONSTANT_COLOR:
\r
566 case GL_ONE_MINUS_CONSTANT_COLOR:
\r
567 case GL_CONSTANT_ALPHA:
\r
568 case GL_ONE_MINUS_CONSTANT_ALPHA:
\r
571 return error(GL_INVALID_ENUM);
\r
574 rad::Context *context = rad::getContext();
\r
578 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
\r
581 catch(std::bad_alloc&)
\r
583 return error(GL_OUT_OF_MEMORY);
\r
587 void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
\r
589 TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",
\r
590 target, size, data, usage);
\r
596 return error(GL_INVALID_VALUE);
\r
601 case GL_STREAM_DRAW:
\r
602 case GL_STATIC_DRAW:
\r
603 case GL_DYNAMIC_DRAW:
\r
606 return error(GL_INVALID_ENUM);
\r
609 rad::Context *context = rad::getContext();
\r
613 rad::Buffer *buffer;
\r
617 case GL_ARRAY_BUFFER:
\r
618 buffer = context->getArrayBuffer();
\r
620 case GL_ELEMENT_ARRAY_BUFFER:
\r
621 buffer = context->getElementArrayBuffer();
\r
624 return error(GL_INVALID_ENUM);
\r
629 return error(GL_INVALID_OPERATION);
\r
632 buffer->bufferData(data, size, usage);
\r
635 catch(std::bad_alloc&)
\r
637 return error(GL_OUT_OF_MEMORY);
\r
641 void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
\r
643 TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",
\r
644 target, offset, size, data);
\r
648 if(size < 0 || offset < 0)
\r
650 return error(GL_INVALID_VALUE);
\r
658 rad::Context *context = rad::getContext();
\r
662 rad::Buffer *buffer;
\r
666 case GL_ARRAY_BUFFER:
\r
667 buffer = context->getArrayBuffer();
\r
669 case GL_ELEMENT_ARRAY_BUFFER:
\r
670 buffer = context->getElementArrayBuffer();
\r
673 return error(GL_INVALID_ENUM);
\r
678 return error(GL_INVALID_OPERATION);
\r
681 if((size_t)size + offset > buffer->size())
\r
683 return error(GL_INVALID_VALUE);
\r
686 buffer->bufferSubData(data, size, offset);
\r
689 catch(std::bad_alloc&)
\r
691 return error(GL_OUT_OF_MEMORY);
\r
695 GLenum GL_APIENTRY glCheckFramebufferStatus(GLenum target)
\r
697 TRACE("(GLenum target = 0x%X)", target);
\r
701 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
\r
703 return error(GL_INVALID_ENUM, 0);
\r
706 rad::Context *context = rad::getContext();
\r
710 rad::Framebuffer *framebuffer = NULL;
\r
711 if(target == GL_READ_FRAMEBUFFER_ANGLE)
\r
713 framebuffer = context->getReadFramebuffer();
\r
717 framebuffer = context->getDrawFramebuffer();
\r
720 return framebuffer->completeness();
\r
723 catch(std::bad_alloc&)
\r
725 return error(GL_OUT_OF_MEMORY, 0);
\r
731 void GL_APIENTRY glClear(GLbitfield mask)
\r
733 TRACE("(GLbitfield mask = %X)", mask);
\r
737 if((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
\r
739 return error(GL_INVALID_VALUE);
\r
742 rad::Context *context = rad::getContext();
\r
746 context->clear(mask);
\r
749 catch(std::bad_alloc&)
\r
751 return error(GL_OUT_OF_MEMORY);
\r
755 void GL_APIENTRY glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
\r
757 TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
\r
758 red, green, blue, alpha);
\r
762 rad::Context *context = rad::getContext();
\r
766 context->setClearColor(red, green, blue, alpha);
\r
769 catch(std::bad_alloc&)
\r
771 return error(GL_OUT_OF_MEMORY);
\r
775 void GL_APIENTRY glClearDepthf(GLclampf depth)
\r
777 TRACE("(GLclampf depth = %f)", depth);
\r
781 rad::Context *context = rad::getContext();
\r
785 context->setClearDepth(depth);
\r
788 catch(std::bad_alloc&)
\r
790 return error(GL_OUT_OF_MEMORY);
\r
794 void GL_APIENTRY glClearStencil(GLint s)
\r
796 TRACE("(GLint s = %d)", s);
\r
800 rad::Context *context = rad::getContext();
\r
804 context->setClearStencil(s);
\r
807 catch(std::bad_alloc&)
\r
809 return error(GL_OUT_OF_MEMORY);
\r
813 void GL_APIENTRY glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
\r
815 TRACE("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",
\r
816 red, green, blue, alpha);
\r
820 rad::Context *context = rad::getContext();
\r
824 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
\r
827 catch(std::bad_alloc&)
\r
829 return error(GL_OUT_OF_MEMORY);
\r
833 void GL_APIENTRY glCompileShader(GLuint shader)
\r
835 TRACE("(GLuint shader = %d)", shader);
\r
839 rad::Context *context = rad::getContext();
\r
843 rad::Shader *shaderObject = context->getShader(shader);
\r
847 if(context->getProgram(shader))
\r
849 return error(GL_INVALID_OPERATION);
\r
853 return error(GL_INVALID_VALUE);
\r
857 shaderObject->compile();
\r
860 catch(std::bad_alloc&)
\r
862 return error(GL_OUT_OF_MEMORY);
\r
866 void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
\r
867 GLint border, GLsizei imageSize, const GLvoid* data)
\r
869 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
\r
870 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
\r
871 target, level, internalformat, width, height, border, imageSize, data);
\r
875 if(!validImageSize(level, width, height) || border != 0 || imageSize < 0)
\r
877 return error(GL_INVALID_VALUE);
\r
880 switch(internalformat)
\r
882 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
\r
883 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
\r
884 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
\r
885 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
\r
888 return error(GL_INVALID_ENUM);
\r
891 case GL_DEPTH_COMPONENT:
\r
892 case GL_DEPTH_COMPONENT16:
\r
893 case GL_DEPTH_COMPONENT32_OES:
\r
894 case GL_DEPTH_STENCIL_OES:
\r
895 case GL_DEPTH24_STENCIL8_OES:
\r
896 return error(GL_INVALID_OPERATION);
\r
898 return error(GL_INVALID_ENUM);
\r
903 return error(GL_INVALID_VALUE);
\r
906 rad::Context *context = rad::getContext();
\r
910 if(level > rad::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
\r
912 return error(GL_INVALID_VALUE);
\r
917 case GL_TEXTURE_2D:
\r
918 if(width > (rad::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
\r
919 height > (rad::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
\r
921 return error(GL_INVALID_VALUE);
\r
924 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
\r
925 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
\r
926 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
\r
927 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
\r
928 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
\r
929 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
\r
930 if(width != height)
\r
932 return error(GL_INVALID_VALUE);
\r
935 if(width > (rad::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) ||
\r
936 height > (rad::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level))
\r
938 return error(GL_INVALID_VALUE);
\r
942 return error(GL_INVALID_ENUM);
\r
945 if(imageSize != rad::ComputeCompressedSize(width, height, internalformat))
\r
947 return error(GL_INVALID_VALUE);
\r
950 if(target == GL_TEXTURE_2D)
\r
952 rad::Texture2D *texture = context->getTexture2D();
\r
956 return error(GL_INVALID_OPERATION);
\r
959 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
\r
963 rad::TextureCubeMap *texture = context->getTextureCubeMap();
\r
967 return error(GL_INVALID_OPERATION);
\r
972 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
\r
973 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
\r
974 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
\r
975 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
\r
976 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
\r
977 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
\r
978 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
\r
980 default: UNREACHABLE();
\r
985 catch(std::bad_alloc&)
\r
987 return error(GL_OUT_OF_MEMORY);
\r
991 void GL_APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
\r
992 GLenum format, GLsizei imageSize, const GLvoid* data)
\r
994 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
\r
995 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
\r
996 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
\r
997 target, level, xoffset, yoffset, width, height, format, imageSize, data);
\r
1001 if(!rad::IsTextureTarget(target))
\r
1003 return error(GL_INVALID_ENUM);
\r
1006 if(xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
\r
1008 return error(GL_INVALID_VALUE);
\r
1013 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
\r
1014 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
\r
1015 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
\r
1016 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
\r
1019 return error(GL_INVALID_ENUM);
\r
1023 return error(GL_INVALID_ENUM);
\r
1026 if(width == 0 || height == 0 || data == NULL)
\r
1031 rad::Context *context = rad::getContext();
\r
1035 if(level > rad::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
\r
1037 return error(GL_INVALID_VALUE);
\r
1040 if(imageSize != rad::ComputeCompressedSize(width, height, format))
\r
1042 return error(GL_INVALID_VALUE);
\r
1045 if(xoffset % 4 != 0 || yoffset % 4 != 0)
\r
1047 // We wait to check the offsets until this point, because the multiple-of-four restriction does not exist unless DXT1 textures are supported
\r
1048 return error(GL_INVALID_OPERATION);
\r
1051 if(target == GL_TEXTURE_2D)
\r
1053 rad::Texture2D *texture = context->getTexture2D();
\r
1055 if(validateSubImageParams(true, width, height, xoffset, yoffset, target, level, format, texture))
\r
1057 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
\r
1060 else if(rad::IsCubemapTextureTarget(target))
\r
1062 rad::TextureCubeMap *texture = context->getTextureCubeMap();
\r
1064 if(validateSubImageParams(true, width, height, xoffset, yoffset, target, level, format, texture))
\r
1066 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
\r
1075 catch(std::bad_alloc&)
\r
1077 return error(GL_OUT_OF_MEMORY);
\r
1081 void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
\r
1083 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
\r
1084 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
\r
1085 target, level, internalformat, x, y, width, height, border);
\r
1089 if(!validImageSize(level, width, height))
\r
1091 return error(GL_INVALID_VALUE);
\r
1096 return error(GL_INVALID_VALUE);
\r
1099 rad::Context *context = rad::getContext();
\r
1105 case GL_TEXTURE_2D:
\r
1106 if(width > (rad::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
\r
1107 height > (rad::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
\r
1109 return error(GL_INVALID_VALUE);
\r
1112 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
\r
1113 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
\r
1114 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
\r
1115 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
\r
1116 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
\r
1117 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
\r
1118 if(width != height)
\r
1120 return error(GL_INVALID_VALUE);
\r
1123 if(width > (rad::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) ||
\r
1124 height > (rad::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level))
\r
1126 return error(GL_INVALID_VALUE);
\r
1130 return error(GL_INVALID_ENUM);
\r
1133 rad::Framebuffer *framebuffer = context->getReadFramebuffer();
\r
1135 if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
\r
1137 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
\r
1140 if(context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() > 1)
\r
1142 return error(GL_INVALID_OPERATION);
\r
1145 rad::Renderbuffer *source = framebuffer->getColorbuffer();
\r
1146 GLenum colorbufferFormat = source->getFormat();
\r
1148 // [OpenGL ES 2.0.24] table 3.9
\r
1149 switch(internalformat)
\r
1152 if(colorbufferFormat != GL_ALPHA &&
\r
1153 colorbufferFormat != GL_RGBA &&
\r
1154 colorbufferFormat != GL_RGBA4 &&
\r
1155 colorbufferFormat != GL_RGB5_A1 &&
\r
1156 colorbufferFormat != GL_RGBA8_OES)
\r
1158 return error(GL_INVALID_OPERATION);
\r
1161 case GL_LUMINANCE:
\r
1163 if(colorbufferFormat != GL_RGB &&
\r
1164 colorbufferFormat != GL_RGB565 &&
\r
1165 colorbufferFormat != GL_RGB8_OES &&
\r
1166 colorbufferFormat != GL_RGBA &&
\r
1167 colorbufferFormat != GL_RGBA4 &&
\r
1168 colorbufferFormat != GL_RGB5_A1 &&
\r
1169 colorbufferFormat != GL_RGBA8_OES)
\r
1171 return error(GL_INVALID_OPERATION);
\r
1174 case GL_LUMINANCE_ALPHA:
\r
1176 if(colorbufferFormat != GL_RGBA &&
\r
1177 colorbufferFormat != GL_RGBA4 &&
\r
1178 colorbufferFormat != GL_RGB5_A1 &&
\r
1179 colorbufferFormat != GL_RGBA8_OES)
\r
1181 return error(GL_INVALID_OPERATION);
\r
1184 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
\r
1185 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
\r
1186 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
\r
1187 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
\r
1190 return error(GL_INVALID_OPERATION);
\r
1194 return error(GL_INVALID_ENUM);
\r
1198 return error(GL_INVALID_ENUM);
\r
1201 if(target == GL_TEXTURE_2D)
\r
1203 rad::Texture2D *texture = context->getTexture2D();
\r
1207 return error(GL_INVALID_OPERATION);
\r
1210 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
\r
1212 else if(rad::IsCubemapTextureTarget(target))
\r
1214 rad::TextureCubeMap *texture = context->getTextureCubeMap();
\r
1218 return error(GL_INVALID_OPERATION);
\r
1221 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
\r
1223 else UNREACHABLE();
\r
1226 catch(std::bad_alloc&)
\r
1228 return error(GL_OUT_OF_MEMORY);
\r
1232 void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
\r
1234 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
\r
1235 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
\r
1236 target, level, xoffset, yoffset, x, y, width, height);
\r
1240 if(!rad::IsTextureTarget(target))
\r
1242 return error(GL_INVALID_ENUM);
\r
1245 if(level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
\r
1247 return error(GL_INVALID_VALUE);
\r
1250 if(std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
\r
1252 return error(GL_INVALID_VALUE);
\r
1255 if(width == 0 || height == 0)
\r
1260 rad::Context *context = rad::getContext();
\r
1264 if(level > rad::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
\r
1266 return error(GL_INVALID_VALUE);
\r
1269 rad::Framebuffer *framebuffer = context->getReadFramebuffer();
\r
1271 if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
\r
1273 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
\r
1276 if(context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() > 1)
\r
1278 return error(GL_INVALID_OPERATION);
\r
1281 rad::Renderbuffer *source = framebuffer->getColorbuffer();
\r
1282 GLenum colorbufferFormat = source->getFormat();
\r
1283 rad::Texture *texture = NULL;
\r
1285 if(target == GL_TEXTURE_2D)
\r
1287 texture = context->getTexture2D();
\r
1289 else if(rad::IsCubemapTextureTarget(target))
\r
1291 texture = context->getTextureCubeMap();
\r
1293 else UNREACHABLE();
\r
1295 if(!validateSubImageParams(false, width, height, xoffset, yoffset, target, level, GL_NONE, texture))
\r
1300 GLenum textureFormat = texture->getFormat(target, level);
\r
1302 // [OpenGL ES 2.0.24] table 3.9
\r
1303 switch(textureFormat)
\r
1306 if(colorbufferFormat != GL_ALPHA &&
\r
1307 colorbufferFormat != GL_RGBA &&
\r
1308 colorbufferFormat != GL_RGBA4 &&
\r
1309 colorbufferFormat != GL_RGB5_A1 &&
\r
1310 colorbufferFormat != GL_RGBA8_OES)
\r
1312 return error(GL_INVALID_OPERATION);
\r
1315 case GL_LUMINANCE:
\r
1317 if(colorbufferFormat != GL_RGB &&
\r
1318 colorbufferFormat != GL_RGB565 &&
\r
1319 colorbufferFormat != GL_RGB8_OES &&
\r
1320 colorbufferFormat != GL_RGBA &&
\r
1321 colorbufferFormat != GL_RGBA4 &&
\r
1322 colorbufferFormat != GL_RGB5_A1 &&
\r
1323 colorbufferFormat != GL_RGBA8_OES)
\r
1325 return error(GL_INVALID_OPERATION);
\r
1328 case GL_LUMINANCE_ALPHA:
\r
1330 if(colorbufferFormat != GL_RGBA &&
\r
1331 colorbufferFormat != GL_RGBA4 &&
\r
1332 colorbufferFormat != GL_RGB5_A1 &&
\r
1333 colorbufferFormat != GL_RGBA8_OES)
\r
1335 return error(GL_INVALID_OPERATION);
\r
1338 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
\r
1339 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
\r
1340 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
\r
1341 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
\r
1342 return error(GL_INVALID_OPERATION);
\r
1343 case GL_DEPTH_COMPONENT:
\r
1344 case GL_DEPTH_STENCIL_OES:
\r
1345 return error(GL_INVALID_OPERATION);
\r
1347 return error(GL_INVALID_OPERATION);
\r
1350 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
\r
1354 catch(std::bad_alloc&)
\r
1356 return error(GL_OUT_OF_MEMORY);
\r
1360 GLuint GL_APIENTRY glCreateProgram(void)
\r
1366 rad::Context *context = rad::getContext();
\r
1370 return context->createProgram();
\r
1373 catch(std::bad_alloc&)
\r
1375 return error(GL_OUT_OF_MEMORY, 0);
\r
1381 GLuint GL_APIENTRY glCreateShader(GLenum type)
\r
1383 TRACE("(GLenum type = 0x%X)", type);
\r
1387 rad::Context *context = rad::getContext();
\r
1393 case GL_FRAGMENT_SHADER:
\r
1394 case GL_VERTEX_SHADER:
\r
1395 return context->createShader(type);
\r
1397 return error(GL_INVALID_ENUM, 0);
\r
1401 catch(std::bad_alloc&)
\r
1403 return error(GL_OUT_OF_MEMORY, 0);
\r
1409 void GL_APIENTRY glCullFace(GLenum mode)
\r
1411 TRACE("(GLenum mode = 0x%X)", mode);
\r
1419 case GL_FRONT_AND_BACK:
\r
1421 rad::Context *context = rad::getContext();
\r
1425 context->setCullMode(mode);
\r
1430 return error(GL_INVALID_ENUM);
\r
1433 catch(std::bad_alloc&)
\r
1435 return error(GL_OUT_OF_MEMORY);
\r
1439 void GL_APIENTRY glDeleteBuffers(GLsizei n, const GLuint* buffers)
\r
1441 TRACE("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
\r
1447 return error(GL_INVALID_VALUE);
\r
1450 rad::Context *context = rad::getContext();
\r
1454 for(int i = 0; i < n; i++)
\r
1456 context->deleteBuffer(buffers[i]);
\r
1460 catch(std::bad_alloc&)
\r
1462 return error(GL_OUT_OF_MEMORY);
\r
1466 void GL_APIENTRY glDeleteFencesNV(GLsizei n, const GLuint* fences)
\r
1468 TRACE("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
\r
1474 return error(GL_INVALID_VALUE);
\r
1477 rad::Context *context = rad::getContext();
\r
1481 for(int i = 0; i < n; i++)
\r
1483 context->deleteFence(fences[i]);
\r
1487 catch(std::bad_alloc&)
\r
1489 return error(GL_OUT_OF_MEMORY);
\r
1493 void GL_APIENTRY glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
\r
1495 TRACE("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
\r
1501 return error(GL_INVALID_VALUE);
\r
1504 rad::Context *context = rad::getContext();
\r
1508 for(int i = 0; i < n; i++)
\r
1510 if(framebuffers[i] != 0)
\r
1512 context->deleteFramebuffer(framebuffers[i]);
\r
1517 catch(std::bad_alloc&)
\r
1519 return error(GL_OUT_OF_MEMORY);
\r
1523 void GL_APIENTRY glDeleteProgram(GLuint program)
\r
1525 TRACE("(GLuint program = %d)", program);
\r
1534 rad::Context *context = rad::getContext();
\r
1538 if(!context->getProgram(program))
\r
1540 if(context->getShader(program))
\r
1542 return error(GL_INVALID_OPERATION);
\r
1546 return error(GL_INVALID_VALUE);
\r
1550 context->deleteProgram(program);
\r
1553 catch(std::bad_alloc&)
\r
1555 return error(GL_OUT_OF_MEMORY);
\r
1559 void GL_APIENTRY glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
\r
1561 TRACE("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
\r
1567 return error(GL_INVALID_VALUE);
\r
1570 rad::Context *context = rad::getContext();
\r
1574 for(int i = 0; i < n; i++)
\r
1576 context->deleteQuery(ids[i]);
\r
1580 catch(std::bad_alloc&)
\r
1582 return error(GL_OUT_OF_MEMORY);
\r
1586 void GL_APIENTRY glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
\r
1588 TRACE("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
\r
1594 return error(GL_INVALID_VALUE);
\r
1597 rad::Context *context = rad::getContext();
\r
1601 for(int i = 0; i < n; i++)
\r
1603 context->deleteRenderbuffer(renderbuffers[i]);
\r
1607 catch(std::bad_alloc&)
\r
1609 return error(GL_OUT_OF_MEMORY);
\r
1613 void GL_APIENTRY glDeleteShader(GLuint shader)
\r
1615 TRACE("(GLuint shader = %d)", shader);
\r
1624 rad::Context *context = rad::getContext();
\r
1628 if(!context->getShader(shader))
\r
1630 if(context->getProgram(shader))
\r
1632 return error(GL_INVALID_OPERATION);
\r
1636 return error(GL_INVALID_VALUE);
\r
1640 context->deleteShader(shader);
\r
1643 catch(std::bad_alloc&)
\r
1645 return error(GL_OUT_OF_MEMORY);
\r
1649 void GL_APIENTRY glDeleteTextures(GLsizei n, const GLuint* textures)
\r
1651 TRACE("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
\r
1657 return error(GL_INVALID_VALUE);
\r
1660 rad::Context *context = rad::getContext();
\r
1664 for(int i = 0; i < n; i++)
\r
1666 if(textures[i] != 0)
\r
1668 context->deleteTexture(textures[i]);
\r
1673 catch(std::bad_alloc&)
\r
1675 return error(GL_OUT_OF_MEMORY);
\r
1679 void GL_APIENTRY glDepthFunc(GLenum func)
\r
1681 TRACE("(GLenum func = 0x%X)", func);
\r
1697 return error(GL_INVALID_ENUM);
\r
1700 rad::Context *context = rad::getContext();
\r
1704 context->setDepthFunc(func);
\r
1707 catch(std::bad_alloc&)
\r
1709 return error(GL_OUT_OF_MEMORY);
\r
1713 void GL_APIENTRY glDepthMask(GLboolean flag)
\r
1715 TRACE("(GLboolean flag = %d)", flag);
\r
1719 rad::Context *context = rad::getContext();
\r
1723 context->setDepthMask(flag != GL_FALSE);
\r
1726 catch(std::bad_alloc&)
\r
1728 return error(GL_OUT_OF_MEMORY);
\r
1732 void GL_APIENTRY glDepthRangef(GLclampf zNear, GLclampf zFar)
\r
1734 TRACE("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
\r
1738 rad::Context *context = rad::getContext();
\r
1742 context->setDepthRange(zNear, zFar);
\r
1745 catch(std::bad_alloc&)
\r
1747 return error(GL_OUT_OF_MEMORY);
\r
1751 void GL_APIENTRY glDetachShader(GLuint program, GLuint shader)
\r
1753 TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
\r
1757 rad::Context *context = rad::getContext();
\r
1762 rad::Program *programObject = context->getProgram(program);
\r
1763 rad::Shader *shaderObject = context->getShader(shader);
\r
1765 if(!programObject)
\r
1767 rad::Shader *shaderByProgramHandle;
\r
1768 shaderByProgramHandle = context->getShader(program);
\r
1769 if(!shaderByProgramHandle)
\r
1771 return error(GL_INVALID_VALUE);
\r
1775 return error(GL_INVALID_OPERATION);
\r
1781 rad::Program *programByShaderHandle = context->getProgram(shader);
\r
1782 if(!programByShaderHandle)
\r
1784 return error(GL_INVALID_VALUE);
\r
1788 return error(GL_INVALID_OPERATION);
\r
1792 if(!programObject->detachShader(shaderObject))
\r
1794 return error(GL_INVALID_OPERATION);
\r
1798 catch(std::bad_alloc&)
\r
1800 return error(GL_OUT_OF_MEMORY);
\r
1804 void GL_APIENTRY glDisable(GLenum cap)
\r
1806 TRACE("(GLenum cap = 0x%X)", cap);
\r
1810 rad::Context *context = rad::getContext();
\r
1816 case GL_CULL_FACE: context->setCullFace(false); break;
\r
1817 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
\r
1818 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
\r
1819 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
\r
1820 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
\r
1821 case GL_STENCIL_TEST: context->setStencilTest(false); break;
\r
1822 case GL_DEPTH_TEST: context->setDepthTest(false); break;
\r
1823 case GL_BLEND: context->setBlend(false); break;
\r
1824 case GL_DITHER: context->setDither(false); break;
\r
1826 return error(GL_INVALID_ENUM);
\r
1830 catch(std::bad_alloc&)
\r
1832 return error(GL_OUT_OF_MEMORY);
\r
1836 void GL_APIENTRY glDisableVertexAttribArray(GLuint index)
\r
1838 TRACE("(GLuint index = %d)", index);
\r
1842 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
1844 return error(GL_INVALID_VALUE);
\r
1847 rad::Context *context = rad::getContext();
\r
1851 context->setEnableVertexAttribArray(index, false);
\r
1854 catch(std::bad_alloc&)
\r
1856 return error(GL_OUT_OF_MEMORY);
\r
1860 void GL_APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count)
\r
1862 TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
\r
1866 if(count < 0 || first < 0)
\r
1868 return error(GL_INVALID_VALUE);
\r
1871 rad::Context *context = rad::getContext();
\r
1875 context->drawArrays(mode, first, count);
\r
1878 catch(std::bad_alloc&)
\r
1880 return error(GL_OUT_OF_MEMORY);
\r
1884 void GL_APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
\r
1886 TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
\r
1887 mode, count, type, indices);
\r
1893 return error(GL_INVALID_VALUE);
\r
1896 rad::Context *context = rad::getContext();
\r
1902 case GL_UNSIGNED_BYTE:
\r
1903 case GL_UNSIGNED_SHORT:
\r
1904 case GL_UNSIGNED_INT:
\r
1907 return error(GL_INVALID_ENUM);
\r
1910 context->drawElements(mode, count, type, indices);
\r
1913 catch(std::bad_alloc&)
\r
1915 return error(GL_OUT_OF_MEMORY);
\r
1919 void GL_APIENTRY glEnable(GLenum cap)
\r
1921 TRACE("(GLenum cap = 0x%X)", cap);
\r
1925 rad::Context *context = rad::getContext();
\r
1931 case GL_CULL_FACE: context->setCullFace(true); break;
\r
1932 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
\r
1933 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
\r
1934 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
\r
1935 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
\r
1936 case GL_STENCIL_TEST: context->setStencilTest(true); break;
\r
1937 case GL_DEPTH_TEST: context->setDepthTest(true); break;
\r
1938 case GL_BLEND: context->setBlend(true); break;
\r
1939 case GL_DITHER: context->setDither(true); break;
\r
1941 return error(GL_INVALID_ENUM);
\r
1945 catch(std::bad_alloc&)
\r
1947 return error(GL_OUT_OF_MEMORY);
\r
1951 void GL_APIENTRY glEnableVertexAttribArray(GLuint index)
\r
1953 TRACE("(GLuint index = %d)", index);
\r
1957 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
1959 return error(GL_INVALID_VALUE);
\r
1962 rad::Context *context = rad::getContext();
\r
1966 context->setEnableVertexAttribArray(index, true);
\r
1969 catch(std::bad_alloc&)
\r
1971 return error(GL_OUT_OF_MEMORY);
\r
1975 void GL_APIENTRY glEndQueryEXT(GLenum target)
\r
1977 TRACE("GLenum target = 0x%X)", target);
\r
1983 case GL_ANY_SAMPLES_PASSED_EXT:
\r
1984 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
\r
1987 return error(GL_INVALID_ENUM);
\r
1990 rad::Context *context = rad::getContext();
\r
1994 context->endQuery(target);
\r
1997 catch(std::bad_alloc&)
\r
1999 return error(GL_OUT_OF_MEMORY);
\r
2003 void GL_APIENTRY glFinishFenceNV(GLuint fence)
\r
2005 TRACE("(GLuint fence = %d)", fence);
\r
2009 rad::Context *context = rad::getContext();
\r
2013 rad::Fence* fenceObject = context->getFence(fence);
\r
2015 if(fenceObject == NULL)
\r
2017 return error(GL_INVALID_OPERATION);
\r
2020 fenceObject->finishFence();
\r
2023 catch(std::bad_alloc&)
\r
2025 return error(GL_OUT_OF_MEMORY);
\r
2029 void GL_APIENTRY glFinish(void)
\r
2035 rad::Context *context = rad::getContext();
\r
2039 context->finish();
\r
2042 catch(std::bad_alloc&)
\r
2044 return error(GL_OUT_OF_MEMORY);
\r
2048 void GL_APIENTRY glFlush(void)
\r
2054 rad::Context *context = rad::getContext();
\r
2061 catch(std::bad_alloc&)
\r
2063 return error(GL_OUT_OF_MEMORY);
\r
2067 void GL_APIENTRY glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
\r
2069 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
\r
2070 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
\r
2074 if((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
\r
2075 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
\r
2077 return error(GL_INVALID_ENUM);
\r
2080 rad::Context *context = rad::getContext();
\r
2084 rad::Framebuffer *framebuffer = NULL;
\r
2085 GLuint framebufferHandle = 0;
\r
2086 if(target == GL_READ_FRAMEBUFFER_ANGLE)
\r
2088 framebuffer = context->getReadFramebuffer();
\r
2089 framebufferHandle = context->getReadFramebufferHandle();
\r
2093 framebuffer = context->getDrawFramebuffer();
\r
2094 framebufferHandle = context->getDrawFramebufferHandle();
\r
2097 if(!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
\r
2099 return error(GL_INVALID_OPERATION);
\r
2102 switch(attachment)
\r
2104 case GL_COLOR_ATTACHMENT0:
\r
2105 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
\r
2107 case GL_DEPTH_ATTACHMENT:
\r
2108 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
\r
2110 case GL_STENCIL_ATTACHMENT:
\r
2111 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
\r
2114 return error(GL_INVALID_ENUM);
\r
2118 catch(std::bad_alloc&)
\r
2120 return error(GL_OUT_OF_MEMORY);
\r
2124 void GL_APIENTRY glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
\r
2126 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
\r
2127 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
\r
2131 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
\r
2133 return error(GL_INVALID_ENUM);
\r
2136 switch(attachment)
\r
2138 case GL_COLOR_ATTACHMENT0:
\r
2139 case GL_DEPTH_ATTACHMENT:
\r
2140 case GL_STENCIL_ATTACHMENT:
\r
2143 return error(GL_INVALID_ENUM);
\r
2146 rad::Context *context = rad::getContext();
\r
2152 textarget = GL_NONE;
\r
2156 rad::Texture *tex = context->getTexture(texture);
\r
2160 return error(GL_INVALID_OPERATION);
\r
2163 if(tex->isCompressed(textarget, level))
\r
2165 return error(GL_INVALID_OPERATION);
\r
2170 case GL_TEXTURE_2D:
\r
2171 if(tex->getTarget() != GL_TEXTURE_2D)
\r
2173 return error(GL_INVALID_OPERATION);
\r
2177 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
\r
2178 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
\r
2179 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
\r
2180 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
\r
2181 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
\r
2182 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
\r
2183 if(tex->getTarget() != GL_TEXTURE_CUBE_MAP)
\r
2185 return error(GL_INVALID_OPERATION);
\r
2190 return error(GL_INVALID_ENUM);
\r
2195 return error(GL_INVALID_VALUE);
\r
2199 rad::Framebuffer *framebuffer = NULL;
\r
2200 GLuint framebufferHandle = 0;
\r
2201 if(target == GL_READ_FRAMEBUFFER_ANGLE)
\r
2203 framebuffer = context->getReadFramebuffer();
\r
2204 framebufferHandle = context->getReadFramebufferHandle();
\r
2208 framebuffer = context->getDrawFramebuffer();
\r
2209 framebufferHandle = context->getDrawFramebufferHandle();
\r
2212 if(framebufferHandle == 0 || !framebuffer)
\r
2214 return error(GL_INVALID_OPERATION);
\r
2217 switch(attachment)
\r
2219 case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;
\r
2220 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
\r
2221 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
\r
2225 catch(std::bad_alloc&)
\r
2227 return error(GL_OUT_OF_MEMORY);
\r
2231 void GL_APIENTRY glFrontFace(GLenum mode)
\r
2233 TRACE("(GLenum mode = 0x%X)", mode);
\r
2242 rad::Context *context = rad::getContext();
\r
2246 context->setFrontFace(mode);
\r
2251 return error(GL_INVALID_ENUM);
\r
2254 catch(std::bad_alloc&)
\r
2256 return error(GL_OUT_OF_MEMORY);
\r
2260 void GL_APIENTRY glGenBuffers(GLsizei n, GLuint* buffers)
\r
2262 TRACE("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
\r
2268 return error(GL_INVALID_VALUE);
\r
2271 rad::Context *context = rad::getContext();
\r
2275 for(int i = 0; i < n; i++)
\r
2277 buffers[i] = context->createBuffer();
\r
2281 catch(std::bad_alloc&)
\r
2283 return error(GL_OUT_OF_MEMORY);
\r
2287 void GL_APIENTRY glGenerateMipmap(GLenum target)
\r
2289 TRACE("(GLenum target = 0x%X)", target);
\r
2293 rad::Context *context = rad::getContext();
\r
2297 rad::Texture *texture;
\r
2301 case GL_TEXTURE_2D:
\r
2302 texture = context->getTexture2D();
\r
2304 case GL_TEXTURE_CUBE_MAP:
\r
2305 texture = context->getTextureCubeMap();
\r
2308 return error(GL_INVALID_ENUM);
\r
2311 if(texture->isCompressed(target, 0) || texture->isDepth(target, 0))
\r
2313 return error(GL_INVALID_OPERATION);
\r
2316 texture->generateMipmaps();
\r
2319 catch(std::bad_alloc&)
\r
2321 return error(GL_OUT_OF_MEMORY);
\r
2325 void GL_APIENTRY glGenFencesNV(GLsizei n, GLuint* fences)
\r
2327 TRACE("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
\r
2333 return error(GL_INVALID_VALUE);
\r
2336 rad::Context *context = rad::getContext();
\r
2340 for(int i = 0; i < n; i++)
\r
2342 fences[i] = context->createFence();
\r
2346 catch(std::bad_alloc&)
\r
2348 return error(GL_OUT_OF_MEMORY);
\r
2352 void GL_APIENTRY glGenFramebuffers(GLsizei n, GLuint* framebuffers)
\r
2354 TRACE("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
\r
2360 return error(GL_INVALID_VALUE);
\r
2363 rad::Context *context = rad::getContext();
\r
2367 for(int i = 0; i < n; i++)
\r
2369 framebuffers[i] = context->createFramebuffer();
\r
2373 catch(std::bad_alloc&)
\r
2375 return error(GL_OUT_OF_MEMORY);
\r
2379 void GL_APIENTRY glGenQueriesEXT(GLsizei n, GLuint* ids)
\r
2381 TRACE("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
\r
2387 return error(GL_INVALID_VALUE);
\r
2390 rad::Context *context = rad::getContext();
\r
2394 for(int i = 0; i < n; i++)
\r
2396 ids[i] = context->createQuery();
\r
2400 catch(std::bad_alloc&)
\r
2402 return error(GL_OUT_OF_MEMORY);
\r
2406 void GL_APIENTRY glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
\r
2408 TRACE("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
\r
2414 return error(GL_INVALID_VALUE);
\r
2417 rad::Context *context = rad::getContext();
\r
2421 for(int i = 0; i < n; i++)
\r
2423 renderbuffers[i] = context->createRenderbuffer();
\r
2427 catch(std::bad_alloc&)
\r
2429 return error(GL_OUT_OF_MEMORY);
\r
2433 void GL_APIENTRY glGenTextures(GLsizei n, GLuint* textures)
\r
2435 TRACE("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
\r
2441 return error(GL_INVALID_VALUE);
\r
2444 rad::Context *context = rad::getContext();
\r
2448 for(int i = 0; i < n; i++)
\r
2450 textures[i] = context->createTexture();
\r
2454 catch(std::bad_alloc&)
\r
2456 return error(GL_OUT_OF_MEMORY);
\r
2460 void GL_APIENTRY glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
\r
2462 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
\r
2463 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
\r
2464 program, index, bufsize, length, size, type, name);
\r
2470 return error(GL_INVALID_VALUE);
\r
2473 rad::Context *context = rad::getContext();
\r
2477 rad::Program *programObject = context->getProgram(program);
\r
2479 if(!programObject)
\r
2481 if(context->getShader(program))
\r
2483 return error(GL_INVALID_OPERATION);
\r
2487 return error(GL_INVALID_VALUE);
\r
2491 if(index >= (GLuint)programObject->getActiveAttributeCount())
\r
2493 return error(GL_INVALID_VALUE);
\r
2496 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
\r
2499 catch(std::bad_alloc&)
\r
2501 return error(GL_OUT_OF_MEMORY);
\r
2505 void GL_APIENTRY glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
\r
2507 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
\r
2508 "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
\r
2509 program, index, bufsize, length, size, type, name);
\r
2515 return error(GL_INVALID_VALUE);
\r
2518 rad::Context *context = rad::getContext();
\r
2522 rad::Program *programObject = context->getProgram(program);
\r
2524 if(!programObject)
\r
2526 if(context->getShader(program))
\r
2528 return error(GL_INVALID_OPERATION);
\r
2532 return error(GL_INVALID_VALUE);
\r
2536 if(index >= (GLuint)programObject->getActiveUniformCount())
\r
2538 return error(GL_INVALID_VALUE);
\r
2541 programObject->getActiveUniform(index, bufsize, length, size, type, name);
\r
2544 catch(std::bad_alloc&)
\r
2546 return error(GL_OUT_OF_MEMORY);
\r
2550 void GL_APIENTRY glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
\r
2552 TRACE("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
\r
2553 program, maxcount, count, shaders);
\r
2559 return error(GL_INVALID_VALUE);
\r
2562 rad::Context *context = rad::getContext();
\r
2566 rad::Program *programObject = context->getProgram(program);
\r
2568 if(!programObject)
\r
2570 if(context->getShader(program))
\r
2572 return error(GL_INVALID_OPERATION);
\r
2576 return error(GL_INVALID_VALUE);
\r
2580 return programObject->getAttachedShaders(maxcount, count, shaders);
\r
2583 catch(std::bad_alloc&)
\r
2585 return error(GL_OUT_OF_MEMORY);
\r
2589 int GL_APIENTRY glGetAttribLocation(GLuint program, const GLchar* name)
\r
2591 TRACE("(GLuint program = %d, const GLchar* name = %s)", program, name);
\r
2595 rad::Context *context = rad::getContext();
\r
2600 rad::Program *programObject = context->getProgram(program);
\r
2602 if(!programObject)
\r
2604 if(context->getShader(program))
\r
2606 return error(GL_INVALID_OPERATION, -1);
\r
2610 return error(GL_INVALID_VALUE, -1);
\r
2614 if(!programObject->isLinked())
\r
2616 return error(GL_INVALID_OPERATION, -1);
\r
2619 return programObject->getAttributeLocation(name);
\r
2622 catch(std::bad_alloc&)
\r
2624 return error(GL_OUT_OF_MEMORY, -1);
\r
2630 void GL_APIENTRY glGetBooleanv(GLenum pname, GLboolean* params)
\r
2632 TRACE("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
\r
2636 rad::Context *context = rad::getContext();
\r
2640 if(!(context->getBooleanv(pname, params)))
\r
2642 GLenum nativeType;
\r
2643 unsigned int numParams = 0;
\r
2644 if(!context->getQueryParameterInfo(pname, &nativeType, &numParams))
\r
2645 return error(GL_INVALID_ENUM);
\r
2647 if(numParams == 0)
\r
2648 return; // it is known that the pname is valid, but there are no parameters to return
\r
2650 if(nativeType == GL_FLOAT)
\r
2652 GLfloat *floatParams = NULL;
\r
2653 floatParams = new GLfloat[numParams];
\r
2655 context->getFloatv(pname, floatParams);
\r
2657 for(unsigned int i = 0; i < numParams; ++i)
\r
2659 if(floatParams[i] == 0.0f)
\r
2660 params[i] = GL_FALSE;
\r
2662 params[i] = GL_TRUE;
\r
2665 delete [] floatParams;
\r
2667 else if(nativeType == GL_INT)
\r
2669 GLint *intParams = NULL;
\r
2670 intParams = new GLint[numParams];
\r
2672 context->getIntegerv(pname, intParams);
\r
2674 for(unsigned int i = 0; i < numParams; ++i)
\r
2676 if(intParams[i] == 0)
\r
2677 params[i] = GL_FALSE;
\r
2679 params[i] = GL_TRUE;
\r
2682 delete [] intParams;
\r
2687 catch(std::bad_alloc&)
\r
2689 return error(GL_OUT_OF_MEMORY);
\r
2693 void GL_APIENTRY glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
\r
2695 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
\r
2699 rad::Context *context = rad::getContext();
\r
2703 rad::Buffer *buffer;
\r
2707 case GL_ARRAY_BUFFER:
\r
2708 buffer = context->getArrayBuffer();
\r
2710 case GL_ELEMENT_ARRAY_BUFFER:
\r
2711 buffer = context->getElementArrayBuffer();
\r
2713 default: return error(GL_INVALID_ENUM);
\r
2718 // A null buffer means that "0" is bound to the requested buffer target
\r
2719 return error(GL_INVALID_OPERATION);
\r
2724 case GL_BUFFER_USAGE:
\r
2725 *params = buffer->usage();
\r
2727 case GL_BUFFER_SIZE:
\r
2728 *params = buffer->size();
\r
2730 default: return error(GL_INVALID_ENUM);
\r
2734 catch(std::bad_alloc&)
\r
2736 return error(GL_OUT_OF_MEMORY);
\r
2740 GLenum GL_APIENTRY glGetError(void)
\r
2744 rad::Context *context = rad::getContext();
\r
2748 return context->getError();
\r
2751 return GL_NO_ERROR;
\r
2754 void GL_APIENTRY glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
\r
2756 TRACE("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
\r
2760 rad::Context *context = rad::getContext();
\r
2764 rad::Fence *fenceObject = context->getFence(fence);
\r
2766 if(fenceObject == NULL)
\r
2768 return error(GL_INVALID_OPERATION);
\r
2771 fenceObject->getFenceiv(pname, params);
\r
2774 catch(std::bad_alloc&)
\r
2776 return error(GL_OUT_OF_MEMORY);
\r
2780 void GL_APIENTRY glGetFloatv(GLenum pname, GLfloat* params)
\r
2782 TRACE("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
\r
2786 rad::Context *context = rad::getContext();
\r
2790 if(!(context->getFloatv(pname, params)))
\r
2792 GLenum nativeType;
\r
2793 unsigned int numParams = 0;
\r
2794 if(!context->getQueryParameterInfo(pname, &nativeType, &numParams))
\r
2795 return error(GL_INVALID_ENUM);
\r
2797 if(numParams == 0)
\r
2798 return; // it is known that the pname is valid, but that there are no parameters to return.
\r
2800 if(nativeType == GL_BOOL)
\r
2802 GLboolean *boolParams = NULL;
\r
2803 boolParams = new GLboolean[numParams];
\r
2805 context->getBooleanv(pname, boolParams);
\r
2807 for(unsigned int i = 0; i < numParams; ++i)
\r
2809 if(boolParams[i] == GL_FALSE)
\r
2815 delete [] boolParams;
\r
2817 else if(nativeType == GL_INT)
\r
2819 GLint *intParams = NULL;
\r
2820 intParams = new GLint[numParams];
\r
2822 context->getIntegerv(pname, intParams);
\r
2824 for(unsigned int i = 0; i < numParams; ++i)
\r
2826 params[i] = (GLfloat)intParams[i];
\r
2829 delete [] intParams;
\r
2834 catch(std::bad_alloc&)
\r
2836 return error(GL_OUT_OF_MEMORY);
\r
2840 void GL_APIENTRY glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
\r
2842 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
\r
2843 target, attachment, pname, params);
\r
2847 rad::Context *context = rad::getContext();
\r
2851 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
\r
2853 return error(GL_INVALID_ENUM);
\r
2856 rad::Framebuffer *framebuffer = NULL;
\r
2857 if(target == GL_READ_FRAMEBUFFER_ANGLE)
\r
2859 if(context->getReadFramebufferHandle() == 0)
\r
2861 return error(GL_INVALID_OPERATION);
\r
2864 framebuffer = context->getReadFramebuffer();
\r
2868 if(context->getDrawFramebufferHandle() == 0)
\r
2870 return error(GL_INVALID_OPERATION);
\r
2873 framebuffer = context->getDrawFramebuffer();
\r
2876 GLenum attachmentType;
\r
2877 GLuint attachmentHandle;
\r
2878 switch(attachment)
\r
2880 case GL_COLOR_ATTACHMENT0:
\r
2881 attachmentType = framebuffer->getColorbufferType();
\r
2882 attachmentHandle = framebuffer->getColorbufferHandle();
\r
2884 case GL_DEPTH_ATTACHMENT:
\r
2885 attachmentType = framebuffer->getDepthbufferType();
\r
2886 attachmentHandle = framebuffer->getDepthbufferHandle();
\r
2888 case GL_STENCIL_ATTACHMENT:
\r
2889 attachmentType = framebuffer->getStencilbufferType();
\r
2890 attachmentHandle = framebuffer->getStencilbufferHandle();
\r
2892 default: return error(GL_INVALID_ENUM);
\r
2895 GLenum attachmentObjectType; // Type category
\r
2896 if(attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
\r
2898 attachmentObjectType = attachmentType;
\r
2900 else if(rad::IsTextureTarget(attachmentType))
\r
2902 attachmentObjectType = GL_TEXTURE;
\r
2904 else UNREACHABLE();
\r
2908 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
\r
2909 *params = attachmentObjectType;
\r
2911 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
\r
2912 if(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
\r
2914 *params = attachmentHandle;
\r
2918 return error(GL_INVALID_ENUM);
\r
2921 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
\r
2922 if(attachmentObjectType == GL_TEXTURE)
\r
2924 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
\r
2928 return error(GL_INVALID_ENUM);
\r
2931 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
\r
2932 if(attachmentObjectType == GL_TEXTURE)
\r
2934 if(rad::IsCubemapTextureTarget(attachmentType))
\r
2936 *params = attachmentType;
\r
2945 return error(GL_INVALID_ENUM);
\r
2949 return error(GL_INVALID_ENUM);
\r
2953 catch(std::bad_alloc&)
\r
2955 return error(GL_OUT_OF_MEMORY);
\r
2959 GLenum GL_APIENTRY glGetGraphicsResetStatusEXT(void)
\r
2963 return GL_NO_ERROR;
\r
2966 void GL_APIENTRY glGetIntegerv(GLenum pname, GLint* params)
\r
2968 TRACE("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
\r
2972 rad::Context *context = rad::getContext();
\r
2976 if(!(context->getIntegerv(pname, params)))
\r
2978 GLenum nativeType;
\r
2979 unsigned int numParams = 0;
\r
2980 if(!context->getQueryParameterInfo(pname, &nativeType, &numParams))
\r
2981 return error(GL_INVALID_ENUM);
\r
2983 if(numParams == 0)
\r
2984 return; // it is known that pname is valid, but there are no parameters to return
\r
2986 if(nativeType == GL_BOOL)
\r
2988 GLboolean *boolParams = NULL;
\r
2989 boolParams = new GLboolean[numParams];
\r
2991 context->getBooleanv(pname, boolParams);
\r
2993 for(unsigned int i = 0; i < numParams; ++i)
\r
2995 if(boolParams[i] == GL_FALSE)
\r
3001 delete [] boolParams;
\r
3003 else if(nativeType == GL_FLOAT)
\r
3005 GLfloat *floatParams = NULL;
\r
3006 floatParams = new GLfloat[numParams];
\r
3008 context->getFloatv(pname, floatParams);
\r
3010 for(unsigned int i = 0; i < numParams; ++i)
\r
3012 if(pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
\r
3014 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
\r
3017 params[i] = (GLint)(floatParams[i] > 0.0f ? floor(floatParams[i] + 0.5) : ceil(floatParams[i] - 0.5));
\r
3020 delete [] floatParams;
\r
3025 catch(std::bad_alloc&)
\r
3027 return error(GL_OUT_OF_MEMORY);
\r
3031 void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint* params)
\r
3033 TRACE("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
\r
3037 rad::Context *context = rad::getContext();
\r
3041 rad::Program *programObject = context->getProgram(program);
\r
3043 if(!programObject)
\r
3045 return error(GL_INVALID_VALUE);
\r
3050 case GL_DELETE_STATUS:
\r
3051 *params = programObject->isFlaggedForDeletion();
\r
3053 case GL_LINK_STATUS:
\r
3054 *params = programObject->isLinked();
\r
3056 case GL_VALIDATE_STATUS:
\r
3057 *params = programObject->isValidated();
\r
3059 case GL_INFO_LOG_LENGTH:
\r
3060 *params = programObject->getInfoLogLength();
\r
3062 case GL_ATTACHED_SHADERS:
\r
3063 *params = programObject->getAttachedShadersCount();
\r
3065 case GL_ACTIVE_ATTRIBUTES:
\r
3066 *params = programObject->getActiveAttributeCount();
\r
3068 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
\r
3069 *params = programObject->getActiveAttributeMaxLength();
\r
3071 case GL_ACTIVE_UNIFORMS:
\r
3072 *params = programObject->getActiveUniformCount();
\r
3074 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
\r
3075 *params = programObject->getActiveUniformMaxLength();
\r
3078 return error(GL_INVALID_ENUM);
\r
3082 catch(std::bad_alloc&)
\r
3084 return error(GL_OUT_OF_MEMORY);
\r
3088 void GL_APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
\r
3090 TRACE("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
\r
3091 program, bufsize, length, infolog);
\r
3097 return error(GL_INVALID_VALUE);
\r
3100 rad::Context *context = rad::getContext();
\r
3104 rad::Program *programObject = context->getProgram(program);
\r
3106 if(!programObject)
\r
3108 return error(GL_INVALID_VALUE);
\r
3111 programObject->getInfoLog(bufsize, length, infolog);
\r
3114 catch(std::bad_alloc&)
\r
3116 return error(GL_OUT_OF_MEMORY);
\r
3120 void GL_APIENTRY glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
\r
3122 TRACE("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
\r
3128 case GL_CURRENT_QUERY_EXT:
\r
3131 return error(GL_INVALID_ENUM);
\r
3134 rad::Context *context = rad::getContext();
\r
3138 params[0] = context->getActiveQuery(target);
\r
3141 catch(std::bad_alloc&)
\r
3143 return error(GL_OUT_OF_MEMORY);
\r
3147 void GL_APIENTRY glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
\r
3149 TRACE("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
\r
3155 case GL_QUERY_RESULT_EXT:
\r
3156 case GL_QUERY_RESULT_AVAILABLE_EXT:
\r
3159 return error(GL_INVALID_ENUM);
\r
3162 rad::Context *context = rad::getContext();
\r
3166 rad::Query *queryObject = context->getQuery(id, false, GL_NONE);
\r
3170 return error(GL_INVALID_OPERATION);
\r
3173 if(context->getActiveQuery(queryObject->getType()) == id)
\r
3175 return error(GL_INVALID_OPERATION);
\r
3180 case GL_QUERY_RESULT_EXT:
\r
3181 params[0] = queryObject->getResult();
\r
3183 case GL_QUERY_RESULT_AVAILABLE_EXT:
\r
3184 params[0] = queryObject->isResultAvailable();
\r
3191 catch(std::bad_alloc&)
\r
3193 return error(GL_OUT_OF_MEMORY);
\r
3197 void GL_APIENTRY glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
\r
3199 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
\r
3203 rad::Context *context = rad::getContext();
\r
3207 if(target != GL_RENDERBUFFER)
\r
3209 return error(GL_INVALID_ENUM);
\r
3212 if(context->getRenderbufferHandle() == 0)
\r
3214 return error(GL_INVALID_OPERATION);
\r
3217 rad::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
\r
3221 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
\r
3222 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
\r
3223 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getFormat(); break;
\r
3224 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
\r
3225 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
\r
3226 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
\r
3227 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
\r
3228 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
\r
3229 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
\r
3230 case GL_RENDERBUFFER_SAMPLES_ANGLE: *params = renderbuffer->getSamples(); break;
\r
3232 return error(GL_INVALID_ENUM);
\r
3236 catch(std::bad_alloc&)
\r
3238 return error(GL_OUT_OF_MEMORY);
\r
3242 void GL_APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
\r
3244 TRACE("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
\r
3248 rad::Context *context = rad::getContext();
\r
3252 rad::Shader *shaderObject = context->getShader(shader);
\r
3256 return error(GL_INVALID_VALUE);
\r
3261 case GL_SHADER_TYPE:
\r
3262 *params = shaderObject->getType();
\r
3264 case GL_DELETE_STATUS:
\r
3265 *params = shaderObject->isFlaggedForDeletion();
\r
3267 case GL_COMPILE_STATUS:
\r
3268 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
\r
3270 case GL_INFO_LOG_LENGTH:
\r
3271 *params = shaderObject->getInfoLogLength();
\r
3273 case GL_SHADER_SOURCE_LENGTH:
\r
3274 *params = shaderObject->getSourceLength();
\r
3277 return error(GL_INVALID_ENUM);
\r
3281 catch(std::bad_alloc&)
\r
3283 return error(GL_OUT_OF_MEMORY);
\r
3287 void GL_APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
\r
3289 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
\r
3290 shader, bufsize, length, infolog);
\r
3296 return error(GL_INVALID_VALUE);
\r
3299 rad::Context *context = rad::getContext();
\r
3303 rad::Shader *shaderObject = context->getShader(shader);
\r
3307 return error(GL_INVALID_VALUE);
\r
3310 shaderObject->getInfoLog(bufsize, length, infolog);
\r
3313 catch(std::bad_alloc&)
\r
3315 return error(GL_OUT_OF_MEMORY);
\r
3319 void GL_APIENTRY glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
\r
3321 TRACE("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
\r
3322 shadertype, precisiontype, range, precision);
\r
3326 switch(shadertype)
\r
3328 case GL_VERTEX_SHADER:
\r
3329 case GL_FRAGMENT_SHADER:
\r
3332 return error(GL_INVALID_ENUM);
\r
3335 switch(precisiontype)
\r
3337 case GL_LOW_FLOAT:
\r
3338 case GL_MEDIUM_FLOAT:
\r
3339 case GL_HIGH_FLOAT:
\r
3340 // IEEE 754 single-precision
\r
3346 case GL_MEDIUM_INT:
\r
3348 // Single-precision floating-point numbers can accurately represent integers up to +/-16777216
\r
3354 return error(GL_INVALID_ENUM);
\r
3357 catch(std::bad_alloc&)
\r
3359 return error(GL_OUT_OF_MEMORY);
\r
3363 void GL_APIENTRY glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
\r
3365 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
\r
3366 shader, bufsize, length, source);
\r
3372 return error(GL_INVALID_VALUE);
\r
3375 rad::Context *context = rad::getContext();
\r
3379 rad::Shader *shaderObject = context->getShader(shader);
\r
3383 return error(GL_INVALID_OPERATION);
\r
3386 shaderObject->getSource(bufsize, length, source);
\r
3389 catch(std::bad_alloc&)
\r
3391 return error(GL_OUT_OF_MEMORY);
\r
3395 const GLubyte* GL_APIENTRY glGetString(GLenum name)
\r
3397 TRACE("(GLenum name = 0x%X)", name);
\r
3401 rad::Context *context = rad::getContext();
\r
3406 return (GLubyte*)"TransGaming Inc.";
\r
3408 return (GLubyte*)"SwiftShader";
\r
3410 return (GLubyte*)"OpenGL ES 2.0 SwiftShader "VERSION_STRING;
\r
3411 case GL_SHADING_LANGUAGE_VERSION:
\r
3412 return (GLubyte*)"OpenGL ES GLSL ES 1.00 SwiftShader "VERSION_STRING;
\r
3413 case GL_EXTENSIONS:
\r
3414 // Keep list sorted in following order:
\r
3417 // Vendor extensions
\r
3419 "GL_OES_depth_texture "
\r
3420 "GL_OES_depth_texture_cube_map "
\r
3421 "GL_OES_EGL_image "
\r
3422 "GL_OES_EGL_image_external "
\r
3423 "GL_OES_element_index_uint "
\r
3424 "GL_OES_packed_depth_stencil "
\r
3425 "GL_OES_rgb8_rgba8 "
\r
3426 "GL_OES_standard_derivatives "
\r
3427 "GL_OES_texture_float "
\r
3428 "GL_OES_texture_float_linear "
\r
3429 "GL_OES_texture_half_float "
\r
3430 "GL_OES_texture_half_float_linear "
\r
3431 "GL_OES_texture_npot "
\r
3432 "GL_EXT_blend_minmax "
\r
3433 "GL_EXT_occlusion_query_boolean "
\r
3434 "GL_EXT_read_format_bgra "
\r
3435 #if (S3TC_SUPPORT)
\r
3436 "GL_EXT_texture_compression_dxt1 "
\r
3437 "GL_ANGLE_texture_compression_dxt3 "
\r
3438 "GL_ANGLE_texture_compression_dxt5 "
\r
3440 "GL_EXT_texture_filter_anisotropic "
\r
3441 "GL_EXT_texture_format_BGRA8888 "
\r
3442 "GL_ANGLE_framebuffer_blit "
\r
3443 "GL_ANGLE_framebuffer_multisample "
\r
3446 return error(GL_INVALID_ENUM, (GLubyte*)NULL);
\r
3449 catch(std::bad_alloc&)
\r
3451 return error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
\r
3457 void GL_APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
\r
3459 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", target, pname, params);
\r
3463 rad::Context *context = rad::getContext();
\r
3467 rad::Texture *texture;
\r
3471 case GL_TEXTURE_2D:
\r
3472 texture = context->getTexture2D();
\r
3474 case GL_TEXTURE_CUBE_MAP:
\r
3475 texture = context->getTextureCubeMap();
\r
3477 case GL_TEXTURE_EXTERNAL_OES:
\r
3478 texture = context->getTextureExternal();
\r
3481 return error(GL_INVALID_ENUM);
\r
3486 case GL_TEXTURE_MAG_FILTER:
\r
3487 *params = (GLfloat)texture->getMagFilter();
\r
3489 case GL_TEXTURE_MIN_FILTER:
\r
3490 *params = (GLfloat)texture->getMinFilter();
\r
3492 case GL_TEXTURE_WRAP_S:
\r
3493 *params = (GLfloat)texture->getWrapS();
\r
3495 case GL_TEXTURE_WRAP_T:
\r
3496 *params = (GLfloat)texture->getWrapT();
\r
3498 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
\r
3499 *params = texture->getMaxAnisotropy();
\r
3501 case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
\r
3502 *params = (GLfloat)1;
\r
3505 return error(GL_INVALID_ENUM);
\r
3509 catch(std::bad_alloc&)
\r
3511 return error(GL_OUT_OF_MEMORY);
\r
3515 void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
\r
3517 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
\r
3521 rad::Context *context = rad::getContext();
\r
3525 rad::Texture *texture;
\r
3529 case GL_TEXTURE_2D:
\r
3530 texture = context->getTexture2D();
\r
3532 case GL_TEXTURE_CUBE_MAP:
\r
3533 texture = context->getTextureCubeMap();
\r
3535 case GL_TEXTURE_EXTERNAL_OES:
\r
3536 texture = context->getTextureExternal();
\r
3539 return error(GL_INVALID_ENUM);
\r
3544 case GL_TEXTURE_MAG_FILTER:
\r
3545 *params = texture->getMagFilter();
\r
3547 case GL_TEXTURE_MIN_FILTER:
\r
3548 *params = texture->getMinFilter();
\r
3550 case GL_TEXTURE_WRAP_S:
\r
3551 *params = texture->getWrapS();
\r
3553 case GL_TEXTURE_WRAP_T:
\r
3554 *params = texture->getWrapT();
\r
3556 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
\r
3557 *params = (GLint)texture->getMaxAnisotropy();
\r
3559 case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
\r
3563 return error(GL_INVALID_ENUM);
\r
3567 catch(std::bad_alloc&)
\r
3569 return error(GL_OUT_OF_MEMORY);
\r
3573 void GL_APIENTRY glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
\r
3575 TRACE("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
\r
3576 program, location, bufSize, params);
\r
3582 return error(GL_INVALID_VALUE);
\r
3585 rad::Context *context = rad::getContext();
\r
3591 return error(GL_INVALID_VALUE);
\r
3594 rad::Program *programObject = context->getProgram(program);
\r
3596 if(!programObject || !programObject->isLinked())
\r
3598 return error(GL_INVALID_OPERATION);
\r
3601 if(!programObject->getUniformfv(location, &bufSize, params))
\r
3603 return error(GL_INVALID_OPERATION);
\r
3607 catch(std::bad_alloc&)
\r
3609 return error(GL_OUT_OF_MEMORY);
\r
3613 void GL_APIENTRY glGetUniformfv(GLuint program, GLint location, GLfloat* params)
\r
3615 TRACE("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
\r
3619 rad::Context *context = rad::getContext();
\r
3625 return error(GL_INVALID_VALUE);
\r
3628 rad::Program *programObject = context->getProgram(program);
\r
3630 if(!programObject || !programObject->isLinked())
\r
3632 return error(GL_INVALID_OPERATION);
\r
3635 if(!programObject->getUniformfv(location, NULL, params))
\r
3637 return error(GL_INVALID_OPERATION);
\r
3641 catch(std::bad_alloc&)
\r
3643 return error(GL_OUT_OF_MEMORY);
\r
3647 void GL_APIENTRY glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
\r
3649 TRACE("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
\r
3650 program, location, bufSize, params);
\r
3656 return error(GL_INVALID_VALUE);
\r
3659 rad::Context *context = rad::getContext();
\r
3665 return error(GL_INVALID_VALUE);
\r
3668 rad::Program *programObject = context->getProgram(program);
\r
3670 if(!programObject || !programObject->isLinked())
\r
3672 return error(GL_INVALID_OPERATION);
\r
3675 if(!programObject)
\r
3677 return error(GL_INVALID_OPERATION);
\r
3680 if(!programObject->getUniformiv(location, &bufSize, params))
\r
3682 return error(GL_INVALID_OPERATION);
\r
3686 catch(std::bad_alloc&)
\r
3688 return error(GL_OUT_OF_MEMORY);
\r
3692 void GL_APIENTRY glGetUniformiv(GLuint program, GLint location, GLint* params)
\r
3694 TRACE("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
\r
3698 rad::Context *context = rad::getContext();
\r
3704 return error(GL_INVALID_VALUE);
\r
3707 rad::Program *programObject = context->getProgram(program);
\r
3709 if(!programObject || !programObject->isLinked())
\r
3711 return error(GL_INVALID_OPERATION);
\r
3714 if(!programObject)
\r
3716 return error(GL_INVALID_OPERATION);
\r
3719 if(!programObject->getUniformiv(location, NULL, params))
\r
3721 return error(GL_INVALID_OPERATION);
\r
3725 catch(std::bad_alloc&)
\r
3727 return error(GL_OUT_OF_MEMORY);
\r
3731 int GL_APIENTRY glGetUniformLocation(GLuint program, const GLchar* name)
\r
3733 TRACE("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
\r
3737 rad::Context *context = rad::getContext();
\r
3739 if(strstr(name, "gl_") == name)
\r
3746 rad::Program *programObject = context->getProgram(program);
\r
3748 if(!programObject)
\r
3750 if(context->getShader(program))
\r
3752 return error(GL_INVALID_OPERATION, -1);
\r
3756 return error(GL_INVALID_VALUE, -1);
\r
3760 if(!programObject->isLinked())
\r
3762 return error(GL_INVALID_OPERATION, -1);
\r
3765 return programObject->getUniformLocation(name);
\r
3768 catch(std::bad_alloc&)
\r
3770 return error(GL_OUT_OF_MEMORY, -1);
\r
3776 void GL_APIENTRY glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
\r
3778 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
\r
3782 rad::Context *context = rad::getContext();
\r
3786 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
3788 return error(GL_INVALID_VALUE);
\r
3791 const rad::VertexAttribute &attribState = context->getVertexAttribState(index);
\r
3795 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
\r
3796 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
\r
3798 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
\r
3799 *params = (GLfloat)attribState.mSize;
\r
3801 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
\r
3802 *params = (GLfloat)attribState.mStride;
\r
3804 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
\r
3805 *params = (GLfloat)attribState.mType;
\r
3807 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
\r
3808 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
\r
3810 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
\r
3811 *params = (GLfloat)attribState.mBoundBuffer.id();
\r
3813 case GL_CURRENT_VERTEX_ATTRIB:
\r
3814 for(int i = 0; i < 4; ++i)
\r
3816 params[i] = attribState.mCurrentValue[i];
\r
3819 default: return error(GL_INVALID_ENUM);
\r
3823 catch(std::bad_alloc&)
\r
3825 return error(GL_OUT_OF_MEMORY);
\r
3829 void GL_APIENTRY glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
\r
3831 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
\r
3835 rad::Context *context = rad::getContext();
\r
3839 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
3841 return error(GL_INVALID_VALUE);
\r
3844 const rad::VertexAttribute &attribState = context->getVertexAttribState(index);
\r
3848 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
\r
3849 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
\r
3851 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
\r
3852 *params = attribState.mSize;
\r
3854 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
\r
3855 *params = attribState.mStride;
\r
3857 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
\r
3858 *params = attribState.mType;
\r
3860 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
\r
3861 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
\r
3863 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
\r
3864 *params = attribState.mBoundBuffer.id();
\r
3866 case GL_CURRENT_VERTEX_ATTRIB:
\r
3867 for(int i = 0; i < 4; ++i)
\r
3869 float currentValue = attribState.mCurrentValue[i];
\r
3870 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
\r
3873 default: return error(GL_INVALID_ENUM);
\r
3877 catch(std::bad_alloc&)
\r
3879 return error(GL_OUT_OF_MEMORY);
\r
3883 void GL_APIENTRY glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
\r
3885 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
\r
3889 rad::Context *context = rad::getContext();
\r
3893 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
3895 return error(GL_INVALID_VALUE);
\r
3898 if(pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
\r
3900 return error(GL_INVALID_ENUM);
\r
3903 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
\r
3906 catch(std::bad_alloc&)
\r
3908 return error(GL_OUT_OF_MEMORY);
\r
3912 void GL_APIENTRY glHint(GLenum target, GLenum mode)
\r
3914 TRACE("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
\r
3922 case GL_DONT_CARE:
\r
3925 return error(GL_INVALID_ENUM);
\r
3928 rad::Context *context = rad::getContext();
\r
3931 case GL_GENERATE_MIPMAP_HINT:
\r
3932 if(context) context->setGenerateMipmapHint(mode);
\r
3934 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
\r
3935 if(context) context->setFragmentShaderDerivativeHint(mode);
\r
3938 return error(GL_INVALID_ENUM);
\r
3941 catch(std::bad_alloc&)
\r
3943 return error(GL_OUT_OF_MEMORY);
\r
3947 GLboolean GL_APIENTRY glIsBuffer(GLuint buffer)
\r
3949 TRACE("(GLuint buffer = %d)", buffer);
\r
3953 rad::Context *context = rad::getContext();
\r
3955 if(context && buffer)
\r
3957 rad::Buffer *bufferObject = context->getBuffer(buffer);
\r
3965 catch(std::bad_alloc&)
\r
3967 return error(GL_OUT_OF_MEMORY, GL_FALSE);
\r
3973 GLboolean GL_APIENTRY glIsEnabled(GLenum cap)
\r
3975 TRACE("(GLenum cap = 0x%X)", cap);
\r
3979 rad::Context *context = rad::getContext();
\r
3985 case GL_CULL_FACE: return context->isCullFaceEnabled();
\r
3986 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
\r
3987 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
\r
3988 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
\r
3989 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
\r
3990 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
\r
3991 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
\r
3992 case GL_BLEND: return context->isBlendEnabled();
\r
3993 case GL_DITHER: return context->isDitherEnabled();
\r
3995 return error(GL_INVALID_ENUM, false);
\r
3999 catch(std::bad_alloc&)
\r
4001 return error(GL_OUT_OF_MEMORY, false);
\r
4007 GLboolean GL_APIENTRY glIsFenceNV(GLuint fence)
\r
4009 TRACE("(GLuint fence = %d)", fence);
\r
4013 rad::Context *context = rad::getContext();
\r
4017 rad::Fence *fenceObject = context->getFence(fence);
\r
4019 if(fenceObject == NULL)
\r
4024 return fenceObject->isFence();
\r
4027 catch(std::bad_alloc&)
\r
4029 return error(GL_OUT_OF_MEMORY, GL_FALSE);
\r
4035 GLboolean GL_APIENTRY glIsFramebuffer(GLuint framebuffer)
\r
4037 TRACE("(GLuint framebuffer = %d)", framebuffer);
\r
4041 rad::Context *context = rad::getContext();
\r
4043 if(context && framebuffer)
\r
4045 rad::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
\r
4047 if(framebufferObject)
\r
4053 catch(std::bad_alloc&)
\r
4055 return error(GL_OUT_OF_MEMORY, GL_FALSE);
\r
4061 GLboolean GL_APIENTRY glIsProgram(GLuint program)
\r
4063 TRACE("(GLuint program = %d)", program);
\r
4067 rad::Context *context = rad::getContext();
\r
4069 if(context && program)
\r
4071 rad::Program *programObject = context->getProgram(program);
\r
4079 catch(std::bad_alloc&)
\r
4081 return error(GL_OUT_OF_MEMORY, GL_FALSE);
\r
4087 GLboolean GL_APIENTRY glIsQueryEXT(GLuint id)
\r
4089 TRACE("(GLuint id = %d)", id);
\r
4098 rad::Context *context = rad::getContext();
\r
4102 rad::Query *queryObject = context->getQuery(id, false, GL_NONE);
\r
4110 catch(std::bad_alloc&)
\r
4112 return error(GL_OUT_OF_MEMORY, GL_FALSE);
\r
4118 GLboolean GL_APIENTRY glIsRenderbuffer(GLuint renderbuffer)
\r
4120 TRACE("(GLuint renderbuffer = %d)", renderbuffer);
\r
4124 rad::Context *context = rad::getContext();
\r
4126 if(context && renderbuffer)
\r
4128 rad::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
\r
4130 if(renderbufferObject)
\r
4136 catch(std::bad_alloc&)
\r
4138 return error(GL_OUT_OF_MEMORY, GL_FALSE);
\r
4144 GLboolean GL_APIENTRY glIsShader(GLuint shader)
\r
4146 TRACE("(GLuint shader = %d)", shader);
\r
4150 rad::Context *context = rad::getContext();
\r
4152 if(context && shader)
\r
4154 rad::Shader *shaderObject = context->getShader(shader);
\r
4162 catch(std::bad_alloc&)
\r
4164 return error(GL_OUT_OF_MEMORY, GL_FALSE);
\r
4170 GLboolean GL_APIENTRY glIsTexture(GLuint texture)
\r
4172 TRACE("(GLuint texture = %d)", texture);
\r
4176 rad::Context *context = rad::getContext();
\r
4178 if(context && texture)
\r
4180 rad::Texture *textureObject = context->getTexture(texture);
\r
4188 catch(std::bad_alloc&)
\r
4190 return error(GL_OUT_OF_MEMORY, GL_FALSE);
\r
4196 void GL_APIENTRY glLineWidth(GLfloat width)
\r
4198 TRACE("(GLfloat width = %f)", width);
\r
4204 return error(GL_INVALID_VALUE);
\r
4207 rad::Context *context = rad::getContext();
\r
4211 context->setLineWidth(width);
\r
4214 catch(std::bad_alloc&)
\r
4216 return error(GL_OUT_OF_MEMORY);
\r
4220 void GL_APIENTRY glLinkProgram(GLuint program)
\r
4222 TRACE("(GLuint program = %d)", program);
\r
4226 rad::Context *context = rad::getContext();
\r
4230 rad::Program *programObject = context->getProgram(program);
\r
4232 if(!programObject)
\r
4234 if(context->getShader(program))
\r
4236 return error(GL_INVALID_OPERATION);
\r
4240 return error(GL_INVALID_VALUE);
\r
4244 programObject->link();
\r
4247 catch(std::bad_alloc&)
\r
4249 return error(GL_OUT_OF_MEMORY);
\r
4253 void GL_APIENTRY glPixelStorei(GLenum pname, GLint param)
\r
4255 TRACE("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
\r
4259 rad::Context *context = rad::getContext();
\r
4265 case GL_UNPACK_ALIGNMENT:
\r
4266 if(param != 1 && param != 2 && param != 4 && param != 8)
\r
4268 return error(GL_INVALID_VALUE);
\r
4271 context->setUnpackAlignment(param);
\r
4274 case GL_PACK_ALIGNMENT:
\r
4275 if(param != 1 && param != 2 && param != 4 && param != 8)
\r
4277 return error(GL_INVALID_VALUE);
\r
4280 context->setPackAlignment(param);
\r
4284 return error(GL_INVALID_ENUM);
\r
4288 catch(std::bad_alloc&)
\r
4290 return error(GL_OUT_OF_MEMORY);
\r
4294 void GL_APIENTRY glPolygonOffset(GLfloat factor, GLfloat units)
\r
4296 TRACE("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
\r
4300 rad::Context *context = rad::getContext();
\r
4304 context->setPolygonOffsetParams(factor, units);
\r
4307 catch(std::bad_alloc&)
\r
4309 return error(GL_OUT_OF_MEMORY);
\r
4313 void GL_APIENTRY glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
\r
4314 GLenum format, GLenum type, GLsizei bufSize,
\r
4317 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
\r
4318 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
\r
4319 x, y, width, height, format, type, bufSize, data);
\r
4323 if(width < 0 || height < 0 || bufSize < 0)
\r
4325 return error(GL_INVALID_VALUE);
\r
4328 if(!validReadFormatType(format, type))
\r
4330 return error(GL_INVALID_OPERATION);
\r
4333 rad::Context *context = rad::getContext();
\r
4337 context->readPixels(x, y, width, height, format, type, &bufSize, data);
\r
4340 catch(std::bad_alloc&)
\r
4342 return error(GL_OUT_OF_MEMORY);
\r
4346 void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
\r
4348 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
\r
4349 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
\r
4350 x, y, width, height, format, type, pixels);
\r
4354 if(width < 0 || height < 0)
\r
4356 return error(GL_INVALID_VALUE);
\r
4359 if(!validReadFormatType(format, type))
\r
4361 return error(GL_INVALID_OPERATION);
\r
4364 rad::Context *context = rad::getContext();
\r
4368 context->readPixels(x, y, width, height, format, type, NULL, pixels);
\r
4371 catch(std::bad_alloc&)
\r
4373 return error(GL_OUT_OF_MEMORY);
\r
4377 void GL_APIENTRY glReleaseShaderCompiler(void)
\r
4383 rad::Shader::releaseCompiler();
\r
4385 catch(std::bad_alloc&)
\r
4387 return error(GL_OUT_OF_MEMORY);
\r
4391 void GL_APIENTRY glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
\r
4393 TRACE("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
\r
4394 target, samples, internalformat, width, height);
\r
4400 case GL_RENDERBUFFER:
\r
4403 return error(GL_INVALID_ENUM);
\r
4406 if(!rad::IsColorRenderable(internalformat) && !rad::IsDepthRenderable(internalformat) && !rad::IsStencilRenderable(internalformat))
\r
4408 return error(GL_INVALID_ENUM);
\r
4411 if(width < 0 || height < 0 || samples < 0)
\r
4413 return error(GL_INVALID_VALUE);
\r
4416 rad::Context *context = rad::getContext();
\r
4420 if(width > rad::IMPLEMENTATION_MAX_RENDERBUFFER_SIZE ||
\r
4421 height > rad::IMPLEMENTATION_MAX_RENDERBUFFER_SIZE ||
\r
4422 samples > rad::IMPLEMENTATION_MAX_SAMPLES)
\r
4424 return error(GL_INVALID_VALUE);
\r
4427 GLuint handle = context->getRenderbufferHandle();
\r
4430 return error(GL_INVALID_OPERATION);
\r
4433 switch(internalformat)
\r
4435 case GL_DEPTH_COMPONENT16:
\r
4436 context->setRenderbufferStorage(new rad::Depthbuffer(width, height, samples));
\r
4442 case GL_RGBA8_OES:
\r
4443 context->setRenderbufferStorage(new rad::Colorbuffer(width, height, internalformat, samples));
\r
4445 case GL_STENCIL_INDEX8:
\r
4446 context->setRenderbufferStorage(new rad::Stencilbuffer(width, height, samples));
\r
4448 case GL_DEPTH24_STENCIL8_OES:
\r
4449 context->setRenderbufferStorage(new rad::DepthStencilbuffer(width, height, samples));
\r
4452 return error(GL_INVALID_ENUM);
\r
4456 catch(std::bad_alloc&)
\r
4458 return error(GL_OUT_OF_MEMORY);
\r
4462 void GL_APIENTRY glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
\r
4464 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
\r
4467 void GL_APIENTRY glSampleCoverage(GLclampf value, GLboolean invert)
\r
4469 TRACE("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
\r
4473 rad::Context* context = rad::getContext();
\r
4477 context->setSampleCoverageParams(rad::clamp01(value), invert == GL_TRUE);
\r
4480 catch(std::bad_alloc&)
\r
4482 return error(GL_OUT_OF_MEMORY);
\r
4486 void GL_APIENTRY glSetFenceNV(GLuint fence, GLenum condition)
\r
4488 TRACE("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
\r
4492 if(condition != GL_ALL_COMPLETED_NV)
\r
4494 return error(GL_INVALID_ENUM);
\r
4497 rad::Context *context = rad::getContext();
\r
4501 rad::Fence *fenceObject = context->getFence(fence);
\r
4503 if(fenceObject == NULL)
\r
4505 return error(GL_INVALID_OPERATION);
\r
4508 fenceObject->setFence(condition);
\r
4511 catch(std::bad_alloc&)
\r
4513 return error(GL_OUT_OF_MEMORY);
\r
4517 void GL_APIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
\r
4519 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
\r
4523 if(width < 0 || height < 0)
\r
4525 return error(GL_INVALID_VALUE);
\r
4528 rad::Context* context = rad::getContext();
\r
4532 context->setScissorParams(x, y, width, height);
\r
4535 catch(std::bad_alloc&)
\r
4537 return error(GL_OUT_OF_MEMORY);
\r
4541 void GL_APIENTRY glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
\r
4543 TRACE("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
\r
4544 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
\r
4545 n, shaders, binaryformat, binary, length);
\r
4549 // No binary shader formats are supported.
\r
4550 return error(GL_INVALID_ENUM);
\r
4552 catch(std::bad_alloc&)
\r
4554 return error(GL_OUT_OF_MEMORY);
\r
4558 void GL_APIENTRY glShaderSource(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length)
\r
4560 TRACE("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = 0x%0.8p, const GLint* length = 0x%0.8p)",
\r
4561 shader, count, string, length);
\r
4567 return error(GL_INVALID_VALUE);
\r
4570 rad::Context *context = rad::getContext();
\r
4574 rad::Shader *shaderObject = context->getShader(shader);
\r
4578 if(context->getProgram(shader))
\r
4580 return error(GL_INVALID_OPERATION);
\r
4584 return error(GL_INVALID_VALUE);
\r
4588 shaderObject->setSource(count, string, length);
\r
4591 catch(std::bad_alloc&)
\r
4593 return error(GL_OUT_OF_MEMORY);
\r
4597 void GL_APIENTRY glStencilFunc(GLenum func, GLint ref, GLuint mask)
\r
4599 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
\r
4602 void GL_APIENTRY glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
\r
4604 TRACE("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask);
\r
4612 case GL_FRONT_AND_BACK:
\r
4615 return error(GL_INVALID_ENUM);
\r
4630 return error(GL_INVALID_ENUM);
\r
4633 rad::Context *context = rad::getContext();
\r
4637 if(face == GL_FRONT || face == GL_FRONT_AND_BACK)
\r
4639 context->setStencilParams(func, ref, mask);
\r
4642 if(face == GL_BACK || face == GL_FRONT_AND_BACK)
\r
4644 context->setStencilBackParams(func, ref, mask);
\r
4648 catch(std::bad_alloc&)
\r
4650 return error(GL_OUT_OF_MEMORY);
\r
4654 void GL_APIENTRY glStencilMask(GLuint mask)
\r
4656 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
\r
4659 void GL_APIENTRY glStencilMaskSeparate(GLenum face, GLuint mask)
\r
4661 TRACE("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
\r
4669 case GL_FRONT_AND_BACK:
\r
4672 return error(GL_INVALID_ENUM);
\r
4675 rad::Context *context = rad::getContext();
\r
4679 if(face == GL_FRONT || face == GL_FRONT_AND_BACK)
\r
4681 context->setStencilWritemask(mask);
\r
4684 if(face == GL_BACK || face == GL_FRONT_AND_BACK)
\r
4686 context->setStencilBackWritemask(mask);
\r
4690 catch(std::bad_alloc&)
\r
4692 return error(GL_OUT_OF_MEMORY);
\r
4696 void GL_APIENTRY glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
\r
4698 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
\r
4701 void GL_APIENTRY glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
\r
4703 TRACE("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
\r
4704 face, fail, zfail, zpass);
\r
4712 case GL_FRONT_AND_BACK:
\r
4715 return error(GL_INVALID_ENUM);
\r
4726 case GL_INCR_WRAP:
\r
4727 case GL_DECR_WRAP:
\r
4730 return error(GL_INVALID_ENUM);
\r
4741 case GL_INCR_WRAP:
\r
4742 case GL_DECR_WRAP:
\r
4745 return error(GL_INVALID_ENUM);
\r
4756 case GL_INCR_WRAP:
\r
4757 case GL_DECR_WRAP:
\r
4760 return error(GL_INVALID_ENUM);
\r
4763 rad::Context *context = rad::getContext();
\r
4767 if(face == GL_FRONT || face == GL_FRONT_AND_BACK)
\r
4769 context->setStencilOperations(fail, zfail, zpass);
\r
4772 if(face == GL_BACK || face == GL_FRONT_AND_BACK)
\r
4774 context->setStencilBackOperations(fail, zfail, zpass);
\r
4778 catch(std::bad_alloc&)
\r
4780 return error(GL_OUT_OF_MEMORY);
\r
4784 GLboolean GL_APIENTRY glTestFenceNV(GLuint fence)
\r
4786 TRACE("(GLuint fence = %d)", fence);
\r
4790 rad::Context *context = rad::getContext();
\r
4794 rad::Fence *fenceObject = context->getFence(fence);
\r
4796 if(fenceObject == NULL)
\r
4798 return error(GL_INVALID_OPERATION, GL_TRUE);
\r
4801 return fenceObject->testFence();
\r
4804 catch(std::bad_alloc&)
\r
4806 error(GL_OUT_OF_MEMORY);
\r
4812 void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
\r
4813 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
\r
4815 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
\r
4816 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
\r
4817 target, level, internalformat, width, height, border, format, type, pixels);
\r
4821 if(!validImageSize(level, width, height))
\r
4823 return error(GL_INVALID_VALUE);
\r
4826 if(internalformat != format)
\r
4828 return error(GL_INVALID_OPERATION);
\r
4834 case GL_LUMINANCE:
\r
4835 case GL_LUMINANCE_ALPHA:
\r
4838 case GL_UNSIGNED_BYTE:
\r
4840 case GL_HALF_FLOAT_OES:
\r
4843 return error(GL_INVALID_ENUM);
\r
4849 case GL_UNSIGNED_BYTE:
\r
4850 case GL_UNSIGNED_SHORT_5_6_5:
\r
4852 case GL_HALF_FLOAT_OES:
\r
4855 return error(GL_INVALID_ENUM);
\r
4861 case GL_UNSIGNED_BYTE:
\r
4862 case GL_UNSIGNED_SHORT_4_4_4_4:
\r
4863 case GL_UNSIGNED_SHORT_5_5_5_1:
\r
4865 case GL_HALF_FLOAT_OES:
\r
4868 return error(GL_INVALID_ENUM);
\r
4874 case GL_UNSIGNED_BYTE:
\r
4877 return error(GL_INVALID_ENUM);
\r
4880 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
\r
4881 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
\r
4882 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
\r
4883 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
\r
4885 case GL_DEPTH_COMPONENT:
\r
4888 case GL_UNSIGNED_SHORT:
\r
4889 case GL_UNSIGNED_INT:
\r
4892 return error(GL_INVALID_ENUM);
\r
4895 case GL_DEPTH_STENCIL_OES:
\r
4898 case GL_UNSIGNED_INT_24_8_OES:
\r
4901 return error(GL_INVALID_ENUM);
\r
4905 return error(GL_INVALID_VALUE);
\r
4910 return error(GL_INVALID_VALUE);
\r
4913 rad::Context *context = rad::getContext();
\r
4919 case GL_TEXTURE_2D:
\r
4920 if(width > (rad::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
\r
4921 height > (rad::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
\r
4923 return error(GL_INVALID_VALUE);
\r
4926 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
\r
4927 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
\r
4928 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
\r
4929 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
\r
4930 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
\r
4931 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
\r
4932 if(width != height)
\r
4934 return error(GL_INVALID_VALUE);
\r
4937 if(width > (rad::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) ||
\r
4938 height > (rad::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level))
\r
4940 return error(GL_INVALID_VALUE);
\r
4944 return error(GL_INVALID_ENUM);
\r
4947 if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
\r
4948 format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
\r
4949 format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||
\r
4950 format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE)
\r
4954 return error(GL_INVALID_OPERATION);
\r
4958 return error(GL_INVALID_ENUM);
\r
4962 if(target == GL_TEXTURE_2D)
\r
4964 rad::Texture2D *texture = context->getTexture2D();
\r
4968 return error(GL_INVALID_OPERATION);
\r
4971 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
\r
4975 rad::TextureCubeMap *texture = context->getTextureCubeMap();
\r
4979 return error(GL_INVALID_OPERATION);
\r
4982 texture->setImage(target, level, width, height, format, type, context->getUnpackAlignment(), pixels);
\r
4986 catch(std::bad_alloc&)
\r
4988 return error(GL_OUT_OF_MEMORY);
\r
4992 void GL_APIENTRY glTexParameterf(GLenum target, GLenum pname, GLfloat param)
\r
4994 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat param = %f)", target, pname, param);
\r
4998 rad::Context *context = rad::getContext();
\r
5002 rad::Texture *texture;
\r
5006 case GL_TEXTURE_2D:
\r
5007 texture = context->getTexture2D();
\r
5009 case GL_TEXTURE_CUBE_MAP:
\r
5010 texture = context->getTextureCubeMap();
\r
5012 case GL_TEXTURE_EXTERNAL_OES:
\r
5013 texture = context->getTextureExternal();
\r
5016 return error(GL_INVALID_ENUM);
\r
5021 case GL_TEXTURE_WRAP_S:
\r
5022 if(!texture->setWrapS((GLenum)param))
\r
5024 return error(GL_INVALID_ENUM);
\r
5027 case GL_TEXTURE_WRAP_T:
\r
5028 if(!texture->setWrapT((GLenum)param))
\r
5030 return error(GL_INVALID_ENUM);
\r
5033 case GL_TEXTURE_MIN_FILTER:
\r
5034 if(!texture->setMinFilter((GLenum)param))
\r
5036 return error(GL_INVALID_ENUM);
\r
5039 case GL_TEXTURE_MAG_FILTER:
\r
5040 if(!texture->setMagFilter((GLenum)param))
\r
5042 return error(GL_INVALID_ENUM);
\r
5045 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
\r
5046 if(!texture->setMaxAnisotropy(param))
\r
5048 return error(GL_INVALID_VALUE);
\r
5052 return error(GL_INVALID_ENUM);
\r
5056 catch(std::bad_alloc&)
\r
5058 return error(GL_OUT_OF_MEMORY);
\r
5062 void GL_APIENTRY glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
\r
5064 glTexParameterf(target, pname, *params);
\r
5067 void GL_APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param)
\r
5069 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
\r
5073 rad::Context *context = rad::getContext();
\r
5077 rad::Texture *texture;
\r
5081 case GL_TEXTURE_2D:
\r
5082 texture = context->getTexture2D();
\r
5084 case GL_TEXTURE_CUBE_MAP:
\r
5085 texture = context->getTextureCubeMap();
\r
5087 case GL_TEXTURE_EXTERNAL_OES:
\r
5088 texture = context->getTextureExternal();
\r
5091 return error(GL_INVALID_ENUM);
\r
5096 case GL_TEXTURE_WRAP_S:
\r
5097 if(!texture->setWrapS((GLenum)param))
\r
5099 return error(GL_INVALID_ENUM);
\r
5102 case GL_TEXTURE_WRAP_T:
\r
5103 if(!texture->setWrapT((GLenum)param))
\r
5105 return error(GL_INVALID_ENUM);
\r
5108 case GL_TEXTURE_MIN_FILTER:
\r
5109 if(!texture->setMinFilter((GLenum)param))
\r
5111 return error(GL_INVALID_ENUM);
\r
5114 case GL_TEXTURE_MAG_FILTER:
\r
5115 if(!texture->setMagFilter((GLenum)param))
\r
5117 return error(GL_INVALID_ENUM);
\r
5120 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
\r
5121 if(!texture->setMaxAnisotropy((GLfloat)param))
\r
5123 return error(GL_INVALID_VALUE);
\r
5127 return error(GL_INVALID_ENUM);
\r
5131 catch(std::bad_alloc&)
\r
5133 return error(GL_OUT_OF_MEMORY);
\r
5137 void GL_APIENTRY glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
\r
5139 glTexParameteri(target, pname, *params);
\r
5142 void GL_APIENTRY glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
\r
5143 GLenum format, GLenum type, const GLvoid* pixels)
\r
5145 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
\r
5146 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
\r
5147 "const GLvoid* pixels = 0x%0.8p)",
\r
5148 target, level, xoffset, yoffset, width, height, format, type, pixels);
\r
5152 if(!rad::IsTextureTarget(target))
\r
5154 return error(GL_INVALID_ENUM);
\r
5157 if(level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
\r
5159 return error(GL_INVALID_VALUE);
\r
5162 if(std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
\r
5164 return error(GL_INVALID_VALUE);
\r
5167 if(!rad::CheckTextureFormatType(format, type))
\r
5169 return error(GL_INVALID_ENUM);
\r
5172 if(width == 0 || height == 0 || pixels == NULL)
\r
5177 rad::Context *context = rad::getContext();
\r
5181 if(level > rad::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
\r
5183 return error(GL_INVALID_VALUE);
\r
5186 if(target == GL_TEXTURE_2D)
\r
5188 rad::Texture2D *texture = context->getTexture2D();
\r
5190 if(validateSubImageParams(false, width, height, xoffset, yoffset, target, level, format, texture))
\r
5192 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
\r
5195 else if(rad::IsCubemapTextureTarget(target))
\r
5197 rad::TextureCubeMap *texture = context->getTextureCubeMap();
\r
5199 if(validateSubImageParams(false, width, height, xoffset, yoffset, target, level, format, texture))
\r
5201 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
\r
5210 catch(std::bad_alloc&)
\r
5212 return error(GL_OUT_OF_MEMORY);
\r
5216 void GL_APIENTRY glUniform1f(GLint location, GLfloat x)
\r
5218 glUniform1fv(location, 1, &x);
\r
5221 void GL_APIENTRY glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
\r
5223 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
\r
5229 return error(GL_INVALID_VALUE);
\r
5232 if(location == -1)
\r
5237 rad::Context *context = rad::getContext();
\r
5241 rad::Program *program = context->getCurrentProgram();
\r
5245 return error(GL_INVALID_OPERATION);
\r
5248 if(!program->setUniform1fv(location, count, v))
\r
5250 return error(GL_INVALID_OPERATION);
\r
5254 catch(std::bad_alloc&)
\r
5256 return error(GL_OUT_OF_MEMORY);
\r
5260 void GL_APIENTRY glUniform1i(GLint location, GLint x)
\r
5262 glUniform1iv(location, 1, &x);
\r
5265 void GL_APIENTRY glUniform1iv(GLint location, GLsizei count, const GLint* v)
\r
5267 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
\r
5273 return error(GL_INVALID_VALUE);
\r
5276 if(location == -1)
\r
5281 rad::Context *context = rad::getContext();
\r
5285 rad::Program *program = context->getCurrentProgram();
\r
5289 return error(GL_INVALID_OPERATION);
\r
5292 if(!program->setUniform1iv(location, count, v))
\r
5294 return error(GL_INVALID_OPERATION);
\r
5298 catch(std::bad_alloc&)
\r
5300 return error(GL_OUT_OF_MEMORY);
\r
5304 void GL_APIENTRY glUniform2f(GLint location, GLfloat x, GLfloat y)
\r
5306 GLfloat xy[2] = {x, y};
\r
5308 glUniform2fv(location, 1, (GLfloat*)&xy);
\r
5311 void GL_APIENTRY glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
\r
5313 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
\r
5319 return error(GL_INVALID_VALUE);
\r
5322 if(location == -1)
\r
5327 rad::Context *context = rad::getContext();
\r
5331 rad::Program *program = context->getCurrentProgram();
\r
5335 return error(GL_INVALID_OPERATION);
\r
5338 if(!program->setUniform2fv(location, count, v))
\r
5340 return error(GL_INVALID_OPERATION);
\r
5344 catch(std::bad_alloc&)
\r
5346 return error(GL_OUT_OF_MEMORY);
\r
5350 void GL_APIENTRY glUniform2i(GLint location, GLint x, GLint y)
\r
5352 GLint xy[4] = {x, y};
\r
5354 glUniform2iv(location, 1, (GLint*)&xy);
\r
5357 void GL_APIENTRY glUniform2iv(GLint location, GLsizei count, const GLint* v)
\r
5359 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
\r
5365 return error(GL_INVALID_VALUE);
\r
5368 if(location == -1)
\r
5373 rad::Context *context = rad::getContext();
\r
5377 rad::Program *program = context->getCurrentProgram();
\r
5381 return error(GL_INVALID_OPERATION);
\r
5384 if(!program->setUniform2iv(location, count, v))
\r
5386 return error(GL_INVALID_OPERATION);
\r
5390 catch(std::bad_alloc&)
\r
5392 return error(GL_OUT_OF_MEMORY);
\r
5396 void GL_APIENTRY glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
\r
5398 GLfloat xyz[3] = {x, y, z};
\r
5400 glUniform3fv(location, 1, (GLfloat*)&xyz);
\r
5403 void GL_APIENTRY glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
\r
5405 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
\r
5411 return error(GL_INVALID_VALUE);
\r
5414 if(location == -1)
\r
5419 rad::Context *context = rad::getContext();
\r
5423 rad::Program *program = context->getCurrentProgram();
\r
5427 return error(GL_INVALID_OPERATION);
\r
5430 if(!program->setUniform3fv(location, count, v))
\r
5432 return error(GL_INVALID_OPERATION);
\r
5436 catch(std::bad_alloc&)
\r
5438 return error(GL_OUT_OF_MEMORY);
\r
5442 void GL_APIENTRY glUniform3i(GLint location, GLint x, GLint y, GLint z)
\r
5444 GLint xyz[3] = {x, y, z};
\r
5446 glUniform3iv(location, 1, (GLint*)&xyz);
\r
5449 void GL_APIENTRY glUniform3iv(GLint location, GLsizei count, const GLint* v)
\r
5451 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
\r
5457 return error(GL_INVALID_VALUE);
\r
5460 if(location == -1)
\r
5465 rad::Context *context = rad::getContext();
\r
5469 rad::Program *program = context->getCurrentProgram();
\r
5473 return error(GL_INVALID_OPERATION);
\r
5476 if(!program->setUniform3iv(location, count, v))
\r
5478 return error(GL_INVALID_OPERATION);
\r
5482 catch(std::bad_alloc&)
\r
5484 return error(GL_OUT_OF_MEMORY);
\r
5488 void GL_APIENTRY glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
\r
5490 GLfloat xyzw[4] = {x, y, z, w};
\r
5492 glUniform4fv(location, 1, (GLfloat*)&xyzw);
\r
5495 void GL_APIENTRY glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
\r
5497 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
\r
5503 return error(GL_INVALID_VALUE);
\r
5506 if(location == -1)
\r
5511 rad::Context *context = rad::getContext();
\r
5515 rad::Program *program = context->getCurrentProgram();
\r
5519 return error(GL_INVALID_OPERATION);
\r
5522 if(!program->setUniform4fv(location, count, v))
\r
5524 return error(GL_INVALID_OPERATION);
\r
5528 catch(std::bad_alloc&)
\r
5530 return error(GL_OUT_OF_MEMORY);
\r
5534 void GL_APIENTRY glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
\r
5536 GLint xyzw[4] = {x, y, z, w};
\r
5538 glUniform4iv(location, 1, (GLint*)&xyzw);
\r
5541 void GL_APIENTRY glUniform4iv(GLint location, GLsizei count, const GLint* v)
\r
5543 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
\r
5549 return error(GL_INVALID_VALUE);
\r
5552 if(location == -1)
\r
5557 rad::Context *context = rad::getContext();
\r
5561 rad::Program *program = context->getCurrentProgram();
\r
5565 return error(GL_INVALID_OPERATION);
\r
5568 if(!program->setUniform4iv(location, count, v))
\r
5570 return error(GL_INVALID_OPERATION);
\r
5574 catch(std::bad_alloc&)
\r
5576 return error(GL_OUT_OF_MEMORY);
\r
5580 void GL_APIENTRY glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
\r
5582 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
\r
5583 location, count, transpose, value);
\r
5587 if(count < 0 || transpose != GL_FALSE)
\r
5589 return error(GL_INVALID_VALUE);
\r
5592 if(location == -1)
\r
5597 rad::Context *context = rad::getContext();
\r
5601 rad::Program *program = context->getCurrentProgram();
\r
5605 return error(GL_INVALID_OPERATION);
\r
5608 if(!program->setUniformMatrix2fv(location, count, value))
\r
5610 return error(GL_INVALID_OPERATION);
\r
5614 catch(std::bad_alloc&)
\r
5616 return error(GL_OUT_OF_MEMORY);
\r
5620 void GL_APIENTRY glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
\r
5622 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
\r
5623 location, count, transpose, value);
\r
5627 if(count < 0 || transpose != GL_FALSE)
\r
5629 return error(GL_INVALID_VALUE);
\r
5632 if(location == -1)
\r
5637 rad::Context *context = rad::getContext();
\r
5641 rad::Program *program = context->getCurrentProgram();
\r
5645 return error(GL_INVALID_OPERATION);
\r
5648 if(!program->setUniformMatrix3fv(location, count, value))
\r
5650 return error(GL_INVALID_OPERATION);
\r
5654 catch(std::bad_alloc&)
\r
5656 return error(GL_OUT_OF_MEMORY);
\r
5660 void GL_APIENTRY glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
\r
5662 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
\r
5663 location, count, transpose, value);
\r
5667 if(count < 0 || transpose != GL_FALSE)
\r
5669 return error(GL_INVALID_VALUE);
\r
5672 if(location == -1)
\r
5677 rad::Context *context = rad::getContext();
\r
5681 rad::Program *program = context->getCurrentProgram();
\r
5685 return error(GL_INVALID_OPERATION);
\r
5688 if(!program->setUniformMatrix4fv(location, count, value))
\r
5690 return error(GL_INVALID_OPERATION);
\r
5694 catch(std::bad_alloc&)
\r
5696 return error(GL_OUT_OF_MEMORY);
\r
5700 void GL_APIENTRY glUseProgram(GLuint program)
\r
5702 TRACE("(GLuint program = %d)", program);
\r
5706 rad::Context *context = rad::getContext();
\r
5710 rad::Program *programObject = context->getProgram(program);
\r
5712 if(!programObject && program != 0)
\r
5714 if(context->getShader(program))
\r
5716 return error(GL_INVALID_OPERATION);
\r
5720 return error(GL_INVALID_VALUE);
\r
5724 if(program != 0 && !programObject->isLinked())
\r
5726 return error(GL_INVALID_OPERATION);
\r
5729 context->useProgram(program);
\r
5732 catch(std::bad_alloc&)
\r
5734 return error(GL_OUT_OF_MEMORY);
\r
5738 void GL_APIENTRY glValidateProgram(GLuint program)
\r
5740 TRACE("(GLuint program = %d)", program);
\r
5744 rad::Context *context = rad::getContext();
\r
5748 rad::Program *programObject = context->getProgram(program);
\r
5750 if(!programObject)
\r
5752 if(context->getShader(program))
\r
5754 return error(GL_INVALID_OPERATION);
\r
5758 return error(GL_INVALID_VALUE);
\r
5762 programObject->validate();
\r
5765 catch(std::bad_alloc&)
\r
5767 return error(GL_OUT_OF_MEMORY);
\r
5771 void GL_APIENTRY glVertexAttrib1f(GLuint index, GLfloat x)
\r
5773 TRACE("(GLuint index = %d, GLfloat x = %f)", index, x);
\r
5777 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
5779 return error(GL_INVALID_VALUE);
\r
5782 rad::Context *context = rad::getContext();
\r
5786 GLfloat vals[4] = { x, 0, 0, 1 };
\r
5787 context->setVertexAttrib(index, vals);
\r
5790 catch(std::bad_alloc&)
\r
5792 return error(GL_OUT_OF_MEMORY);
\r
5796 void GL_APIENTRY glVertexAttrib1fv(GLuint index, const GLfloat* values)
\r
5798 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
\r
5802 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
5804 return error(GL_INVALID_VALUE);
\r
5807 rad::Context *context = rad::getContext();
\r
5811 GLfloat vals[4] = { values[0], 0, 0, 1 };
\r
5812 context->setVertexAttrib(index, vals);
\r
5815 catch(std::bad_alloc&)
\r
5817 return error(GL_OUT_OF_MEMORY);
\r
5821 void GL_APIENTRY glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
\r
5823 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
\r
5827 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
5829 return error(GL_INVALID_VALUE);
\r
5832 rad::Context *context = rad::getContext();
\r
5836 GLfloat vals[4] = { x, y, 0, 1 };
\r
5837 context->setVertexAttrib(index, vals);
\r
5840 catch(std::bad_alloc&)
\r
5842 return error(GL_OUT_OF_MEMORY);
\r
5846 void GL_APIENTRY glVertexAttrib2fv(GLuint index, const GLfloat* values)
\r
5848 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
\r
5852 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
5854 return error(GL_INVALID_VALUE);
\r
5857 rad::Context *context = rad::getContext();
\r
5861 GLfloat vals[4] = { values[0], values[1], 0, 1 };
\r
5862 context->setVertexAttrib(index, vals);
\r
5865 catch(std::bad_alloc&)
\r
5867 return error(GL_OUT_OF_MEMORY);
\r
5871 void GL_APIENTRY glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
\r
5873 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z);
\r
5877 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
5879 return error(GL_INVALID_VALUE);
\r
5882 rad::Context *context = rad::getContext();
\r
5886 GLfloat vals[4] = { x, y, z, 1 };
\r
5887 context->setVertexAttrib(index, vals);
\r
5890 catch(std::bad_alloc&)
\r
5892 return error(GL_OUT_OF_MEMORY);
\r
5896 void GL_APIENTRY glVertexAttrib3fv(GLuint index, const GLfloat* values)
\r
5898 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
\r
5902 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
5904 return error(GL_INVALID_VALUE);
\r
5907 rad::Context *context = rad::getContext();
\r
5911 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
\r
5912 context->setVertexAttrib(index, vals);
\r
5915 catch(std::bad_alloc&)
\r
5917 return error(GL_OUT_OF_MEMORY);
\r
5921 void GL_APIENTRY glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
\r
5923 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w);
\r
5927 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
5929 return error(GL_INVALID_VALUE);
\r
5932 rad::Context *context = rad::getContext();
\r
5936 GLfloat vals[4] = { x, y, z, w };
\r
5937 context->setVertexAttrib(index, vals);
\r
5940 catch(std::bad_alloc&)
\r
5942 return error(GL_OUT_OF_MEMORY);
\r
5946 void GL_APIENTRY glVertexAttrib4fv(GLuint index, const GLfloat* values)
\r
5948 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
\r
5952 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
5954 return error(GL_INVALID_VALUE);
\r
5957 rad::Context *context = rad::getContext();
\r
5961 context->setVertexAttrib(index, values);
\r
5964 catch(std::bad_alloc&)
\r
5966 return error(GL_OUT_OF_MEMORY);
\r
5970 void GL_APIENTRY glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
\r
5972 TRACE("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
\r
5973 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
\r
5974 index, size, type, normalized, stride, ptr);
\r
5978 if(index >= rad::MAX_VERTEX_ATTRIBS)
\r
5980 return error(GL_INVALID_VALUE);
\r
5983 if(size < 1 || size > 4)
\r
5985 return error(GL_INVALID_VALUE);
\r
5991 case GL_UNSIGNED_BYTE:
\r
5993 case GL_UNSIGNED_SHORT:
\r
5998 return error(GL_INVALID_ENUM);
\r
6003 return error(GL_INVALID_VALUE);
\r
6006 rad::Context *context = rad::getContext();
\r
6010 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
\r
6013 catch(std::bad_alloc&)
\r
6015 return error(GL_OUT_OF_MEMORY);
\r
6019 void GL_APIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
\r
6021 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
\r
6025 if(width < 0 || height < 0)
\r
6027 return error(GL_INVALID_VALUE);
\r
6030 rad::Context *context = rad::getContext();
\r
6034 context->setViewportParams(x, y, width, height);
\r
6037 catch(std::bad_alloc&)
\r
6039 return error(GL_OUT_OF_MEMORY);
\r
6043 void GL_APIENTRY glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
\r
6044 GLbitfield mask, GLenum filter)
\r
6046 TRACE("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
\r
6047 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
\r
6048 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
\r
6049 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
\r
6058 return error(GL_INVALID_ENUM);
\r
6061 if((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
\r
6063 return error(GL_INVALID_VALUE);
\r
6066 if(srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
\r
6068 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
\r
6069 return error(GL_INVALID_OPERATION);
\r
6072 rad::Context *context = rad::getContext();
\r
6076 if(context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
\r
6078 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
\r
6079 return error(GL_INVALID_OPERATION);
\r
6082 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
\r
6085 catch(std::bad_alloc&)
\r
6087 return error(GL_OUT_OF_MEMORY);
\r
6091 void GL_APIENTRY glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
\r
6092 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
\r
6094 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
\r
6095 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
\r
6096 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
\r
6097 target, level, internalformat, width, height, depth, border, format, type, pixels);
\r
6101 UNIMPLEMENTED(); // FIXME
\r
6103 catch(std::bad_alloc&)
\r
6105 return error(GL_OUT_OF_MEMORY);
\r
6109 void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
\r
6111 TRACE("(GLenum target = 0x%X, GLeglImageOES image = 0x%0.8p)", target, image);
\r
6117 case GL_TEXTURE_EXTERNAL_OES:
\r
6120 return error(GL_INVALID_ENUM);
\r
6125 return error(GL_INVALID_OPERATION);
\r
6128 rad::Context *context = rad::getContext();
\r
6132 rad::TextureExternal *texture = context->getTextureExternal();
\r
6136 return error(GL_INVALID_OPERATION);
\r
6139 rad::Image *glImage = static_cast<rad::Image*>(image);
\r
6141 texture->setImage(glImage);
\r
6144 catch(std::bad_alloc&)
\r
6146 return error(GL_OUT_OF_MEMORY);
\r
6150 RADdevice RADAPIENTRY radCreateDevice (void) {UNIMPLEMENTED(); return 0;}
\r
6151 void RADAPIENTRY radReferenceDevice (RADdevice device) {UNIMPLEMENTED();}
\r
6152 void RADAPIENTRY radReleaseDevice (RADdevice device) {UNIMPLEMENTED();}
\r
6153 RADuint RADAPIENTRY radGetTokenHeader (RADdevice device, RADtokenName name) {UNIMPLEMENTED(); return 0;}
\r
6154 RADqueue RADAPIENTRY radCreateQueue (RADdevice device, RADqueueType queuetype) {UNIMPLEMENTED(); return 0;}
\r
6155 void RADAPIENTRY radReferenceQueue (RADqueue queue) {UNIMPLEMENTED();}
\r
6156 void RADAPIENTRY radReleaseQueue (RADqueue queue) {UNIMPLEMENTED();}
\r
6157 void RADAPIENTRY radQueueTagBuffer (RADqueue queue, RADbuffer buffer) {UNIMPLEMENTED();}
\r
6158 void RADAPIENTRY radQueueTagTexture (RADqueue queue, RADtexture texture) {UNIMPLEMENTED();}
\r
6159 void RADAPIENTRY radQueueSubmitCommands (RADqueue queue, RADuint numCommands, const RADcommandHandle *handles) {UNIMPLEMENTED();}
\r
6160 void RADAPIENTRY radFlushQueue (RADqueue queue) {UNIMPLEMENTED();}
\r
6161 void RADAPIENTRY radFinishQueue (RADqueue queue) {UNIMPLEMENTED();}
\r
6162 void RADAPIENTRY radQueueViewport (RADqueue queue, RADint x, RADint y, RADint w, RADint h) {UNIMPLEMENTED();}
\r
6163 void RADAPIENTRY radQueueScissor (RADqueue queue, RADint x, RADint y, RADint w, RADint h) {UNIMPLEMENTED();}
\r
6164 void RADAPIENTRY radQueueCopyBufferToImage (RADqueue queue, RADbuffer buffer, RADintptr bufferOffset, RADtexture texture, RADint level, RADuint xoffset, RADuint yoffset, RADuint zoffset, RADsizei width, RADsizei height, RADsizei depth) {UNIMPLEMENTED();}
\r
6165 void RADAPIENTRY radQueueCopyImageToBuffer (RADqueue queue, RADbuffer buffer, RADintptr bufferOffset, RADtexture texture, RADint level, RADuint xoffset, RADuint yoffset, RADuint zoffset, RADsizei width, RADsizei height, RADsizei depth) {UNIMPLEMENTED();}
\r
6166 void RADAPIENTRY radQueueCopyBuffer (RADqueue queue, RADbuffer srcBuffer, RADintptr srcOffset, RADbuffer dstBuffer, RADintptr dstOffset, RADsizei size) {UNIMPLEMENTED();}
\r
6167 void RADAPIENTRY radQueueClearColor (RADqueue queue, RADuint index, const RADfloat *color) {UNIMPLEMENTED();}
\r
6168 void RADAPIENTRY radQueueClearDepth (RADqueue queue, RADfloat depth) {UNIMPLEMENTED();}
\r
6169 void RADAPIENTRY radQueueClearStencil (RADqueue queue, RADuint stencil) {UNIMPLEMENTED();}
\r
6170 void RADAPIENTRY radQueuePresent (RADqueue queue, RADtexture texture) {UNIMPLEMENTED();}
\r
6171 void RADAPIENTRY radQueueDrawArrays (RADqueue queue, RADprimitiveType mode, RADint first, RADsizei count) {UNIMPLEMENTED();}
\r
6172 void RADAPIENTRY radQueueDrawElements (RADqueue queue, RADprimitiveType mode, RADindexType type, RADsizei count, RADindexHandle indexHandle, RADuint offset) {UNIMPLEMENTED();}
\r
6173 void RADAPIENTRY radQueueBindPipeline (RADqueue queue, RADpipelineType pipelineType, RADpipelineHandle pipelineHandle) {UNIMPLEMENTED();}
\r
6174 void RADAPIENTRY radQueueBindGroup (RADqueue queue, RADbitfield stages, RADuint group, RADuint count, RADbindGroupHandle groupHandle, RADuint offset) {UNIMPLEMENTED();}
\r
6175 void RADAPIENTRY radQueueBeginPass (RADqueue queue, RADpass pass) {UNIMPLEMENTED();}
\r
6176 void RADAPIENTRY radQueueEndPass (RADqueue queue, RADpass pass) {UNIMPLEMENTED();}
\r
6177 void RADAPIENTRY radQueueSubmitDynamic (RADqueue queue, const void *dynamic, RADsizei length) {UNIMPLEMENTED();}
\r
6178 void RADAPIENTRY radQueueStencilValueMask (RADqueue queue, RADfaceBitfield faces, RADuint mask) {UNIMPLEMENTED();}
\r
6179 void RADAPIENTRY radQueueStencilMask (RADqueue queue, RADfaceBitfield faces, RADuint mask) {UNIMPLEMENTED();}
\r
6180 void RADAPIENTRY radQueueStencilRef (RADqueue queue, RADfaceBitfield faces, RADint ref) {UNIMPLEMENTED();}
\r
6181 void RADAPIENTRY radQueueBlendColor (RADqueue queue, const RADfloat *blendColor) {UNIMPLEMENTED();}
\r
6182 void RADAPIENTRY radQueuePointSize (RADqueue queue, RADfloat pointSize) {UNIMPLEMENTED();}
\r
6183 void RADAPIENTRY radQueueLineWidth (RADqueue queue, RADfloat lineWidth) {UNIMPLEMENTED();}
\r
6184 void RADAPIENTRY radQueuePolygonOffsetClamp (RADqueue queue, RADfloat factor, RADfloat units, RADfloat clamp) {UNIMPLEMENTED();}
\r
6185 void RADAPIENTRY radQueueSampleMask (RADqueue queue, RADuint mask) {UNIMPLEMENTED();}
\r
6186 RADprogram RADAPIENTRY radCreateProgram (RADdevice device) {UNIMPLEMENTED(); return 0;}
\r
6187 void RADAPIENTRY radReferenceProgram (RADprogram program) {UNIMPLEMENTED();}
\r
6188 void RADAPIENTRY radReleaseProgram (RADprogram program) {UNIMPLEMENTED();}
\r
6189 void RADAPIENTRY radProgramSource (RADprogram program, RADprogramFormat format, RADsizei length, const void *source) {UNIMPLEMENTED();}
\r
6190 RADbuffer RADAPIENTRY radCreateBuffer (RADdevice device) {UNIMPLEMENTED(); return 0;}
\r
6191 void RADAPIENTRY radReferenceBuffer (RADbuffer buffer) {UNIMPLEMENTED();}
\r
6192 void RADAPIENTRY radReleaseBuffer (RADbuffer buffer, RADtagMode tagMode) {UNIMPLEMENTED();}
\r
6193 void RADAPIENTRY radBufferAccess (RADbuffer buffer, RADbitfield access) {UNIMPLEMENTED();}
\r
6194 void RADAPIENTRY radBufferMapAccess (RADbuffer buffer, RADbitfield mapAccess) {UNIMPLEMENTED();}
\r
6195 void RADAPIENTRY radBufferStorage (RADbuffer buffer, RADsizei size) {UNIMPLEMENTED();}
\r
6196 void* RADAPIENTRY radMapBuffer (RADbuffer buffer) {UNIMPLEMENTED(); return 0;}
\r
6197 RADvertexHandle RADAPIENTRY radGetVertexHandle (RADbuffer buffer) {UNIMPLEMENTED(); return 0;}
\r
6198 RADindexHandle RADAPIENTRY radGetIndexHandle (RADbuffer buffer) {UNIMPLEMENTED(); return 0;}
\r
6199 RADuniformHandle RADAPIENTRY radGetUniformHandle (RADbuffer buffer) {UNIMPLEMENTED(); return 0;}
\r
6200 RADbindGroupHandle RADAPIENTRY radGetBindGroupHandle (RADbuffer buffer) {UNIMPLEMENTED(); return 0;}
\r
6201 RADtexture RADAPIENTRY radCreateTexture (RADdevice device) {UNIMPLEMENTED(); return 0;}
\r
6202 void RADAPIENTRY radReferenceTexture (RADtexture texture) {UNIMPLEMENTED();}
\r
6203 void RADAPIENTRY radReleaseTexture (RADtexture texture, RADtagMode tagMode) {UNIMPLEMENTED();}
\r
6204 void RADAPIENTRY radTextureAccess (RADtexture texture, RADbitfield access) {UNIMPLEMENTED();}
\r
6205 void RADAPIENTRY radTextureStorage (RADtexture texture, RADtextureTarget target, RADsizei levels, RADinternalFormat internalFormat, RADsizei width, RADsizei height, RADsizei depth, RADsizei samples) {UNIMPLEMENTED();}
\r
6206 RADtextureHandle RADAPIENTRY radGetTextureSamplerHandle (RADtexture texture, RADsampler sampler, RADtextureTarget target, RADinternalFormat internalFormat, RADuint minLevel, RADuint numLevels, RADuint minLayer, RADuint numLayers) {UNIMPLEMENTED(); return 0;}
\r
6207 RADrenderTargetHandle RADAPIENTRY radGetTextureRenderTargetHandle (RADtexture texture, RADtextureTarget target, RADinternalFormat internalFormat, RADuint level, RADuint minLayer, RADuint numLayers) {UNIMPLEMENTED(); return 0;}
\r
6208 RADsampler RADAPIENTRY radCreateSampler (RADdevice device) {UNIMPLEMENTED(); return 0;}
\r
6209 void RADAPIENTRY radReferenceSampler (RADsampler sampler) {UNIMPLEMENTED();}
\r
6210 void RADAPIENTRY radReleaseSampler (RADsampler sampler) {UNIMPLEMENTED();}
\r
6211 void RADAPIENTRY radSamplerDefault (RADsampler sampler) {UNIMPLEMENTED();}
\r
6212 void RADAPIENTRY radSamplerMinMagFilter (RADsampler sampler, RADminFilter min, RADmagFilter mag) {UNIMPLEMENTED();}
\r
6213 void RADAPIENTRY radSamplerWrapMode (RADsampler sampler, RADwrapMode s, RADwrapMode t, RADwrapMode r) {UNIMPLEMENTED();}
\r
6214 void RADAPIENTRY radSamplerLodClamp (RADsampler sampler, RADfloat min, RADfloat max) {UNIMPLEMENTED();}
\r
6215 void RADAPIENTRY radSamplerLodBias (RADsampler sampler, RADfloat bias) {UNIMPLEMENTED();}
\r
6216 void RADAPIENTRY radSamplerCompare (RADsampler sampler, RADcompareMode mode, RADcompareFunc func) {UNIMPLEMENTED();}
\r
6217 void RADAPIENTRY radSamplerBorderColorFloat (RADsampler sampler, const RADfloat *borderColor) {UNIMPLEMENTED();}
\r
6218 void RADAPIENTRY radSamplerBorderColorInt (RADsampler sampler, const RADuint *borderColor) {UNIMPLEMENTED();}
\r
6219 RADcolorState RADAPIENTRY radCreateColorState (RADdevice device) {UNIMPLEMENTED(); return 0;}
\r
6220 void RADAPIENTRY radReferenceColorState (RADcolorState color) {UNIMPLEMENTED();}
\r
6221 void RADAPIENTRY radReleaseColorState (RADcolorState color) {UNIMPLEMENTED();}
\r
6222 void RADAPIENTRY radColorDefault (RADcolorState color) {UNIMPLEMENTED();}
\r
6223 void RADAPIENTRY radColorBlendEnable (RADcolorState color, RADuint index, RADboolean enable) {UNIMPLEMENTED();}
\r
6224 void RADAPIENTRY radColorBlendFunc (RADcolorState color, RADuint index, RADblendFunc srcFunc, RADblendFunc dstFunc, RADblendFunc srcFuncAlpha, RADblendFunc dstFuncAlpha) {UNIMPLEMENTED();}
\r
6225 void RADAPIENTRY radColorBlendEquation (RADcolorState color, RADuint index, RADblendEquation modeRGB, RADblendEquation modeAlpha) {UNIMPLEMENTED();}
\r
6226 void RADAPIENTRY radColorMask (RADcolorState color, RADuint index, RADboolean r, RADboolean g, RADboolean b, RADboolean a) {UNIMPLEMENTED();}
\r
6227 void RADAPIENTRY radColorNumTargets (RADcolorState color, RADuint numTargets) {UNIMPLEMENTED();}
\r
6228 void RADAPIENTRY radColorLogicOpEnable (RADcolorState color, RADboolean enable) {UNIMPLEMENTED();}
\r
6229 void RADAPIENTRY radColorLogicOp (RADcolorState color, RADlogicOp logicOp) {UNIMPLEMENTED();}
\r
6230 void RADAPIENTRY radColorAlphaToCoverageEnable (RADcolorState color, RADboolean enable) {UNIMPLEMENTED();}
\r
6231 void RADAPIENTRY radColorBlendColor (RADcolorState color, const RADfloat *blendColor) {UNIMPLEMENTED();}
\r
6232 void RADAPIENTRY radColorDynamic (RADcolorState color, RADcolorDynamic dynamic, RADboolean enable) {UNIMPLEMENTED();}
\r
6233 RADrasterState RADAPIENTRY radCreateRasterState (RADdevice device) {UNIMPLEMENTED(); return 0;}
\r
6234 void RADAPIENTRY radReferenceRasterState (RADrasterState raster) {UNIMPLEMENTED();}
\r
6235 void RADAPIENTRY radReleaseRasterState (RADrasterState raster) {UNIMPLEMENTED();}
\r
6236 void RADAPIENTRY radRasterDefault (RADrasterState raster) {UNIMPLEMENTED();}
\r
6237 void RADAPIENTRY radRasterPointSize (RADrasterState raster, RADfloat pointSize) {UNIMPLEMENTED();}
\r
6238 void RADAPIENTRY radRasterLineWidth (RADrasterState raster, RADfloat lineWidth) {UNIMPLEMENTED();}
\r
6239 void RADAPIENTRY radRasterCullFace (RADrasterState raster, RADfaceBitfield face) {UNIMPLEMENTED();}
\r
6240 void RADAPIENTRY radRasterFrontFace (RADrasterState raster, RADfrontFace face) {UNIMPLEMENTED();}
\r
6241 void RADAPIENTRY radRasterPolygonMode (RADrasterState raster, RADpolygonMode polygonMode) {UNIMPLEMENTED();}
\r
6242 void RADAPIENTRY radRasterPolygonOffsetClamp (RADrasterState raster, RADfloat factor, RADfloat units, RADfloat clamp) {UNIMPLEMENTED();}
\r
6243 void RADAPIENTRY radRasterPolygonOffsetEnables (RADrasterState raster, RADpolygonOffsetEnables enables) {UNIMPLEMENTED();}
\r
6244 void RADAPIENTRY radRasterDiscardEnable (RADrasterState raster, RADboolean enable) {UNIMPLEMENTED();}
\r
6245 void RADAPIENTRY radRasterMultisampleEnable (RADrasterState raster, RADboolean enable) {UNIMPLEMENTED();}
\r
6246 void RADAPIENTRY radRasterSamples (RADrasterState raster, RADuint samples) {UNIMPLEMENTED();}
\r
6247 void RADAPIENTRY radRasterSampleMask (RADrasterState raster, RADuint mask) {UNIMPLEMENTED();}
\r
6248 void RADAPIENTRY radRasterDynamic (RADrasterState raster, RADrasterDynamic dynamic, RADboolean enable) {UNIMPLEMENTED();}
\r
6249 RADdepthStencilState RADAPIENTRY radCreateDepthStencilState (RADdevice device) {UNIMPLEMENTED(); return 0;}
\r
6250 void RADAPIENTRY radReferenceDepthStencilState (RADdepthStencilState depthStencil) {UNIMPLEMENTED();}
\r
6251 void RADAPIENTRY radReleaseDepthStencilState (RADdepthStencilState depthStencil) {UNIMPLEMENTED();}
\r
6252 void RADAPIENTRY radDepthStencilDefault (RADdepthStencilState depthStencil) {UNIMPLEMENTED();}
\r
6253 void RADAPIENTRY radDepthStencilDepthTestEnable (RADdepthStencilState depthStencil, RADboolean enable) {UNIMPLEMENTED();}
\r
6254 void RADAPIENTRY radDepthStencilDepthWriteEnable (RADdepthStencilState depthStencil, RADboolean enable) {UNIMPLEMENTED();}
\r
6255 void RADAPIENTRY radDepthStencilDepthFunc (RADdepthStencilState depthStencil, RADdepthFunc func) {UNIMPLEMENTED();}
\r
6256 void RADAPIENTRY radDepthStencilStencilTestEnable (RADdepthStencilState depthStencil, RADboolean enable) {UNIMPLEMENTED();}
\r
6257 void RADAPIENTRY radDepthStencilStencilFunc (RADdepthStencilState depthStencil, RADfaceBitfield faces, RADstencilFunc func, RADint ref, RADuint mask) {UNIMPLEMENTED();}
\r
6258 void RADAPIENTRY radDepthStencilStencilOp (RADdepthStencilState depthStencil, RADfaceBitfield faces, RADstencilOp fail, RADstencilOp depthFail, RADstencilOp depthPass) {UNIMPLEMENTED();}
\r
6259 void RADAPIENTRY radDepthStencilStencilMask (RADdepthStencilState depthStencil, RADfaceBitfield faces, RADuint mask) {UNIMPLEMENTED();}
\r
6260 void RADAPIENTRY radDepthStencilDynamic (RADdepthStencilState depthStencil, RADdepthStencilDynamic dynamic, RADboolean enable) {UNIMPLEMENTED();}
\r
6261 RADvertexState RADAPIENTRY radCreateVertexState (RADdevice device) {UNIMPLEMENTED(); return 0;}
\r
6262 void RADAPIENTRY radReferenceVertexState (RADvertexState vertex) {UNIMPLEMENTED();}
\r
6263 void RADAPIENTRY radReleaseVertexState (RADvertexState vertex) {UNIMPLEMENTED();}
\r
6264 void RADAPIENTRY radVertexDefault (RADvertexState vertex) {UNIMPLEMENTED();}
\r
6265 void RADAPIENTRY radVertexAttribFormat (RADvertexState vertex, RADint attribIndex, RADint numComponents, RADint bytesPerComponent, RADattribType type, RADuint relativeOffset) {UNIMPLEMENTED();}
\r
6266 void RADAPIENTRY radVertexAttribBinding (RADvertexState vertex, RADint attribIndex, RADint bindingIndex) {UNIMPLEMENTED();}
\r
6267 void RADAPIENTRY radVertexBindingGroup (RADvertexState vertex, RADint bindingIndex, RADint group, RADint index) {UNIMPLEMENTED();}
\r
6268 void RADAPIENTRY radVertexAttribEnable (RADvertexState vertex, RADint attribIndex, RADboolean enable) {UNIMPLEMENTED();}
\r
6269 void RADAPIENTRY radVertexBindingStride (RADvertexState vertex, RADint bindingIndex, RADuint stride) {UNIMPLEMENTED();}
\r
6270 RADrtFormatState RADAPIENTRY radCreateRtFormatState (RADdevice device) {UNIMPLEMENTED(); return 0;}
\r
6271 void RADAPIENTRY radReferenceRtFormatState (RADrtFormatState rtFormat) {UNIMPLEMENTED();}
\r
6272 void RADAPIENTRY radReleaseRtFormatState (RADrtFormatState rtFormat) {UNIMPLEMENTED();}
\r
6273 void RADAPIENTRY radRtFormatDefault (RADrtFormatState rtFormat) {UNIMPLEMENTED();}
\r
6274 void RADAPIENTRY radRtFormatColorFormat (RADrtFormatState rtFormat, RADuint index, RADinternalFormat format) {UNIMPLEMENTED();}
\r
6275 void RADAPIENTRY radRtFormatDepthFormat (RADrtFormatState rtFormat, RADinternalFormat format) {UNIMPLEMENTED();}
\r
6276 void RADAPIENTRY radRtFormatStencilFormat (RADrtFormatState rtFormat, RADinternalFormat format) {UNIMPLEMENTED();}
\r
6277 void RADAPIENTRY radRtFormatColorSamples (RADrtFormatState rtFormat, RADuint samples) {UNIMPLEMENTED();}
\r
6278 void RADAPIENTRY radRtFormatDepthStencilSamples (RADrtFormatState rtFormat, RADuint samples) {UNIMPLEMENTED();}
\r
6279 RADpipeline RADAPIENTRY radCreatePipeline (RADdevice device, RADpipelineType pipelineType) {UNIMPLEMENTED(); return 0;}
\r
6280 void RADAPIENTRY radReferencePipeline (RADpipeline pipeline) {UNIMPLEMENTED();}
\r
6281 void RADAPIENTRY radReleasePipeline (RADpipeline pipeline) {UNIMPLEMENTED();}
\r
6282 void RADAPIENTRY radPipelineProgramStages (RADpipeline pipeline, RADbitfield stages, RADprogram program) {UNIMPLEMENTED();}
\r
6283 void RADAPIENTRY radPipelineVertexState (RADpipeline pipeline, RADvertexState vertex) {UNIMPLEMENTED();}
\r
6284 void RADAPIENTRY radPipelineColorState (RADpipeline pipeline, RADcolorState color) {UNIMPLEMENTED();}
\r
6285 void RADAPIENTRY radPipelineRasterState (RADpipeline pipeline, RADrasterState raster) {UNIMPLEMENTED();}
\r
6286 void RADAPIENTRY radPipelineDepthStencilState (RADpipeline pipeline, RADdepthStencilState depthStencil) {UNIMPLEMENTED();}
\r
6287 void RADAPIENTRY radPipelineRtFormatState (RADpipeline pipeline, RADrtFormatState rtFormat) {UNIMPLEMENTED();}
\r
6288 void RADAPIENTRY radPipelinePrimitiveType (RADpipeline pipeline, RADprimitiveType mode) {UNIMPLEMENTED();}
\r
6289 void RADAPIENTRY radCompilePipeline (RADpipeline pipeline) {UNIMPLEMENTED();}
\r
6290 RADpipelineHandle RADAPIENTRY radGetPipelineHandle (RADpipeline pipeline) {UNIMPLEMENTED(); return 0;}
\r
6291 RADcommandBuffer RADAPIENTRY radCreateCommandBuffer (RADdevice device, RADqueueType queueType) {UNIMPLEMENTED(); return 0;}
\r
6292 void RADAPIENTRY radReferenceCommandBuffer (RADcommandBuffer cmdBuf) {UNIMPLEMENTED();}
\r
6293 void RADAPIENTRY radReleaseCommandBuffer (RADcommandBuffer cmdBuf) {UNIMPLEMENTED();}
\r
6294 void RADAPIENTRY radCmdBindPipeline (RADcommandBuffer cmdBuf, RADpipelineType pipelineType, RADpipelineHandle pipelineHandle) {UNIMPLEMENTED();}
\r
6295 void RADAPIENTRY radCmdBindGroup (RADcommandBuffer cmdBuf, RADbitfield stages, RADuint group, RADuint count, RADbindGroupHandle groupHandle, RADuint offset) {UNIMPLEMENTED();}
\r
6296 void RADAPIENTRY radCmdDrawArrays (RADcommandBuffer cmdBuf, RADprimitiveType mode, RADint first, RADsizei count) {UNIMPLEMENTED();}
\r
6297 void RADAPIENTRY radCmdDrawElements (RADcommandBuffer cmdBuf, RADprimitiveType mode, RADindexType type, RADsizei count, RADindexHandle indexHandle, RADuint offset) {UNIMPLEMENTED();}
\r
6298 RADboolean RADAPIENTRY radCompileCommandBuffer (RADcommandBuffer cmdBuf) {UNIMPLEMENTED(); return 0;}
\r
6299 RADcommandHandle RADAPIENTRY radGetCommandHandle (RADcommandBuffer cmdBuf) {UNIMPLEMENTED(); return 0;}
\r
6300 void RADAPIENTRY radCmdStencilValueMask (RADcommandBuffer cmdBuf, RADfaceBitfield faces, RADuint mask) {UNIMPLEMENTED();}
\r
6301 void RADAPIENTRY radCmdStencilMask (RADcommandBuffer cmdBuf, RADfaceBitfield faces, RADuint mask) {UNIMPLEMENTED();}
\r
6302 void RADAPIENTRY radCmdStencilRef (RADcommandBuffer cmdBuf, RADfaceBitfield faces, RADint ref) {UNIMPLEMENTED();}
\r
6303 void RADAPIENTRY radCmdBlendColor (RADcommandBuffer cmdBuf, const RADfloat *blendColor) {UNIMPLEMENTED();}
\r
6304 void RADAPIENTRY radCmdPointSize (RADcommandBuffer cmdBuf, RADfloat pointSize) {UNIMPLEMENTED();}
\r
6305 void RADAPIENTRY radCmdLineWidth (RADcommandBuffer cmdBuf, RADfloat lineWidth) {UNIMPLEMENTED();}
\r
6306 void RADAPIENTRY radCmdPolygonOffsetClamp (RADcommandBuffer cmdBuf, RADfloat factor, RADfloat units, RADfloat clamp) {UNIMPLEMENTED();}
\r
6307 void RADAPIENTRY radCmdSampleMask (RADcommandBuffer cmdBuf, RADuint mask) {UNIMPLEMENTED();}
\r
6308 RADpass RADAPIENTRY radCreatePass (RADdevice device) {UNIMPLEMENTED(); return 0;}
\r
6309 void RADAPIENTRY radReferencePass (RADpass pass) {UNIMPLEMENTED();}
\r
6310 void RADAPIENTRY radReleasePass (RADpass pass) {UNIMPLEMENTED();}
\r
6311 void RADAPIENTRY radPassDefault (RADpass pass) {UNIMPLEMENTED();}
\r
6312 void RADAPIENTRY radCompilePass (RADpass pass) {UNIMPLEMENTED();}
\r
6313 void RADAPIENTRY radPassRenderTargets (RADpass pass, RADuint numColors, const RADrenderTargetHandle *colors, RADrenderTargetHandle depth, RADrenderTargetHandle stencil) {UNIMPLEMENTED();}
\r
6314 void RADAPIENTRY radPassPreserveEnable (RADpass pass, RADrtAttachment attachment, RADboolean enable) {UNIMPLEMENTED();}
\r
6315 void RADAPIENTRY radPassDiscard (RADpass pass, RADuint numTextures, const RADtexture *textures, const RADoffset2D *offsets) {UNIMPLEMENTED();}
\r
6316 void RADAPIENTRY radPassResolve (RADpass pass, RADrtAttachment attachment, RADtexture texture) {UNIMPLEMENTED();}
\r
6317 void RADAPIENTRY radPassStore (RADpass pass, RADuint numTextures, const RADtexture *textures, const RADoffset2D *offsets) {UNIMPLEMENTED();}
\r
6318 void RADAPIENTRY radPassClip (RADpass pass, const RADrect2D *rect) {UNIMPLEMENTED();}
\r
6319 void RADAPIENTRY radPassDependencies (RADpass pass, RADuint numPasses, const RADpass *otherPasses, const RADbitfield *srcMask, const RADbitfield *dstMask, const RADbitfield *flushMask, const RADbitfield *invalidateMask) {UNIMPLEMENTED();}
\r
6320 void RADAPIENTRY radPassTilingBoundary (RADpass pass, RADboolean boundary) {UNIMPLEMENTED();}
\r
6321 void RADAPIENTRY radPassTileFilterWidth (RADpass pass, RADuint filterWidth, RADuint filterHeight) {UNIMPLEMENTED();}
\r
6322 void RADAPIENTRY radPassTileFootprint (RADpass pass, RADuint bytesPerPixel, RADuint maxFilterWidth, RADuint maxFilterHeight) {UNIMPLEMENTED();}
\r
6323 RADsync RADAPIENTRY radCreateSync (RADdevice device) {UNIMPLEMENTED(); return 0;}
\r
6324 void RADAPIENTRY radReferenceSync (RADsync sync) {UNIMPLEMENTED();}
\r
6325 void RADAPIENTRY radReleaseSync (RADsync sync) {UNIMPLEMENTED();}
\r
6326 void RADAPIENTRY radQueueFenceSync (RADqueue queue, RADsync sync, RADsyncCondition condition, RADbitfield flags) {UNIMPLEMENTED();}
\r
6327 RADwaitSyncResult RADAPIENTRY radWaitSync (RADsync sync, RADuint64 timeout) {UNIMPLEMENTED(); return RAD_WAIT_SYNC_FAILED;}
\r
6328 RADboolean RADAPIENTRY radQueueWaitSync (RADqueue queue, RADsync sync) {UNIMPLEMENTED(); return 0;}
\r
6330 RADPROC RADAPIENTRY radGetProcAddress(const RADchar *procname)
\r
6338 static const Extension glExtensions[] =
\r
6340 #define EXTENSION(name) {#name, (RADPROC)name}
\r
6342 EXTENSION(radGetProcAddress),
\r
6343 EXTENSION(radCreateDevice),
\r
6344 EXTENSION(radReferenceDevice),
\r
6345 EXTENSION(radReleaseDevice),
\r
6346 EXTENSION(radGetTokenHeader),
\r
6347 EXTENSION(radCreateQueue),
\r
6348 EXTENSION(radReferenceQueue),
\r
6349 EXTENSION(radReleaseQueue),
\r
6350 EXTENSION(radQueueTagBuffer),
\r
6351 EXTENSION(radQueueTagTexture),
\r
6352 EXTENSION(radQueueSubmitCommands),
\r
6353 EXTENSION(radFlushQueue),
\r
6354 EXTENSION(radFinishQueue),
\r
6355 EXTENSION(radQueueViewport),
\r
6356 EXTENSION(radQueueScissor),
\r
6357 EXTENSION(radQueueCopyBufferToImage),
\r
6358 EXTENSION(radQueueCopyImageToBuffer),
\r
6359 EXTENSION(radQueueCopyBuffer),
\r
6360 EXTENSION(radQueueClearColor),
\r
6361 EXTENSION(radQueueClearDepth),
\r
6362 EXTENSION(radQueueClearStencil),
\r
6363 EXTENSION(radQueuePresent),
\r
6364 EXTENSION(radQueueDrawArrays),
\r
6365 EXTENSION(radQueueDrawElements),
\r
6366 EXTENSION(radQueueBindPipeline),
\r
6367 EXTENSION(radQueueBindGroup),
\r
6368 EXTENSION(radQueueBeginPass),
\r
6369 EXTENSION(radQueueEndPass),
\r
6370 EXTENSION(radQueueSubmitDynamic),
\r
6371 EXTENSION(radQueueStencilValueMask),
\r
6372 EXTENSION(radQueueStencilMask),
\r
6373 EXTENSION(radQueueStencilRef),
\r
6374 EXTENSION(radQueueBlendColor),
\r
6375 EXTENSION(radQueuePointSize),
\r
6376 EXTENSION(radQueueLineWidth),
\r
6377 EXTENSION(radQueuePolygonOffsetClamp),
\r
6378 EXTENSION(radQueueSampleMask),
\r
6379 EXTENSION(radCreateProgram),
\r
6380 EXTENSION(radReferenceProgram),
\r
6381 EXTENSION(radReleaseProgram),
\r
6382 EXTENSION(radProgramSource),
\r
6383 EXTENSION(radCreateBuffer),
\r
6384 EXTENSION(radReferenceBuffer),
\r
6385 EXTENSION(radReleaseBuffer),
\r
6386 EXTENSION(radBufferAccess),
\r
6387 EXTENSION(radBufferMapAccess),
\r
6388 EXTENSION(radBufferStorage),
\r
6389 EXTENSION(radMapBuffer),
\r
6390 EXTENSION(radGetVertexHandle),
\r
6391 EXTENSION(radGetIndexHandle),
\r
6392 EXTENSION(radGetUniformHandle),
\r
6393 EXTENSION(radGetBindGroupHandle),
\r
6394 EXTENSION(radCreateTexture),
\r
6395 EXTENSION(radReferenceTexture),
\r
6396 EXTENSION(radReleaseTexture),
\r
6397 EXTENSION(radTextureAccess),
\r
6398 EXTENSION(radTextureStorage),
\r
6399 EXTENSION(radGetTextureSamplerHandle),
\r
6400 EXTENSION(radGetTextureRenderTargetHandle),
\r
6401 EXTENSION(radCreateSampler),
\r
6402 EXTENSION(radReferenceSampler),
\r
6403 EXTENSION(radReleaseSampler),
\r
6404 EXTENSION(radSamplerDefault),
\r
6405 EXTENSION(radSamplerMinMagFilter),
\r
6406 EXTENSION(radSamplerWrapMode),
\r
6407 EXTENSION(radSamplerLodClamp),
\r
6408 EXTENSION(radSamplerLodBias),
\r
6409 EXTENSION(radSamplerCompare),
\r
6410 EXTENSION(radSamplerBorderColorFloat),
\r
6411 EXTENSION(radSamplerBorderColorInt),
\r
6412 EXTENSION(radCreateColorState),
\r
6413 EXTENSION(radReferenceColorState),
\r
6414 EXTENSION(radReleaseColorState),
\r
6415 EXTENSION(radColorDefault),
\r
6416 EXTENSION(radColorBlendEnable),
\r
6417 EXTENSION(radColorBlendFunc),
\r
6418 EXTENSION(radColorBlendEquation),
\r
6419 EXTENSION(radColorMask),
\r
6420 EXTENSION(radColorNumTargets),
\r
6421 EXTENSION(radColorLogicOpEnable),
\r
6422 EXTENSION(radColorLogicOp),
\r
6423 EXTENSION(radColorAlphaToCoverageEnable),
\r
6424 EXTENSION(radColorBlendColor),
\r
6425 EXTENSION(radColorDynamic),
\r
6426 EXTENSION(radCreateRasterState),
\r
6427 EXTENSION(radReferenceRasterState),
\r
6428 EXTENSION(radReleaseRasterState),
\r
6429 EXTENSION(radRasterDefault),
\r
6430 EXTENSION(radRasterPointSize),
\r
6431 EXTENSION(radRasterLineWidth),
\r
6432 EXTENSION(radRasterCullFace),
\r
6433 EXTENSION(radRasterFrontFace),
\r
6434 EXTENSION(radRasterPolygonMode),
\r
6435 EXTENSION(radRasterPolygonOffsetClamp),
\r
6436 EXTENSION(radRasterPolygonOffsetEnables),
\r
6437 EXTENSION(radRasterDiscardEnable),
\r
6438 EXTENSION(radRasterMultisampleEnable),
\r
6439 EXTENSION(radRasterSamples),
\r
6440 EXTENSION(radRasterSampleMask),
\r
6441 EXTENSION(radRasterDynamic),
\r
6442 EXTENSION(radCreateDepthStencilState),
\r
6443 EXTENSION(radReferenceDepthStencilState),
\r
6444 EXTENSION(radReleaseDepthStencilState),
\r
6445 EXTENSION(radDepthStencilDefault),
\r
6446 EXTENSION(radDepthStencilDepthTestEnable),
\r
6447 EXTENSION(radDepthStencilDepthWriteEnable),
\r
6448 EXTENSION(radDepthStencilDepthFunc),
\r
6449 EXTENSION(radDepthStencilStencilTestEnable),
\r
6450 EXTENSION(radDepthStencilStencilFunc),
\r
6451 EXTENSION(radDepthStencilStencilOp),
\r
6452 EXTENSION(radDepthStencilStencilMask),
\r
6453 EXTENSION(radDepthStencilDynamic),
\r
6454 EXTENSION(radCreateVertexState),
\r
6455 EXTENSION(radReferenceVertexState),
\r
6456 EXTENSION(radReleaseVertexState),
\r
6457 EXTENSION(radVertexDefault),
\r
6458 EXTENSION(radVertexAttribFormat),
\r
6459 EXTENSION(radVertexAttribBinding),
\r
6460 EXTENSION(radVertexBindingGroup),
\r
6461 EXTENSION(radVertexAttribEnable),
\r
6462 EXTENSION(radVertexBindingStride),
\r
6463 EXTENSION(radCreateRtFormatState),
\r
6464 EXTENSION(radReferenceRtFormatState),
\r
6465 EXTENSION(radReleaseRtFormatState),
\r
6466 EXTENSION(radRtFormatDefault),
\r
6467 EXTENSION(radRtFormatColorFormat),
\r
6468 EXTENSION(radRtFormatDepthFormat),
\r
6469 EXTENSION(radRtFormatStencilFormat),
\r
6470 EXTENSION(radRtFormatColorSamples),
\r
6471 EXTENSION(radRtFormatDepthStencilSamples),
\r
6472 EXTENSION(radCreatePipeline),
\r
6473 EXTENSION(radReferencePipeline),
\r
6474 EXTENSION(radReleasePipeline),
\r
6475 EXTENSION(radPipelineProgramStages),
\r
6476 EXTENSION(radPipelineVertexState),
\r
6477 EXTENSION(radPipelineColorState),
\r
6478 EXTENSION(radPipelineRasterState),
\r
6479 EXTENSION(radPipelineDepthStencilState),
\r
6480 EXTENSION(radPipelineRtFormatState),
\r
6481 EXTENSION(radPipelinePrimitiveType),
\r
6482 EXTENSION(radCompilePipeline),
\r
6483 EXTENSION(radGetPipelineHandle),
\r
6484 EXTENSION(radCreateCommandBuffer),
\r
6485 EXTENSION(radReferenceCommandBuffer),
\r
6486 EXTENSION(radReleaseCommandBuffer),
\r
6487 EXTENSION(radCmdBindPipeline),
\r
6488 EXTENSION(radCmdBindGroup),
\r
6489 EXTENSION(radCmdDrawArrays),
\r
6490 EXTENSION(radCmdDrawElements),
\r
6491 EXTENSION(radCompileCommandBuffer),
\r
6492 EXTENSION(radGetCommandHandle),
\r
6493 EXTENSION(radCmdStencilValueMask),
\r
6494 EXTENSION(radCmdStencilMask),
\r
6495 EXTENSION(radCmdStencilRef),
\r
6496 EXTENSION(radCmdBlendColor),
\r
6497 EXTENSION(radCmdPointSize),
\r
6498 EXTENSION(radCmdLineWidth),
\r
6499 EXTENSION(radCmdPolygonOffsetClamp),
\r
6500 EXTENSION(radCmdSampleMask),
\r
6501 EXTENSION(radCreatePass),
\r
6502 EXTENSION(radReferencePass),
\r
6503 EXTENSION(radReleasePass),
\r
6504 EXTENSION(radPassDefault),
\r
6505 EXTENSION(radCompilePass),
\r
6506 EXTENSION(radPassRenderTargets),
\r
6507 EXTENSION(radPassPreserveEnable),
\r
6508 EXTENSION(radPassDiscard),
\r
6509 EXTENSION(radPassResolve),
\r
6510 EXTENSION(radPassStore),
\r
6511 EXTENSION(radPassClip),
\r
6512 EXTENSION(radPassDependencies),
\r
6513 EXTENSION(radPassTilingBoundary),
\r
6514 EXTENSION(radPassTileFilterWidth),
\r
6515 EXTENSION(radPassTileFootprint),
\r
6516 EXTENSION(radCreateSync),
\r
6517 EXTENSION(radReferenceSync),
\r
6518 EXTENSION(radReleaseSync),
\r
6519 EXTENSION(radQueueFenceSync),
\r
6520 EXTENSION(radWaitSync),
\r
6521 EXTENSION(radQueueWaitSync),
\r
6526 for(int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
\r
6528 if(strcmp(procname, glExtensions[ext].name) == 0)
\r
6530 return (RADPROC)glExtensions[ext].address;
\r
6537 __eglMustCastToProperFunctionPointerType glGetProcAddress(const char *procname)
\r
6542 __eglMustCastToProperFunctionPointerType address;
\r
6545 static const Extension glExtensions[] =
\r
6547 #define EXTENSION(name) {#name, (__eglMustCastToProperFunctionPointerType)name}
\r
6549 EXTENSION(glTexImage3DOES),
\r
6550 EXTENSION(glBlitFramebufferANGLE),
\r
6551 EXTENSION(glRenderbufferStorageMultisampleANGLE),
\r
6552 EXTENSION(glDeleteFencesNV),
\r
6553 EXTENSION(glGenFencesNV),
\r
6554 EXTENSION(glIsFenceNV),
\r
6555 EXTENSION(glTestFenceNV),
\r
6556 EXTENSION(glGetFenceivNV),
\r
6557 EXTENSION(glFinishFenceNV),
\r
6558 EXTENSION(glSetFenceNV),
\r
6559 EXTENSION(glGetGraphicsResetStatusEXT),
\r
6560 EXTENSION(glReadnPixelsEXT),
\r
6561 EXTENSION(glGetnUniformfvEXT),
\r
6562 EXTENSION(glGetnUniformivEXT),
\r
6563 EXTENSION(glGenQueriesEXT),
\r
6564 EXTENSION(glDeleteQueriesEXT),
\r
6565 EXTENSION(glIsQueryEXT),
\r
6566 EXTENSION(glBeginQueryEXT),
\r
6567 EXTENSION(glEndQueryEXT),
\r
6568 EXTENSION(glGetQueryivEXT),
\r
6569 EXTENSION(glGetQueryObjectuivEXT),
\r
6570 EXTENSION(glEGLImageTargetTexture2DOES),
\r
6572 EXTENSION(radGetProcAddress),
\r
6577 for(int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
\r
6579 if(strcmp(procname, glExtensions[ext].name) == 0)
\r
6581 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
\r
6588 void GL_APIENTRY Register(const char *licenseKey)
\r
6590 RegisterLicenseKey(licenseKey);
\r