- if(level < 0 || level >= rad::IMPLEMENTATION_MAX_TEXTURE_LEVELS || width < 0 || height < 0)\r
- {\r
- return false;\r
- }\r
-\r
- return true;\r
-}\r
-\r
-static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei height, GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, rad::Texture *texture)\r
-{\r
- if(!texture)\r
- {\r
- return error(GL_INVALID_OPERATION, false);\r
- }\r
-\r
- if(compressed != texture->isCompressed(target, level))\r
- {\r
- return error(GL_INVALID_OPERATION, false);\r
- }\r
-\r
- if(format != GL_NONE && format != texture->getFormat(target, level))\r
- {\r
- return error(GL_INVALID_OPERATION, false);\r
- }\r
-\r
- if(compressed)\r
- {\r
- if((width % 4 != 0 && width != texture->getWidth(target, 0)) || \r
- (height % 4 != 0 && height != texture->getHeight(target, 0)))\r
- {\r
- return error(GL_INVALID_OPERATION, false);\r
- }\r
- }\r
-\r
- if(xoffset + width > texture->getWidth(target, level) ||\r
- yoffset + height > texture->getHeight(target, level))\r
- {\r
- return error(GL_INVALID_VALUE, false);\r
- }\r
-\r
- return true;\r
-}\r
-\r
-// Check for combinations of format and type that are valid for ReadPixels\r
-static bool validReadFormatType(GLenum format, GLenum type)\r
-{\r
- switch(format)\r
- {\r
- case GL_RGBA:\r
- switch (type)\r
- {\r
- case GL_UNSIGNED_BYTE:\r
- break;\r
- default:\r
- return false;\r
- }\r
- break;\r
- case GL_BGRA_EXT:\r
- switch (type)\r
- {\r
- case GL_UNSIGNED_BYTE:\r
- case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:\r
- case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:\r
- break;\r
- default:\r
- return false;\r
- }\r
- break;\r
- case rad::IMPLEMENTATION_COLOR_READ_FORMAT:\r
- switch (type)\r
- {\r
- case rad::IMPLEMENTATION_COLOR_READ_TYPE:\r
- break;\r
- default:\r
- return false;\r
- }\r
- break;\r
- default:\r
- return false;\r
- }\r
-\r
- return true;\r
-}\r
-\r
-extern "C"\r
-{\r
-\r
-void GL_APIENTRY glActiveTexture(GLenum texture)\r
-{\r
- TRACE("(GLenum texture = 0x%X)", texture);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + rad::MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- context->setActiveSampler(texture - GL_TEXTURE0);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glAttachShader(GLuint program, GLuint shader)\r
-{\r
- TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Program *programObject = context->getProgram(program);\r
- rad::Shader *shaderObject = context->getShader(shader);\r
-\r
- if(!programObject)\r
- {\r
- if(context->getShader(program))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- }\r
-\r
- if(!shaderObject)\r
- {\r
- if(context->getProgram(shader))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- }\r
-\r
- if(!programObject->attachShader(shaderObject))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glBeginQueryEXT(GLenum target, GLuint id)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLuint %d)", target, id);\r
-\r
- try\r
- {\r
- switch(target)\r
- {\r
- case GL_ANY_SAMPLES_PASSED_EXT: \r
- case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:\r
- break;\r
- default: \r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- if(id == 0)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->beginQuery(target, id);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)\r
-{\r
- TRACE("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);\r
-\r
- try\r
- {\r
- if(index >= rad::MAX_VERTEX_ATTRIBS)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Program *programObject = context->getProgram(program);\r
-\r
- if(!programObject)\r
- {\r
- if(context->getShader(program))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- }\r
-\r
- if(strncmp(name, "gl_", 3) == 0)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- programObject->bindAttributeLocation(index, name);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- switch(target)\r
- {\r
- case GL_ARRAY_BUFFER:\r
- context->bindArrayBuffer(buffer);\r
- return;\r
- case GL_ELEMENT_ARRAY_BUFFER:\r
- context->bindElementArrayBuffer(buffer);\r
- return;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glBindFramebuffer(GLenum target, GLuint framebuffer)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);\r
-\r
- try\r
- {\r
- if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)\r
- {\r
- context->bindReadFramebuffer(framebuffer);\r
- }\r
- \r
- if(target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)\r
- {\r
- context->bindDrawFramebuffer(framebuffer);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glBindRenderbuffer(GLenum target, GLuint renderbuffer)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);\r
-\r
- try\r
- {\r
- if(target != GL_RENDERBUFFER)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if (renderbuffer != 0 && !context->getRenderbuffer(renderbuffer))
- {
- // [OpenGL ES 2.0.25] Section 4.4.3 page 112\r
- // [OpenGL ES 3.0.2] Section 4.4.2 page 201\r
- // 'renderbuffer' must be either zero or the name of an existing renderbuffer object of\r
- // type 'renderbuffertarget', otherwise an INVALID_OPERATION error is generated.\r
- return error(GL_INVALID_OPERATION);
- }\r
-\r
- context->bindRenderbuffer(renderbuffer);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glBindTexture(GLenum target, GLuint texture)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Texture *textureObject = context->getTexture(texture);\r
-\r
- if(textureObject && textureObject->getTarget() != target && texture != 0)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- switch(target)\r
- {\r
- case GL_TEXTURE_2D:\r
- context->bindTexture2D(texture);\r
- return;\r
- case GL_TEXTURE_CUBE_MAP:\r
- context->bindTextureCubeMap(texture);\r
- return;\r
- case GL_TEXTURE_EXTERNAL_OES:\r
- context->bindTextureExternal(texture);\r
- return;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)\r
-{\r
- TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",\r
- red, green, blue, alpha);\r
-\r
- try\r
- {\r
- rad::Context* context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setBlendColor(rad::clamp01(red), rad::clamp01(green), rad::clamp01(blue), rad::clamp01(alpha));\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glBlendEquation(GLenum mode)\r
-{\r
- glBlendEquationSeparate(mode, mode);\r
-}\r
-\r
-void GL_APIENTRY glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)\r
-{\r
- TRACE("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);\r
-\r
- try\r
- {\r
- switch(modeRGB)\r
- {\r
- case GL_FUNC_ADD:\r
- case GL_FUNC_SUBTRACT:\r
- case GL_FUNC_REVERSE_SUBTRACT:\r
- case GL_MIN_EXT:\r
- case GL_MAX_EXT:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- switch(modeAlpha)\r
- {\r
- case GL_FUNC_ADD:\r
- case GL_FUNC_SUBTRACT:\r
- case GL_FUNC_REVERSE_SUBTRACT:\r
- case GL_MIN_EXT:\r
- case GL_MAX_EXT:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setBlendEquation(modeRGB, modeAlpha);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor)\r
-{\r
- glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);\r
-}\r
-\r
-void GL_APIENTRY glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)\r
-{\r
- TRACE("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",\r
- srcRGB, dstRGB, srcAlpha, dstAlpha);\r
-\r
- try\r
- {\r
- switch(srcRGB)\r
- {\r
- case GL_ZERO:\r
- case GL_ONE:\r
- case GL_SRC_COLOR:\r
- case GL_ONE_MINUS_SRC_COLOR:\r
- case GL_DST_COLOR:\r
- case GL_ONE_MINUS_DST_COLOR:\r
- case GL_SRC_ALPHA:\r
- case GL_ONE_MINUS_SRC_ALPHA:\r
- case GL_DST_ALPHA:\r
- case GL_ONE_MINUS_DST_ALPHA:\r
- case GL_CONSTANT_COLOR:\r
- case GL_ONE_MINUS_CONSTANT_COLOR:\r
- case GL_CONSTANT_ALPHA:\r
- case GL_ONE_MINUS_CONSTANT_ALPHA:\r
- case GL_SRC_ALPHA_SATURATE:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- switch(dstRGB)\r
- {\r
- case GL_ZERO:\r
- case GL_ONE:\r
- case GL_SRC_COLOR:\r
- case GL_ONE_MINUS_SRC_COLOR:\r
- case GL_DST_COLOR:\r
- case GL_ONE_MINUS_DST_COLOR:\r
- case GL_SRC_ALPHA:\r
- case GL_ONE_MINUS_SRC_ALPHA:\r
- case GL_DST_ALPHA:\r
- case GL_ONE_MINUS_DST_ALPHA:\r
- case GL_CONSTANT_COLOR:\r
- case GL_ONE_MINUS_CONSTANT_COLOR:\r
- case GL_CONSTANT_ALPHA:\r
- case GL_ONE_MINUS_CONSTANT_ALPHA:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- switch(srcAlpha)\r
- {\r
- case GL_ZERO:\r
- case GL_ONE:\r
- case GL_SRC_COLOR:\r
- case GL_ONE_MINUS_SRC_COLOR:\r
- case GL_DST_COLOR:\r
- case GL_ONE_MINUS_DST_COLOR:\r
- case GL_SRC_ALPHA:\r
- case GL_ONE_MINUS_SRC_ALPHA:\r
- case GL_DST_ALPHA:\r
- case GL_ONE_MINUS_DST_ALPHA:\r
- case GL_CONSTANT_COLOR:\r
- case GL_ONE_MINUS_CONSTANT_COLOR:\r
- case GL_CONSTANT_ALPHA:\r
- case GL_ONE_MINUS_CONSTANT_ALPHA:\r
- case GL_SRC_ALPHA_SATURATE:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- switch(dstAlpha)\r
- {\r
- case GL_ZERO:\r
- case GL_ONE:\r
- case GL_SRC_COLOR:\r
- case GL_ONE_MINUS_SRC_COLOR:\r
- case GL_DST_COLOR:\r
- case GL_ONE_MINUS_DST_COLOR:\r
- case GL_SRC_ALPHA:\r
- case GL_ONE_MINUS_SRC_ALPHA:\r
- case GL_DST_ALPHA:\r
- case GL_ONE_MINUS_DST_ALPHA:\r
- case GL_CONSTANT_COLOR:\r
- case GL_ONE_MINUS_CONSTANT_COLOR:\r
- case GL_CONSTANT_ALPHA:\r
- case GL_ONE_MINUS_CONSTANT_ALPHA:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",\r
- target, size, data, usage);\r
-\r
- try\r
- {\r
- if(size < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- switch(usage)\r
- {\r
- case GL_STREAM_DRAW:\r
- case GL_STATIC_DRAW:\r
- case GL_DYNAMIC_DRAW:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Buffer *buffer;\r
-\r
- switch(target)\r
- {\r
- case GL_ARRAY_BUFFER:\r
- buffer = context->getArrayBuffer();\r
- break;\r
- case GL_ELEMENT_ARRAY_BUFFER:\r
- buffer = context->getElementArrayBuffer();\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- if(!buffer)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- buffer->bufferData(data, size, usage);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",\r
- target, offset, size, data);\r
-\r
- try\r
- {\r
- if(size < 0 || offset < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- if(data == NULL)\r
- {\r
- return;\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Buffer *buffer;\r
-\r
- switch(target)\r
- {\r
- case GL_ARRAY_BUFFER:\r
- buffer = context->getArrayBuffer();\r
- break;\r
- case GL_ELEMENT_ARRAY_BUFFER:\r
- buffer = context->getElementArrayBuffer();\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- if(!buffer)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- if((size_t)size + offset > buffer->size())\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- buffer->bufferSubData(data, size, offset);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-GLenum GL_APIENTRY glCheckFramebufferStatus(GLenum target)\r
-{\r
- TRACE("(GLenum target = 0x%X)", target);\r
-\r
- try\r
- {\r
- if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)\r
- {\r
- return error(GL_INVALID_ENUM, 0);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Framebuffer *framebuffer = NULL;\r
- if(target == GL_READ_FRAMEBUFFER_ANGLE)\r
- {\r
- framebuffer = context->getReadFramebuffer();\r
- }\r
- else\r
- {\r
- framebuffer = context->getDrawFramebuffer();\r
- }\r
-\r
- return framebuffer->completeness();\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, 0);\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-void GL_APIENTRY glClear(GLbitfield mask)\r
-{\r
- TRACE("(GLbitfield mask = %X)", mask);\r
-\r
- try\r
- {\r
- if((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->clear(mask);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)\r
-{\r
- TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",\r
- red, green, blue, alpha);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setClearColor(red, green, blue, alpha);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glClearDepthf(GLclampf depth)\r
-{\r
- TRACE("(GLclampf depth = %f)", depth);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setClearDepth(depth);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glClearStencil(GLint s)\r
-{\r
- TRACE("(GLint s = %d)", s);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setClearStencil(s);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)\r
-{\r
- TRACE("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",\r
- red, green, blue, alpha);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glCompileShader(GLuint shader)\r
-{\r
- TRACE("(GLuint shader = %d)", shader);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Shader *shaderObject = context->getShader(shader);\r
-\r
- if(!shaderObject)\r
- {\r
- if(context->getProgram(shader))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- }\r
-\r
- shaderObject->compile();\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, \r
- GLint border, GLsizei imageSize, const GLvoid* data)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, " \r
- "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",\r
- target, level, internalformat, width, height, border, imageSize, data);\r
-\r
- try\r
- {\r
- if(!validImageSize(level, width, height) || border != 0 || imageSize < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- switch(internalformat)\r
- {\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- if(!S3TC_SUPPORT)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
- case GL_DEPTH_COMPONENT:\r
- case GL_DEPTH_COMPONENT16:\r
- case GL_DEPTH_COMPONENT32_OES:\r
- case GL_DEPTH_STENCIL_OES:\r
- case GL_DEPTH24_STENCIL8_OES:\r
- return error(GL_INVALID_OPERATION);\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- if(border != 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(level > rad::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- switch(target)\r
- {\r
- case GL_TEXTURE_2D:\r
- if(width > (rad::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||\r
- height > (rad::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- break;\r
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:\r
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:\r
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:\r
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:\r
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:\r
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:\r
- if(width != height)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- if(width > (rad::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) ||\r
- height > (rad::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level))\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- if(imageSize != rad::ComputeCompressedSize(width, height, internalformat))\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- if(target == GL_TEXTURE_2D)\r
- {\r
- rad::Texture2D *texture = context->getTexture2D();\r
-\r
- if(!texture)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- texture->setCompressedImage(level, internalformat, width, height, imageSize, data);\r
- }\r
- else\r
- {\r
- rad::TextureCubeMap *texture = context->getTextureCubeMap();\r
-\r
- if(!texture)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- switch(target)\r
- {\r
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:\r
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:\r
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:\r
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:\r
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:\r
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:\r
- texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);\r
- break;\r
- default: UNREACHABLE();\r
- }\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,\r
- GLenum format, GLsizei imageSize, const GLvoid* data)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "\r
- "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "\r
- "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",\r
- target, level, xoffset, yoffset, width, height, format, imageSize, data);\r
-\r
- try\r
- {\r
- if(!rad::IsTextureTarget(target))\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- if(xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- switch(format)\r
- {\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- if(!S3TC_SUPPORT)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- if(width == 0 || height == 0 || data == NULL)\r
- {\r
- return;\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(level > rad::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- if(imageSize != rad::ComputeCompressedSize(width, height, format))\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- if(xoffset % 4 != 0 || yoffset % 4 != 0)\r
- {\r
- // We wait to check the offsets until this point, because the multiple-of-four restriction does not exist unless DXT1 textures are supported\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- if(target == GL_TEXTURE_2D)\r
- {\r
- rad::Texture2D *texture = context->getTexture2D();\r
-\r
- if(validateSubImageParams(true, width, height, xoffset, yoffset, target, level, format, texture))\r
- {\r
- texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);\r
- }\r
- }\r
- else if(rad::IsCubemapTextureTarget(target))\r
- {\r
- rad::TextureCubeMap *texture = context->getTextureCubeMap();\r
-\r
- if(validateSubImageParams(true, width, height, xoffset, yoffset, target, level, format, texture))\r
- {\r
- texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);\r
- }\r
- }\r
- else\r
- {\r
- UNREACHABLE();\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "\r
- "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",\r
- target, level, internalformat, x, y, width, height, border);\r
-\r
- try\r
- {\r
- if(!validImageSize(level, width, height))\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- if(border != 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- switch(target)\r
- {\r
- case GL_TEXTURE_2D:\r
- if(width > (rad::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||\r
- height > (rad::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- break;\r
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:\r
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:\r
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:\r
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:\r
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:\r
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:\r
- if(width != height)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- if(width > (rad::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) ||\r
- height > (rad::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level))\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- rad::Framebuffer *framebuffer = context->getReadFramebuffer();\r
-\r
- if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)\r
- {\r
- return error(GL_INVALID_FRAMEBUFFER_OPERATION);\r
- }\r
-\r
- if(context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() > 1)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- rad::Renderbuffer *source = framebuffer->getColorbuffer();\r
- GLenum colorbufferFormat = source->getFormat();\r
-\r
- // [OpenGL ES 2.0.24] table 3.9\r
- switch(internalformat)\r
- {\r
- case GL_ALPHA:\r
- if(colorbufferFormat != GL_ALPHA &&\r
- colorbufferFormat != GL_RGBA &&\r
- colorbufferFormat != GL_RGBA4 &&\r
- colorbufferFormat != GL_RGB5_A1 &&\r
- colorbufferFormat != GL_RGBA8_OES)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- break;\r
- case GL_LUMINANCE:\r
- case GL_RGB:\r
- if(colorbufferFormat != GL_RGB &&\r
- colorbufferFormat != GL_RGB565 &&\r
- colorbufferFormat != GL_RGB8_OES &&\r
- colorbufferFormat != GL_RGBA &&\r
- colorbufferFormat != GL_RGBA4 &&\r
- colorbufferFormat != GL_RGB5_A1 &&\r
- colorbufferFormat != GL_RGBA8_OES)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- break;\r
- case GL_LUMINANCE_ALPHA:\r
- case GL_RGBA:\r
- if(colorbufferFormat != GL_RGBA &&\r
- colorbufferFormat != GL_RGBA4 &&\r
- colorbufferFormat != GL_RGB5_A1 &&\r
- colorbufferFormat != GL_RGBA8_OES)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- break;\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- if(S3TC_SUPPORT)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- if(target == GL_TEXTURE_2D)\r
- {\r
- rad::Texture2D *texture = context->getTexture2D();\r
-\r
- if(!texture)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- texture->copyImage(level, internalformat, x, y, width, height, framebuffer);\r
- }\r
- else if(rad::IsCubemapTextureTarget(target))\r
- {\r
- rad::TextureCubeMap *texture = context->getTextureCubeMap();\r
-\r
- if(!texture)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);\r
- }\r
- else UNREACHABLE();\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "\r
- "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",\r
- target, level, xoffset, yoffset, x, y, width, height);\r
-\r
- try\r
- {\r
- if(!rad::IsTextureTarget(target))\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- if(level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- if(std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- if(width == 0 || height == 0)\r
- {\r
- return;\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(level > rad::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Framebuffer *framebuffer = context->getReadFramebuffer();\r
-\r
- if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)\r
- {\r
- return error(GL_INVALID_FRAMEBUFFER_OPERATION);\r
- }\r
-\r
- if(context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() > 1)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- rad::Renderbuffer *source = framebuffer->getColorbuffer();\r
- GLenum colorbufferFormat = source->getFormat();\r
- rad::Texture *texture = NULL;\r
-\r
- if(target == GL_TEXTURE_2D)\r
- {\r
- texture = context->getTexture2D();\r
- }\r
- else if(rad::IsCubemapTextureTarget(target))\r
- {\r
- texture = context->getTextureCubeMap();\r
- }\r
- else UNREACHABLE();\r
-\r
- if(!validateSubImageParams(false, width, height, xoffset, yoffset, target, level, GL_NONE, texture))\r
- {\r
- return;\r
- }\r
-\r
- GLenum textureFormat = texture->getFormat(target, level);\r
-\r
- // [OpenGL ES 2.0.24] table 3.9\r
- switch(textureFormat)\r
- {\r
- case GL_ALPHA:\r
- if(colorbufferFormat != GL_ALPHA &&\r
- colorbufferFormat != GL_RGBA &&\r
- colorbufferFormat != GL_RGBA4 &&\r
- colorbufferFormat != GL_RGB5_A1 &&\r
- colorbufferFormat != GL_RGBA8_OES)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- break;\r
- case GL_LUMINANCE:\r
- case GL_RGB:\r
- if(colorbufferFormat != GL_RGB &&\r
- colorbufferFormat != GL_RGB565 &&\r
- colorbufferFormat != GL_RGB8_OES &&\r
- colorbufferFormat != GL_RGBA &&\r
- colorbufferFormat != GL_RGBA4 &&\r
- colorbufferFormat != GL_RGB5_A1 &&\r
- colorbufferFormat != GL_RGBA8_OES)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- break;\r
- case GL_LUMINANCE_ALPHA:\r
- case GL_RGBA:\r
- if(colorbufferFormat != GL_RGBA &&\r
- colorbufferFormat != GL_RGBA4 &&\r
- colorbufferFormat != GL_RGB5_A1 &&\r
- colorbufferFormat != GL_RGBA8_OES)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- break;\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- return error(GL_INVALID_OPERATION);\r
- case GL_DEPTH_COMPONENT:\r
- case GL_DEPTH_STENCIL_OES:\r
- return error(GL_INVALID_OPERATION);\r
- default:\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);\r
- }\r
- }\r
-\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-GLuint GL_APIENTRY glCreateProgram(void)\r
-{\r
- TRACE("()");\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- return context->createProgram();\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, 0);\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-GLuint GL_APIENTRY glCreateShader(GLenum type)\r
-{\r
- TRACE("(GLenum type = 0x%X)", type);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- switch(type)\r
- {\r
- case GL_FRAGMENT_SHADER:\r
- case GL_VERTEX_SHADER:\r
- return context->createShader(type);\r
- default:\r
- return error(GL_INVALID_ENUM, 0);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, 0);\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-void GL_APIENTRY glCullFace(GLenum mode)\r
-{\r
- TRACE("(GLenum mode = 0x%X)", mode);\r
-\r
- try\r
- {\r
- switch(mode)\r
- {\r
- case GL_FRONT:\r
- case GL_BACK:\r
- case GL_FRONT_AND_BACK:\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setCullMode(mode);\r
- }\r
- }\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDeleteBuffers(GLsizei n, const GLuint* buffers)\r
-{\r
- TRACE("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);\r
-\r
- try\r
- {\r
- if(n < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- for(int i = 0; i < n; i++)\r
- {\r
- context->deleteBuffer(buffers[i]);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDeleteFencesNV(GLsizei n, const GLuint* fences)\r
-{\r
- TRACE("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);\r
-\r
- try\r
- {\r
- if(n < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- for(int i = 0; i < n; i++)\r
- {\r
- context->deleteFence(fences[i]);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)\r
-{\r
- TRACE("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);\r
-\r
- try\r
- {\r
- if(n < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- for(int i = 0; i < n; i++)\r
- {\r
- if(framebuffers[i] != 0)\r
- {\r
- context->deleteFramebuffer(framebuffers[i]);\r
- }\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDeleteProgram(GLuint program)\r
-{\r
- TRACE("(GLuint program = %d)", program);\r
-\r
- try\r
- {\r
- if(program == 0)\r
- {\r
- return;\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(!context->getProgram(program))\r
- {\r
- if(context->getShader(program))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- }\r
-\r
- context->deleteProgram(program);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDeleteQueriesEXT(GLsizei n, const GLuint *ids)\r
-{\r
- TRACE("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);\r
-\r
- try\r
- {\r
- if(n < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- for(int i = 0; i < n; i++)\r
- {\r
- context->deleteQuery(ids[i]);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)\r
-{\r
- TRACE("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);\r
-\r
- try\r
- {\r
- if(n < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- for(int i = 0; i < n; i++)\r
- {\r
- context->deleteRenderbuffer(renderbuffers[i]);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDeleteShader(GLuint shader)\r
-{\r
- TRACE("(GLuint shader = %d)", shader);\r
-\r
- try\r
- {\r
- if(shader == 0)\r
- {\r
- return;\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(!context->getShader(shader))\r
- {\r
- if(context->getProgram(shader))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- }\r
-\r
- context->deleteShader(shader);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDeleteTextures(GLsizei n, const GLuint* textures)\r
-{\r
- TRACE("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);\r
-\r
- try\r
- {\r
- if(n < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- for(int i = 0; i < n; i++)\r
- {\r
- if(textures[i] != 0)\r
- {\r
- context->deleteTexture(textures[i]);\r
- }\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDepthFunc(GLenum func)\r
-{\r
- TRACE("(GLenum func = 0x%X)", func);\r
-\r
- try\r
- {\r
- switch(func)\r
- {\r
- case GL_NEVER:\r
- case GL_ALWAYS:\r
- case GL_LESS:\r
- case GL_LEQUAL:\r
- case GL_EQUAL:\r
- case GL_GREATER:\r
- case GL_GEQUAL:\r
- case GL_NOTEQUAL:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setDepthFunc(func);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDepthMask(GLboolean flag)\r
-{\r
- TRACE("(GLboolean flag = %d)", flag);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setDepthMask(flag != GL_FALSE);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDepthRangef(GLclampf zNear, GLclampf zFar)\r
-{\r
- TRACE("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setDepthRange(zNear, zFar);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDetachShader(GLuint program, GLuint shader)\r
-{\r
- TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
-\r
- rad::Program *programObject = context->getProgram(program);\r
- rad::Shader *shaderObject = context->getShader(shader);\r
- \r
- if(!programObject)\r
- {\r
- rad::Shader *shaderByProgramHandle;\r
- shaderByProgramHandle = context->getShader(program);\r
- if(!shaderByProgramHandle)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- }\r
-\r
- if(!shaderObject)\r
- {\r
- rad::Program *programByShaderHandle = context->getProgram(shader);\r
- if(!programByShaderHandle)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- }\r
-\r
- if(!programObject->detachShader(shaderObject))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDisable(GLenum cap)\r
-{\r
- TRACE("(GLenum cap = 0x%X)", cap);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- switch(cap)\r
- {\r
- case GL_CULL_FACE: context->setCullFace(false); break;\r
- case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;\r
- case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;\r
- case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;\r
- case GL_SCISSOR_TEST: context->setScissorTest(false); break;\r
- case GL_STENCIL_TEST: context->setStencilTest(false); break;\r
- case GL_DEPTH_TEST: context->setDepthTest(false); break;\r
- case GL_BLEND: context->setBlend(false); break;\r
- case GL_DITHER: context->setDither(false); break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDisableVertexAttribArray(GLuint index)\r
-{\r
- TRACE("(GLuint index = %d)", index);\r
-\r
- try\r
- {\r
- if(index >= rad::MAX_VERTEX_ATTRIBS)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setEnableVertexAttribArray(index, false);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count)\r
-{\r
- TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);\r
-\r
- try\r
- {\r
- if(count < 0 || first < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->drawArrays(mode, first, count);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)\r
-{\r
- TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",\r
- mode, count, type, indices);\r
-\r
- try\r
- {\r
- if(count < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- switch(type)\r
- {\r
- case GL_UNSIGNED_BYTE:\r
- case GL_UNSIGNED_SHORT:\r
- case GL_UNSIGNED_INT:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- \r
- context->drawElements(mode, count, type, indices);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glEnable(GLenum cap)\r
-{\r
- TRACE("(GLenum cap = 0x%X)", cap);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- switch(cap)\r
- {\r
- case GL_CULL_FACE: context->setCullFace(true); break;\r
- case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;\r
- case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;\r
- case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;\r
- case GL_SCISSOR_TEST: context->setScissorTest(true); break;\r
- case GL_STENCIL_TEST: context->setStencilTest(true); break;\r
- case GL_DEPTH_TEST: context->setDepthTest(true); break;\r
- case GL_BLEND: context->setBlend(true); break;\r
- case GL_DITHER: context->setDither(true); break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glEnableVertexAttribArray(GLuint index)\r
-{\r
- TRACE("(GLuint index = %d)", index);\r
-\r
- try\r
- {\r
- if(index >= rad::MAX_VERTEX_ATTRIBS)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setEnableVertexAttribArray(index, true);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glEndQueryEXT(GLenum target)\r
-{\r
- TRACE("GLenum target = 0x%X)", target);\r
-\r
- try\r
- {\r
- switch(target)\r
- {\r
- case GL_ANY_SAMPLES_PASSED_EXT: \r
- case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:\r
- break;\r
- default: \r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->endQuery(target);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glFinishFenceNV(GLuint fence)\r
-{\r
- TRACE("(GLuint fence = %d)", fence);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Fence* fenceObject = context->getFence(fence);\r
-\r
- if(fenceObject == NULL)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- fenceObject->finishFence();\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glFinish(void)\r
-{\r
- TRACE("()");\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->finish();\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glFlush(void)\r
-{\r
- TRACE("()");\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->flush();\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "\r
- "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);\r
-\r
- try\r
- {\r
- if((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)\r
- || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Framebuffer *framebuffer = NULL;\r
- GLuint framebufferHandle = 0;\r
- if(target == GL_READ_FRAMEBUFFER_ANGLE)\r
- {\r
- framebuffer = context->getReadFramebuffer();\r
- framebufferHandle = context->getReadFramebufferHandle();\r
- }\r
- else\r
- {\r
- framebuffer = context->getDrawFramebuffer();\r
- framebufferHandle = context->getDrawFramebufferHandle();\r
- }\r
-\r
- if(!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- switch(attachment)\r
- {\r
- case GL_COLOR_ATTACHMENT0:\r
- framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);\r
- break;\r
- case GL_DEPTH_ATTACHMENT:\r
- framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);\r
- break;\r
- case GL_STENCIL_ATTACHMENT:\r
- framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "\r
- "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);\r
-\r
- try\r
- {\r
- if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- switch(attachment)\r
- {\r
- case GL_COLOR_ATTACHMENT0:\r
- case GL_DEPTH_ATTACHMENT:\r
- case GL_STENCIL_ATTACHMENT:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(texture == 0)\r
- {\r
- textarget = GL_NONE;\r
- }\r
- else\r
- {\r
- rad::Texture *tex = context->getTexture(texture);\r
-\r
- if(tex == NULL)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- if(tex->isCompressed(textarget, level))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- switch(textarget)\r
- {\r
- case GL_TEXTURE_2D:\r
- if(tex->getTarget() != GL_TEXTURE_2D)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- break;\r
-\r
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:\r
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:\r
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:\r
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:\r
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:\r
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:\r
- if(tex->getTarget() != GL_TEXTURE_CUBE_MAP)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- break;\r
-\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- if(level != 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- }\r
-\r
- rad::Framebuffer *framebuffer = NULL;\r
- GLuint framebufferHandle = 0;\r
- if(target == GL_READ_FRAMEBUFFER_ANGLE)\r
- {\r
- framebuffer = context->getReadFramebuffer();\r
- framebufferHandle = context->getReadFramebufferHandle();\r
- }\r
- else\r
- {\r
- framebuffer = context->getDrawFramebuffer();\r
- framebufferHandle = context->getDrawFramebufferHandle();\r
- }\r
-\r
- if(framebufferHandle == 0 || !framebuffer)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- switch(attachment)\r
- {\r
- case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;\r
- case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;\r
- case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glFrontFace(GLenum mode)\r
-{\r
- TRACE("(GLenum mode = 0x%X)", mode);\r
-\r
- try\r
- {\r
- switch(mode)\r
- {\r
- case GL_CW:\r
- case GL_CCW:\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- context->setFrontFace(mode);\r
- }\r
- }\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGenBuffers(GLsizei n, GLuint* buffers)\r
-{\r
- TRACE("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);\r
-\r
- try\r
- {\r
- if(n < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- for(int i = 0; i < n; i++)\r
- {\r
- buffers[i] = context->createBuffer();\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGenerateMipmap(GLenum target)\r
-{\r
- TRACE("(GLenum target = 0x%X)", target);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Texture *texture;\r
-\r
- switch(target)\r
- {\r
- case GL_TEXTURE_2D:\r
- texture = context->getTexture2D();\r
- break;\r
- case GL_TEXTURE_CUBE_MAP:\r
- texture = context->getTextureCubeMap();\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- if(texture->isCompressed(target, 0) || texture->isDepth(target, 0))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- texture->generateMipmaps();\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGenFencesNV(GLsizei n, GLuint* fences)\r
-{\r
- TRACE("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);\r
-\r
- try\r
- {\r
- if(n < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- for(int i = 0; i < n; i++)\r
- {\r
- fences[i] = context->createFence();\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGenFramebuffers(GLsizei n, GLuint* framebuffers)\r
-{\r
- TRACE("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);\r
-\r
- try\r
- {\r
- if(n < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- for(int i = 0; i < n; i++)\r
- {\r
- framebuffers[i] = context->createFramebuffer();\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGenQueriesEXT(GLsizei n, GLuint* ids)\r
-{\r
- TRACE("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);\r
-\r
- try\r
- {\r
- if(n < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- for(int i = 0; i < n; i++)\r
- {\r
- ids[i] = context->createQuery();\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)\r
-{\r
- TRACE("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);\r
-\r
- try\r
- {\r
- if(n < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- for(int i = 0; i < n; i++)\r
- {\r
- renderbuffers[i] = context->createRenderbuffer();\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGenTextures(GLsizei n, GLuint* textures)\r
-{\r
- TRACE("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);\r
-\r
- try\r
- {\r
- if(n < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- for(int i = 0; i < n; i++)\r
- {\r
- textures[i] = context->createTexture();\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)\r
-{\r
- TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "\r
- "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",\r
- program, index, bufsize, length, size, type, name);\r
-\r
- try\r
- {\r
- if(bufsize < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Program *programObject = context->getProgram(program);\r
-\r
- if(!programObject)\r
- {\r
- if(context->getShader(program))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- }\r
-\r
- if(index >= (GLuint)programObject->getActiveAttributeCount())\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- programObject->getActiveAttribute(index, bufsize, length, size, type, name);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)\r
-{\r
- TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "\r
- "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",\r
- program, index, bufsize, length, size, type, name);\r
-\r
- try\r
- {\r
- if(bufsize < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Program *programObject = context->getProgram(program);\r
-\r
- if(!programObject)\r
- {\r
- if(context->getShader(program))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- }\r
-\r
- if(index >= (GLuint)programObject->getActiveUniformCount())\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- programObject->getActiveUniform(index, bufsize, length, size, type, name);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)\r
-{\r
- TRACE("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",\r
- program, maxcount, count, shaders);\r
-\r
- try\r
- {\r
- if(maxcount < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Program *programObject = context->getProgram(program);\r
-\r
- if(!programObject)\r
- {\r
- if(context->getShader(program))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
- }\r
-\r
- return programObject->getAttachedShaders(maxcount, count, shaders);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-int GL_APIENTRY glGetAttribLocation(GLuint program, const GLchar* name)\r
-{\r
- TRACE("(GLuint program = %d, const GLchar* name = %s)", program, name);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
-\r
- rad::Program *programObject = context->getProgram(program);\r
-\r
- if(!programObject)\r
- {\r
- if(context->getShader(program))\r
- {\r
- return error(GL_INVALID_OPERATION, -1);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_VALUE, -1);\r
- }\r
- }\r
-\r
- if(!programObject->isLinked())\r
- {\r
- return error(GL_INVALID_OPERATION, -1);\r
- }\r
-\r
- return programObject->getAttributeLocation(name);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, -1);\r
- }\r
-\r
- return -1;\r
-}\r
-\r
-void GL_APIENTRY glGetBooleanv(GLenum pname, GLboolean* params)\r
-{\r
- TRACE("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(!(context->getBooleanv(pname, params)))\r
- {\r
- GLenum nativeType;\r
- unsigned int numParams = 0;\r
- if(!context->getQueryParameterInfo(pname, &nativeType, &numParams))\r
- return error(GL_INVALID_ENUM);\r
-\r
- if(numParams == 0)\r
- return; // it is known that the pname is valid, but there are no parameters to return\r
-\r
- if(nativeType == GL_FLOAT)\r
- {\r
- GLfloat *floatParams = NULL;\r
- floatParams = new GLfloat[numParams];\r
-\r
- context->getFloatv(pname, floatParams);\r
-\r
- for(unsigned int i = 0; i < numParams; ++i)\r
- {\r
- if(floatParams[i] == 0.0f)\r
- params[i] = GL_FALSE;\r
- else\r
- params[i] = GL_TRUE;\r
- }\r
-\r
- delete [] floatParams;\r
- }\r
- else if(nativeType == GL_INT)\r
- {\r
- GLint *intParams = NULL;\r
- intParams = new GLint[numParams];\r
-\r
- context->getIntegerv(pname, intParams);\r
-\r
- for(unsigned int i = 0; i < numParams; ++i)\r
- {\r
- if(intParams[i] == 0)\r
- params[i] = GL_FALSE;\r
- else\r
- params[i] = GL_TRUE;\r
- }\r
-\r
- delete [] intParams;\r
- }\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Buffer *buffer;\r
-\r
- switch(target)\r
- {\r
- case GL_ARRAY_BUFFER:\r
- buffer = context->getArrayBuffer();\r
- break;\r
- case GL_ELEMENT_ARRAY_BUFFER:\r
- buffer = context->getElementArrayBuffer();\r
- break;\r
- default: return error(GL_INVALID_ENUM);\r
- }\r
-\r
- if(!buffer)\r
- {\r
- // A null buffer means that "0" is bound to the requested buffer target\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- switch(pname)\r
- {\r
- case GL_BUFFER_USAGE:\r
- *params = buffer->usage();\r
- break;\r
- case GL_BUFFER_SIZE:\r
- *params = buffer->size();\r
- break;\r
- default: return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-GLenum GL_APIENTRY glGetError(void)\r
-{\r
- TRACE("()");\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- return context->getError();\r
- }\r
-\r
- return GL_NO_ERROR;\r
-}\r
-\r
-void GL_APIENTRY glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)\r
-{\r
- TRACE("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Fence *fenceObject = context->getFence(fence);\r
-\r
- if(fenceObject == NULL)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- fenceObject->getFenceiv(pname, params);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetFloatv(GLenum pname, GLfloat* params)\r
-{\r
- TRACE("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(!(context->getFloatv(pname, params)))\r
- {\r
- GLenum nativeType;\r
- unsigned int numParams = 0;\r
- if(!context->getQueryParameterInfo(pname, &nativeType, &numParams))\r
- return error(GL_INVALID_ENUM);\r
-\r
- if(numParams == 0)\r
- return; // it is known that the pname is valid, but that there are no parameters to return.\r
-\r
- if(nativeType == GL_BOOL)\r
- {\r
- GLboolean *boolParams = NULL;\r
- boolParams = new GLboolean[numParams];\r
-\r
- context->getBooleanv(pname, boolParams);\r
-\r
- for(unsigned int i = 0; i < numParams; ++i)\r
- {\r
- if(boolParams[i] == GL_FALSE)\r
- params[i] = 0.0f;\r
- else\r
- params[i] = 1.0f;\r
- }\r
-\r
- delete [] boolParams;\r
- }\r
- else if(nativeType == GL_INT)\r
- {\r
- GLint *intParams = NULL;\r
- intParams = new GLint[numParams];\r
-\r
- context->getIntegerv(pname, intParams);\r
-\r
- for(unsigned int i = 0; i < numParams; ++i)\r
- {\r
- params[i] = (GLfloat)intParams[i];\r
- }\r
-\r
- delete [] intParams;\r
- }\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",\r
- target, attachment, pname, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- rad::Framebuffer *framebuffer = NULL;\r
- if(target == GL_READ_FRAMEBUFFER_ANGLE)\r
- {\r
- if(context->getReadFramebufferHandle() == 0)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- framebuffer = context->getReadFramebuffer();\r
- }\r
- else \r
- {\r
- if(context->getDrawFramebufferHandle() == 0)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- framebuffer = context->getDrawFramebuffer();\r
- }\r
-\r
- GLenum attachmentType;\r
- GLuint attachmentHandle;\r
- switch(attachment)\r
- {\r
- case GL_COLOR_ATTACHMENT0: \r
- attachmentType = framebuffer->getColorbufferType();\r
- attachmentHandle = framebuffer->getColorbufferHandle(); \r
- break;\r
- case GL_DEPTH_ATTACHMENT: \r
- attachmentType = framebuffer->getDepthbufferType();\r
- attachmentHandle = framebuffer->getDepthbufferHandle();\r
- break;\r
- case GL_STENCIL_ATTACHMENT: \r
- attachmentType = framebuffer->getStencilbufferType();\r
- attachmentHandle = framebuffer->getStencilbufferHandle();\r
- break;\r
- default: return error(GL_INVALID_ENUM);\r
- }\r
-\r
- GLenum attachmentObjectType; // Type category\r
- if(attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)\r
- {\r
- attachmentObjectType = attachmentType;\r
- }\r
- else if(rad::IsTextureTarget(attachmentType))\r
- {\r
- attachmentObjectType = GL_TEXTURE;\r
- }\r
- else UNREACHABLE();\r
-\r
- switch(pname)\r
- {\r
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:\r
- *params = attachmentObjectType;\r
- break;\r
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:\r
- if(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)\r
- {\r
- *params = attachmentHandle;\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:\r
- if(attachmentObjectType == GL_TEXTURE)\r
- {\r
- *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:\r
- if(attachmentObjectType == GL_TEXTURE)\r
- {\r
- if(rad::IsCubemapTextureTarget(attachmentType))\r
- {\r
- *params = attachmentType;\r
- }\r
- else\r
- {\r
- *params = 0;\r
- }\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-GLenum GL_APIENTRY glGetGraphicsResetStatusEXT(void)\r
-{\r
- TRACE("()");\r
-\r
- return GL_NO_ERROR;\r
-}\r
-\r
-void GL_APIENTRY glGetIntegerv(GLenum pname, GLint* params)\r
-{\r
- TRACE("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(!(context->getIntegerv(pname, params)))\r
- {\r
- GLenum nativeType;\r
- unsigned int numParams = 0;\r
- if(!context->getQueryParameterInfo(pname, &nativeType, &numParams))\r
- return error(GL_INVALID_ENUM);\r
-\r
- if(numParams == 0)\r
- return; // it is known that pname is valid, but there are no parameters to return\r
-\r
- if(nativeType == GL_BOOL)\r
- {\r
- GLboolean *boolParams = NULL;\r
- boolParams = new GLboolean[numParams];\r
-\r
- context->getBooleanv(pname, boolParams);\r
-\r
- for(unsigned int i = 0; i < numParams; ++i)\r
- {\r
- if(boolParams[i] == GL_FALSE)\r
- params[i] = 0;\r
- else\r
- params[i] = 1;\r
- }\r
-\r
- delete [] boolParams;\r
- }\r
- else if(nativeType == GL_FLOAT)\r
- {\r
- GLfloat *floatParams = NULL;\r
- floatParams = new GLfloat[numParams];\r
-\r
- context->getFloatv(pname, floatParams);\r
-\r
- for(unsigned int i = 0; i < numParams; ++i)\r
- {\r
- if(pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)\r
- {\r
- params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);\r
- }\r
- else\r
- params[i] = (GLint)(floatParams[i] > 0.0f ? floor(floatParams[i] + 0.5) : ceil(floatParams[i] - 0.5));\r
- }\r
-\r
- delete [] floatParams;\r
- }\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint* params)\r
-{\r
- TRACE("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Program *programObject = context->getProgram(program);\r
-\r
- if(!programObject)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- switch(pname)\r
- {\r
- case GL_DELETE_STATUS:\r
- *params = programObject->isFlaggedForDeletion();\r
- return;\r
- case GL_LINK_STATUS:\r
- *params = programObject->isLinked();\r
- return;\r
- case GL_VALIDATE_STATUS:\r
- *params = programObject->isValidated();\r
- return;\r
- case GL_INFO_LOG_LENGTH:\r
- *params = programObject->getInfoLogLength();\r
- return;\r
- case GL_ATTACHED_SHADERS:\r
- *params = programObject->getAttachedShadersCount();\r
- return;\r
- case GL_ACTIVE_ATTRIBUTES:\r
- *params = programObject->getActiveAttributeCount();\r
- return;\r
- case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:\r
- *params = programObject->getActiveAttributeMaxLength();\r
- return;\r
- case GL_ACTIVE_UNIFORMS:\r
- *params = programObject->getActiveUniformCount();\r
- return;\r
- case GL_ACTIVE_UNIFORM_MAX_LENGTH:\r
- *params = programObject->getActiveUniformMaxLength();\r
- return;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)\r
-{\r
- TRACE("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",\r
- program, bufsize, length, infolog);\r
-\r
- try\r
- {\r
- if(bufsize < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Program *programObject = context->getProgram(program);\r
-\r
- if(!programObject)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- programObject->getInfoLog(bufsize, length, infolog);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)\r
-{\r
- TRACE("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);\r
-\r
- try\r
- {\r
- switch(pname)\r
- {\r
- case GL_CURRENT_QUERY_EXT:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- params[0] = context->getActiveQuery(target);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)\r
-{\r
- TRACE("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);\r
-\r
- try\r
- {\r
- switch(pname)\r
- {\r
- case GL_QUERY_RESULT_EXT:\r
- case GL_QUERY_RESULT_AVAILABLE_EXT:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Query *queryObject = context->getQuery(id, false, GL_NONE);\r
-\r
- if(!queryObject)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- if(context->getActiveQuery(queryObject->getType()) == id)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- switch(pname)\r
- {\r
- case GL_QUERY_RESULT_EXT:\r
- params[0] = queryObject->getResult();\r
- break;\r
- case GL_QUERY_RESULT_AVAILABLE_EXT:\r
- params[0] = queryObject->isResultAvailable();\r
- break;\r
- default:\r
- ASSERT(false);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(target != GL_RENDERBUFFER)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- if(context->getRenderbufferHandle() == 0)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- rad::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());\r
-\r
- switch(pname)\r
- {\r
- case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;\r
- case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;\r
- case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getFormat(); break;\r
- case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;\r
- case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;\r
- case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;\r
- case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;\r
- case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;\r
- case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;\r
- case GL_RENDERBUFFER_SAMPLES_ANGLE: *params = renderbuffer->getSamples(); break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint* params)\r
-{\r
- TRACE("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Shader *shaderObject = context->getShader(shader);\r
-\r
- if(!shaderObject)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- switch(pname)\r
- {\r
- case GL_SHADER_TYPE:\r
- *params = shaderObject->getType();\r
- return;\r
- case GL_DELETE_STATUS:\r
- *params = shaderObject->isFlaggedForDeletion();\r
- return;\r
- case GL_COMPILE_STATUS:\r
- *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;\r
- return;\r
- case GL_INFO_LOG_LENGTH:\r
- *params = shaderObject->getInfoLogLength();\r
- return;\r
- case GL_SHADER_SOURCE_LENGTH:\r
- *params = shaderObject->getSourceLength();\r
- return;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)\r
-{\r
- TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",\r
- shader, bufsize, length, infolog);\r
-\r
- try\r
- {\r
- if(bufsize < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Shader *shaderObject = context->getShader(shader);\r
-\r
- if(!shaderObject)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- shaderObject->getInfoLog(bufsize, length, infolog);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)\r
-{\r
- TRACE("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",\r
- shadertype, precisiontype, range, precision);\r
-\r
- try\r
- {\r
- switch(shadertype)\r
- {\r
- case GL_VERTEX_SHADER:\r
- case GL_FRAGMENT_SHADER:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- switch(precisiontype)\r
- {\r
- case GL_LOW_FLOAT:\r
- case GL_MEDIUM_FLOAT:\r
- case GL_HIGH_FLOAT:\r
- // IEEE 754 single-precision\r
- range[0] = 127;\r
- range[1] = 127;\r
- *precision = 23;\r
- break;\r
- case GL_LOW_INT:\r
- case GL_MEDIUM_INT:\r
- case GL_HIGH_INT:\r
- // Single-precision floating-point numbers can accurately represent integers up to +/-16777216\r
- range[0] = 24;\r
- range[1] = 24;\r
- *precision = 0;\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)\r
-{\r
- TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",\r
- shader, bufsize, length, source);\r
-\r
- try\r
- {\r
- if(bufsize < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Shader *shaderObject = context->getShader(shader);\r
-\r
- if(!shaderObject)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- shaderObject->getSource(bufsize, length, source);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-const GLubyte* GL_APIENTRY glGetString(GLenum name)\r
-{\r
- TRACE("(GLenum name = 0x%X)", name);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- switch(name)\r
- {\r
- case GL_VENDOR:\r
- return (GLubyte*)"TransGaming Inc.";\r
- case GL_RENDERER:\r
- return (GLubyte*)"SwiftShader";\r
- case GL_VERSION:\r
- return (GLubyte*)"OpenGL ES 2.0 SwiftShader "VERSION_STRING;\r
- case GL_SHADING_LANGUAGE_VERSION:\r
- return (GLubyte*)"OpenGL ES GLSL ES 1.00 SwiftShader "VERSION_STRING;\r
- case GL_EXTENSIONS:\r
- // Keep list sorted in following order:\r
- // OES extensions\r
- // EXT extensions\r
- // Vendor extensions\r
- return (GLubyte*)\r
- "GL_OES_depth_texture "\r
- "GL_OES_depth_texture_cube_map "\r
- "GL_OES_EGL_image "\r
- "GL_OES_EGL_image_external "\r
- "GL_OES_element_index_uint "\r
- "GL_OES_packed_depth_stencil "\r
- "GL_OES_rgb8_rgba8 "\r
- "GL_OES_standard_derivatives "\r
- "GL_OES_texture_float "\r
- "GL_OES_texture_float_linear "\r
- "GL_OES_texture_half_float "\r
- "GL_OES_texture_half_float_linear "\r
- "GL_OES_texture_npot "\r
- "GL_EXT_blend_minmax "\r
- "GL_EXT_occlusion_query_boolean "\r
- "GL_EXT_read_format_bgra "\r
- #if (S3TC_SUPPORT)\r
- "GL_EXT_texture_compression_dxt1 "\r
- "GL_ANGLE_texture_compression_dxt3 "\r
- "GL_ANGLE_texture_compression_dxt5 "\r
- #endif\r
- "GL_EXT_texture_filter_anisotropic "\r
- "GL_EXT_texture_format_BGRA8888 "\r
- "GL_ANGLE_framebuffer_blit "\r
- "GL_ANGLE_framebuffer_multisample "\r
- "GL_NV_fence";\r
- default:\r
- return error(GL_INVALID_ENUM, (GLubyte*)NULL);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-void GL_APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", target, pname, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Texture *texture;\r
-\r
- switch(target)\r
- {\r
- case GL_TEXTURE_2D:\r
- texture = context->getTexture2D();\r
- break;\r
- case GL_TEXTURE_CUBE_MAP:\r
- texture = context->getTextureCubeMap();\r
- break;\r
- case GL_TEXTURE_EXTERNAL_OES:\r
- texture = context->getTextureExternal();\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- switch(pname)\r
- {\r
- case GL_TEXTURE_MAG_FILTER:\r
- *params = (GLfloat)texture->getMagFilter();\r
- break;\r
- case GL_TEXTURE_MIN_FILTER:\r
- *params = (GLfloat)texture->getMinFilter();\r
- break;\r
- case GL_TEXTURE_WRAP_S:\r
- *params = (GLfloat)texture->getWrapS();\r
- break;\r
- case GL_TEXTURE_WRAP_T:\r
- *params = (GLfloat)texture->getWrapT();\r
- break;\r
- case GL_TEXTURE_MAX_ANISOTROPY_EXT:\r
- *params = texture->getMaxAnisotropy();\r
- break;\r
- case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:\r
- *params = (GLfloat)1;\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Texture *texture;\r
-\r
- switch(target)\r
- {\r
- case GL_TEXTURE_2D:\r
- texture = context->getTexture2D();\r
- break;\r
- case GL_TEXTURE_CUBE_MAP:\r
- texture = context->getTextureCubeMap();\r
- break;\r
- case GL_TEXTURE_EXTERNAL_OES:\r
- texture = context->getTextureExternal();\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- switch(pname)\r
- {\r
- case GL_TEXTURE_MAG_FILTER:\r
- *params = texture->getMagFilter();\r
- break;\r
- case GL_TEXTURE_MIN_FILTER:\r
- *params = texture->getMinFilter();\r
- break;\r
- case GL_TEXTURE_WRAP_S:\r
- *params = texture->getWrapS();\r
- break;\r
- case GL_TEXTURE_WRAP_T:\r
- *params = texture->getWrapT();\r
- break;\r
- case GL_TEXTURE_MAX_ANISOTROPY_EXT:\r
- *params = (GLint)texture->getMaxAnisotropy();\r
- break;\r
- case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:\r
- *params = 1;\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)\r
-{\r
- TRACE("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",\r
- program, location, bufSize, params);\r
-\r
- try\r
- {\r
- if(bufSize < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(program == 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Program *programObject = context->getProgram(program);\r
-\r
- if(!programObject || !programObject->isLinked())\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- if(!programObject->getUniformfv(location, &bufSize, params))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetUniformfv(GLuint program, GLint location, GLfloat* params)\r
-{\r
- TRACE("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(program == 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Program *programObject = context->getProgram(program);\r
-\r
- if(!programObject || !programObject->isLinked())\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- if(!programObject->getUniformfv(location, NULL, params))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)\r
-{\r
- TRACE("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)", \r
- program, location, bufSize, params);\r
-\r
- try\r
- {\r
- if(bufSize < 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(program == 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Program *programObject = context->getProgram(program);\r
-\r
- if(!programObject || !programObject->isLinked())\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- if(!programObject)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- if(!programObject->getUniformiv(location, &bufSize, params))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetUniformiv(GLuint program, GLint location, GLint* params)\r
-{\r
- TRACE("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(program == 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- rad::Program *programObject = context->getProgram(program);\r
-\r
- if(!programObject || !programObject->isLinked())\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- if(!programObject)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
-\r
- if(!programObject->getUniformiv(location, NULL, params))\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-int GL_APIENTRY glGetUniformLocation(GLuint program, const GLchar* name)\r
-{\r
- TRACE("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(strstr(name, "gl_") == name)\r
- {\r
- return -1;\r
- }\r
-\r
- if(context)\r
- {\r
- rad::Program *programObject = context->getProgram(program);\r
-\r
- if(!programObject)\r
- {\r
- if(context->getShader(program))\r
- {\r
- return error(GL_INVALID_OPERATION, -1);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_VALUE, -1);\r
- }\r
- }\r
-\r
- if(!programObject->isLinked())\r
- {\r
- return error(GL_INVALID_OPERATION, -1);\r
- }\r
-\r
- return programObject->getUniformLocation(name);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, -1);\r
- }\r
-\r
- return -1;\r
-}\r
-\r
-void GL_APIENTRY glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)\r
-{\r
- TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(index >= rad::MAX_VERTEX_ATTRIBS)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- const rad::VertexAttribute &attribState = context->getVertexAttribState(index);\r
-\r
- switch(pname)\r
- {\r
- case GL_VERTEX_ATTRIB_ARRAY_ENABLED:\r
- *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);\r
- break;\r
- case GL_VERTEX_ATTRIB_ARRAY_SIZE:\r
- *params = (GLfloat)attribState.mSize;\r
- break;\r
- case GL_VERTEX_ATTRIB_ARRAY_STRIDE:\r
- *params = (GLfloat)attribState.mStride;\r
- break;\r
- case GL_VERTEX_ATTRIB_ARRAY_TYPE:\r
- *params = (GLfloat)attribState.mType;\r
- break;\r
- case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:\r
- *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);\r
- break;\r
- case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:\r
- *params = (GLfloat)attribState.mBoundBuffer.id();\r
- break;\r
- case GL_CURRENT_VERTEX_ATTRIB:\r
- for(int i = 0; i < 4; ++i)\r
- {\r
- params[i] = attribState.mCurrentValue[i];\r
- }\r
- break;\r
- default: return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)\r
-{\r
- TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(index >= rad::MAX_VERTEX_ATTRIBS)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- const rad::VertexAttribute &attribState = context->getVertexAttribState(index);\r
-\r
- switch(pname)\r
- {\r
- case GL_VERTEX_ATTRIB_ARRAY_ENABLED:\r
- *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);\r
- break;\r
- case GL_VERTEX_ATTRIB_ARRAY_SIZE:\r
- *params = attribState.mSize;\r
- break;\r
- case GL_VERTEX_ATTRIB_ARRAY_STRIDE:\r
- *params = attribState.mStride;\r
- break;\r
- case GL_VERTEX_ATTRIB_ARRAY_TYPE:\r
- *params = attribState.mType;\r
- break;\r
- case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:\r
- *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);\r
- break;\r
- case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:\r
- *params = attribState.mBoundBuffer.id();\r
- break;\r
- case GL_CURRENT_VERTEX_ATTRIB:\r
- for(int i = 0; i < 4; ++i)\r
- {\r
- float currentValue = attribState.mCurrentValue[i];\r
- params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));\r
- }\r
- break;\r
- default: return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)\r
-{\r
- TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- if(index >= rad::MAX_VERTEX_ATTRIBS)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- if(pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
-\r
- *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-void GL_APIENTRY glHint(GLenum target, GLenum mode)\r
-{\r
- TRACE("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);\r
-\r
- try\r
- {\r
- switch(mode)\r
- {\r
- case GL_FASTEST:\r
- case GL_NICEST:\r
- case GL_DONT_CARE:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM); \r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
- switch(target)\r
- {\r
- case GL_GENERATE_MIPMAP_HINT:\r
- if(context) context->setGenerateMipmapHint(mode);\r
- break;\r
- case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:\r
- if(context) context->setFragmentShaderDerivativeHint(mode);\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY);\r
- }\r
-}\r
-\r
-GLboolean GL_APIENTRY glIsBuffer(GLuint buffer)\r
-{\r
- TRACE("(GLuint buffer = %d)", buffer);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context && buffer)\r
- {\r
- rad::Buffer *bufferObject = context->getBuffer(buffer);\r
-\r
- if(bufferObject)\r
- {\r
- return GL_TRUE;\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, GL_FALSE);\r
- }\r
-\r
- return GL_FALSE;\r
-}\r
-\r
-GLboolean GL_APIENTRY glIsEnabled(GLenum cap)\r
-{\r
- TRACE("(GLenum cap = 0x%X)", cap);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- switch(cap)\r
- {\r
- case GL_CULL_FACE: return context->isCullFaceEnabled();\r
- case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();\r
- case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();\r
- case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();\r
- case GL_SCISSOR_TEST: return context->isScissorTestEnabled();\r
- case GL_STENCIL_TEST: return context->isStencilTestEnabled();\r
- case GL_DEPTH_TEST: return context->isDepthTestEnabled();\r
- case GL_BLEND: return context->isBlendEnabled();\r
- case GL_DITHER: return context->isDitherEnabled();\r
- default:\r
- return error(GL_INVALID_ENUM, false);\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, false);\r
- }\r
-\r
- return false;\r
-}\r
-\r
-GLboolean GL_APIENTRY glIsFenceNV(GLuint fence)\r
-{\r
- TRACE("(GLuint fence = %d)", fence);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Fence *fenceObject = context->getFence(fence);\r
-\r
- if(fenceObject == NULL)\r
- {\r
- return GL_FALSE;\r
- }\r
-\r
- return fenceObject->isFence();\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, GL_FALSE);\r
- }\r
-\r
- return GL_FALSE;\r
-}\r
-\r
-GLboolean GL_APIENTRY glIsFramebuffer(GLuint framebuffer)\r
-{\r
- TRACE("(GLuint framebuffer = %d)", framebuffer);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context && framebuffer)\r
- {\r
- rad::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);\r
-\r
- if(framebufferObject)\r
- {\r
- return GL_TRUE;\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, GL_FALSE);\r
- }\r
-\r
- return GL_FALSE;\r
-}\r
-\r
-GLboolean GL_APIENTRY glIsProgram(GLuint program)\r
-{\r
- TRACE("(GLuint program = %d)", program);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context && program)\r
- {\r
- rad::Program *programObject = context->getProgram(program);\r
-\r
- if(programObject)\r
- {\r
- return GL_TRUE;\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, GL_FALSE);\r
- }\r
-\r
- return GL_FALSE;\r
-}\r
-\r
-GLboolean GL_APIENTRY glIsQueryEXT(GLuint id)\r
-{\r
- TRACE("(GLuint id = %d)", id);\r
-\r
- try\r
- {\r
- if(id == 0)\r
- {\r
- return GL_FALSE;\r
- }\r
-\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context)\r
- {\r
- rad::Query *queryObject = context->getQuery(id, false, GL_NONE);\r
-\r
- if(queryObject)\r
- {\r
- return GL_TRUE;\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, GL_FALSE);\r
- }\r
-\r
- return GL_FALSE;\r
-}\r
-\r
-GLboolean GL_APIENTRY glIsRenderbuffer(GLuint renderbuffer)\r
-{\r
- TRACE("(GLuint renderbuffer = %d)", renderbuffer);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context && renderbuffer)\r
- {\r
- rad::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);\r
-\r
- if(renderbufferObject)\r
- {\r
- return GL_TRUE;\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, GL_FALSE);\r
- }\r
-\r
- return GL_FALSE;\r
-}\r
-\r
-GLboolean GL_APIENTRY glIsShader(GLuint shader)\r
-{\r
- TRACE("(GLuint shader = %d)", shader);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context && shader)\r
- {\r
- rad::Shader *shaderObject = context->getShader(shader);\r
-\r
- if(shaderObject)\r
- {\r
- return GL_TRUE;\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, GL_FALSE);\r
- }\r
-\r
- return GL_FALSE;\r
-}\r
-\r
-GLboolean GL_APIENTRY glIsTexture(GLuint texture)\r
-{\r
- TRACE("(GLuint texture = %d)", texture);\r
-\r
- try\r
- {\r
- rad::Context *context = rad::getContext();\r
-\r
- if(context && texture)\r
- {\r
- rad::Texture *textureObject = context->getTexture(texture);\r
-\r
- if(textureObject)\r
- {\r
- return GL_TRUE;\r
- }\r
- }\r
- }\r
- catch(std::bad_alloc&)\r
- {\r
- return error(GL_OUT_OF_MEMORY, GL_FALSE);\r
- }\r
-\r
- return GL_FALSE;\r
-}\r