| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1 | // SwiftShader Software Renderer | 
|  | 2 | // | 
|  | 3 | // Copyright(c) 2005-2013 TransGaming Inc. | 
|  | 4 | // | 
|  | 5 | // All rights reserved. No part of this software may be copied, distributed, transmitted, | 
|  | 6 | // transcribed, stored in a retrieval system, translated into any human or computer | 
|  | 7 | // language by any means, or disclosed to third parties without the explicit written | 
|  | 8 | // agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express | 
|  | 9 | // or implied, including but not limited to any patent rights, are granted to you. | 
|  | 10 | // | 
|  | 11 | // libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions. | 
|  | 12 |  | 
|  | 13 | #include "main.h" | 
|  | 14 | #include "mathutil.h" | 
|  | 15 | #include "utilities.h" | 
|  | 16 | #include "Buffer.h" | 
|  | 17 | #include "Context.h" | 
|  | 18 | #include "Fence.h" | 
|  | 19 | #include "Framebuffer.h" | 
|  | 20 | #include "Program.h" | 
|  | 21 | #include "Renderbuffer.h" | 
|  | 22 | #include "Shader.h" | 
|  | 23 | #include "Texture.h" | 
|  | 24 | #include "Query.h" | 
|  | 25 | #include "common/debug.h" | 
|  | 26 | #include "Common/Version.h" | 
| John Bauman | d4ae863 | 2014-05-06 16:18:33 -0400 | [diff] [blame] | 27 | #include "Main/Register.hpp" | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 28 |  | 
|  | 29 | #define GL_APICALL | 
|  | 30 | #include <GLES2/gl2.h> | 
|  | 31 | #include <GLES2/gl2ext.h> | 
| Alexis Hetu | fceb183 | 2015-03-10 16:42:04 -0400 | [diff] [blame] | 32 | #include <GLES3/gl3.h> | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 33 |  | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 34 | #include <limits> | 
|  | 35 |  | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 36 | typedef std::pair<GLenum, GLenum> InternalFormatTypePair; | 
|  | 37 | typedef std::map<InternalFormatTypePair, GLenum> FormatMap; | 
|  | 38 |  | 
|  | 39 | // A helper function to insert data into the format map with fewer characters. | 
|  | 40 | static void InsertFormatMapping(FormatMap& map, GLenum internalformat, GLenum format, GLenum type) | 
|  | 41 | { | 
|  | 42 | map[InternalFormatTypePair(internalformat, type)] = format; | 
|  | 43 | } | 
|  | 44 |  | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 45 | static bool validImageSize(GLint level, GLsizei width, GLsizei height) | 
|  | 46 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 47 | if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || width < 0 || height < 0) | 
|  | 48 | { | 
|  | 49 | return false; | 
|  | 50 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 51 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 52 | return true; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 53 | } | 
|  | 54 |  | 
| Nicolas Capens | 14ee762 | 2014-10-28 23:48:41 -0400 | [diff] [blame] | 55 | static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei height, GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, es2::Texture *texture) | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 56 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 57 | if(!texture) | 
|  | 58 | { | 
|  | 59 | return error(GL_INVALID_OPERATION, false); | 
|  | 60 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 61 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 62 | if(compressed != texture->isCompressed(target, level)) | 
|  | 63 | { | 
|  | 64 | return error(GL_INVALID_OPERATION, false); | 
|  | 65 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 66 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 67 | if(format != GL_NONE && format != texture->getFormat(target, level)) | 
|  | 68 | { | 
|  | 69 | return error(GL_INVALID_OPERATION, false); | 
|  | 70 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 71 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 72 | if(compressed) | 
|  | 73 | { | 
|  | 74 | if((width % 4 != 0 && width != texture->getWidth(target, 0)) || | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 75 | (height % 4 != 0 && height != texture->getHeight(target, 0))) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 76 | { | 
|  | 77 | return error(GL_INVALID_OPERATION, false); | 
|  | 78 | } | 
|  | 79 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 80 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 81 | if(xoffset + width > texture->getWidth(target, level) || | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 82 | yoffset + height > texture->getHeight(target, level)) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 83 | { | 
|  | 84 | return error(GL_INVALID_VALUE, false); | 
|  | 85 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 86 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 87 | return true; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 88 | } | 
|  | 89 |  | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 90 | static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei height, GLsizei depth, GLint xoffset, GLint yoffset, GLint zoffset, GLenum target, GLint level, GLenum format, es2::Texture *texture) | 
|  | 91 | { | 
|  | 92 | if(!texture) | 
|  | 93 | { | 
|  | 94 | return error(GL_INVALID_OPERATION, false); | 
|  | 95 | } | 
|  | 96 |  | 
|  | 97 | if(compressed != texture->isCompressed(target, level)) | 
|  | 98 | { | 
|  | 99 | return error(GL_INVALID_OPERATION, false); | 
|  | 100 | } | 
|  | 101 |  | 
|  | 102 | if(format != GL_NONE && format != texture->getFormat(target, level)) | 
|  | 103 | { | 
|  | 104 | return error(GL_INVALID_OPERATION, false); | 
|  | 105 | } | 
|  | 106 |  | 
|  | 107 | if(compressed) | 
|  | 108 | { | 
|  | 109 | if((width % 4 != 0 && width != texture->getWidth(target, 0)) || | 
|  | 110 | (height % 4 != 0 && height != texture->getHeight(target, 0)) || | 
|  | 111 | (depth % 4 != 0 && depth != texture->getDepth(target, 0))) | 
|  | 112 | { | 
|  | 113 | return error(GL_INVALID_OPERATION, false); | 
|  | 114 | } | 
|  | 115 | } | 
|  | 116 |  | 
|  | 117 | if(xoffset + width > texture->getWidth(target, level) || | 
|  | 118 | yoffset + height > texture->getHeight(target, level) || | 
|  | 119 | zoffset + depth > texture->getDepth(target, level)) | 
|  | 120 | { | 
|  | 121 | return error(GL_INVALID_VALUE, false); | 
|  | 122 | } | 
|  | 123 |  | 
|  | 124 | return true; | 
|  | 125 | } | 
|  | 126 |  | 
|  | 127 | static bool validateColorBufferFormat(GLenum textureFormat, GLenum colorbufferFormat) | 
|  | 128 | { | 
|  | 129 | // [OpenGL ES 2.0.24] table 3.9 | 
|  | 130 | switch(textureFormat) | 
|  | 131 | { | 
|  | 132 | case GL_ALPHA: | 
|  | 133 | if(colorbufferFormat != GL_ALPHA && | 
|  | 134 | colorbufferFormat != GL_RGBA && | 
|  | 135 | colorbufferFormat != GL_RGBA4 && | 
|  | 136 | colorbufferFormat != GL_RGB5_A1 && | 
|  | 137 | colorbufferFormat != GL_RGBA8_OES) | 
|  | 138 | { | 
|  | 139 | return error(GL_INVALID_OPERATION, false); | 
|  | 140 | } | 
|  | 141 | break; | 
|  | 142 | case GL_LUMINANCE: | 
|  | 143 | case GL_RGB: | 
|  | 144 | if(colorbufferFormat != GL_RGB && | 
|  | 145 | colorbufferFormat != GL_RGB565 && | 
|  | 146 | colorbufferFormat != GL_RGB8_OES && | 
|  | 147 | colorbufferFormat != GL_RGBA && | 
|  | 148 | colorbufferFormat != GL_RGBA4 && | 
|  | 149 | colorbufferFormat != GL_RGB5_A1 && | 
|  | 150 | colorbufferFormat != GL_RGBA8_OES) | 
|  | 151 | { | 
|  | 152 | return error(GL_INVALID_OPERATION, false); | 
|  | 153 | } | 
|  | 154 | break; | 
|  | 155 | case GL_LUMINANCE_ALPHA: | 
|  | 156 | case GL_RGBA: | 
|  | 157 | if(colorbufferFormat != GL_RGBA && | 
|  | 158 | colorbufferFormat != GL_RGBA4 && | 
|  | 159 | colorbufferFormat != GL_RGB5_A1 && | 
|  | 160 | colorbufferFormat != GL_RGBA8_OES) | 
|  | 161 | { | 
|  | 162 | return error(GL_INVALID_OPERATION, false); | 
|  | 163 | } | 
|  | 164 | break; | 
|  | 165 | case GL_ETC1_RGB8_OES: | 
|  | 166 | return error(GL_INVALID_OPERATION, false); | 
|  | 167 | case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: | 
|  | 168 | case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: | 
|  | 169 | case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: | 
|  | 170 | case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: | 
|  | 171 | if(S3TC_SUPPORT) | 
|  | 172 | { | 
|  | 173 | return error(GL_INVALID_OPERATION, false); | 
|  | 174 | } | 
|  | 175 | else | 
|  | 176 | { | 
|  | 177 | return error(GL_INVALID_ENUM, false); | 
|  | 178 | } | 
|  | 179 | case GL_DEPTH_COMPONENT: | 
|  | 180 | case GL_DEPTH_STENCIL_OES: | 
|  | 181 | return error(GL_INVALID_OPERATION, false); | 
|  | 182 | default: | 
|  | 183 | return error(GL_INVALID_ENUM, false); | 
|  | 184 | } | 
|  | 185 | return true; | 
|  | 186 | } | 
|  | 187 |  | 
|  | 188 | static FormatMap BuildFormatMap3D() | 
|  | 189 | { | 
|  | 190 | FormatMap map; | 
|  | 191 |  | 
|  | 192 | //                       Internal format | Format | Type | 
|  | 193 | InsertFormatMapping(map, GL_RGB, GL_RGB, GL_UNSIGNED_BYTE); | 
|  | 194 | InsertFormatMapping(map, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5); | 
|  | 195 | InsertFormatMapping(map, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE); | 
|  | 196 | InsertFormatMapping(map, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4); | 
|  | 197 | InsertFormatMapping(map, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1); | 
|  | 198 | InsertFormatMapping(map, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE); | 
|  | 199 | InsertFormatMapping(map, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE); | 
|  | 200 | InsertFormatMapping(map, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE); | 
|  | 201 | InsertFormatMapping(map, GL_R8_EXT, GL_RED_EXT, GL_UNSIGNED_BYTE); | 
|  | 202 | InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_HALF_FLOAT_OES); | 
|  | 203 | InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_FLOAT); | 
|  | 204 | InsertFormatMapping(map, GL_R32F_EXT, GL_RED_EXT, GL_FLOAT); | 
|  | 205 | InsertFormatMapping(map, GL_RG8_EXT, GL_RG_EXT, GL_UNSIGNED_BYTE); | 
|  | 206 | InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_HALF_FLOAT_OES); | 
|  | 207 | InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_FLOAT); | 
|  | 208 | InsertFormatMapping(map, GL_RG32F_EXT, GL_RG_EXT, GL_FLOAT); | 
|  | 209 | InsertFormatMapping(map, GL_RGB8_OES, GL_RGB, GL_UNSIGNED_BYTE); | 
|  | 210 | InsertFormatMapping(map, GL_SRGB8_NV, GL_RGB, GL_UNSIGNED_BYTE); | 
|  | 211 | InsertFormatMapping(map, GL_RGB565, GL_RGB, GL_UNSIGNED_BYTE); | 
|  | 212 | InsertFormatMapping(map, GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5); | 
| Alexis Hetu | 0300e3c | 2015-03-12 17:33:07 -0400 | [diff] [blame] | 213 | InsertFormatMapping(map, GL_RGB16F_EXT, GL_RGB, GL_HALF_FLOAT_OES); | 
|  | 214 | InsertFormatMapping(map, GL_RGB16F_EXT, GL_RGB, GL_FLOAT); | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 215 | InsertFormatMapping(map, GL_RGB32F_EXT, GL_RGB, GL_FLOAT); | 
|  | 216 | InsertFormatMapping(map, GL_RGBA8_OES, GL_RGBA, GL_UNSIGNED_BYTE); | 
|  | 217 | InsertFormatMapping(map, GL_SRGB8_ALPHA8_EXT, GL_RGBA, GL_UNSIGNED_BYTE); | 
|  | 218 | InsertFormatMapping(map, GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_BYTE); | 
|  | 219 | InsertFormatMapping(map, GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1); | 
|  | 220 | InsertFormatMapping(map, GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV_EXT); | 
|  | 221 | InsertFormatMapping(map, GL_RGBA4, GL_RGBA, GL_UNSIGNED_BYTE); | 
|  | 222 | InsertFormatMapping(map, GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4); | 
|  | 223 | InsertFormatMapping(map, GL_RGB10_A2_EXT, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV_EXT); | 
|  | 224 | InsertFormatMapping(map, GL_RGBA16F_EXT, GL_RGBA, GL_HALF_FLOAT_OES); | 
|  | 225 | InsertFormatMapping(map, GL_RGBA16F_EXT, GL_RGBA, GL_FLOAT); | 
|  | 226 | InsertFormatMapping(map, GL_RGBA32F_EXT, GL_RGBA, GL_FLOAT); | 
|  | 227 |  | 
|  | 228 | return map; | 
|  | 229 | } | 
|  | 230 |  | 
|  | 231 | static bool ValidateType3D(GLenum type) | 
|  | 232 | { | 
|  | 233 | switch(type) | 
|  | 234 | { | 
|  | 235 | case GL_UNSIGNED_BYTE: | 
|  | 236 | case GL_BYTE: | 
|  | 237 | case GL_UNSIGNED_SHORT: | 
|  | 238 | case GL_SHORT: | 
|  | 239 | case GL_UNSIGNED_INT: | 
|  | 240 | case GL_INT: | 
|  | 241 | case GL_HALF_FLOAT_OES: | 
|  | 242 | case GL_FLOAT: | 
|  | 243 | case GL_UNSIGNED_SHORT_5_6_5: | 
|  | 244 | case GL_UNSIGNED_SHORT_4_4_4_4: | 
|  | 245 | case GL_UNSIGNED_SHORT_5_5_5_1: | 
|  | 246 | case GL_UNSIGNED_INT_2_10_10_10_REV_EXT: | 
|  | 247 | return true; | 
|  | 248 | default: | 
|  | 249 | break; | 
|  | 250 | } | 
|  | 251 | return false; | 
|  | 252 | } | 
|  | 253 |  | 
|  | 254 | static bool ValidateFormat3D(GLenum format) | 
|  | 255 | { | 
|  | 256 | switch(format) | 
|  | 257 | { | 
|  | 258 | case GL_RED_EXT: | 
|  | 259 | case GL_RG_EXT: | 
|  | 260 | case GL_RGB: | 
|  | 261 | case GL_RGBA: | 
|  | 262 | case GL_DEPTH_COMPONENT: | 
|  | 263 | case GL_DEPTH_STENCIL_OES: | 
|  | 264 | case GL_LUMINANCE_ALPHA: | 
|  | 265 | case GL_LUMINANCE: | 
|  | 266 | case GL_ALPHA: | 
|  | 267 | return true; | 
|  | 268 | default: | 
|  | 269 | break; | 
|  | 270 | } | 
|  | 271 | return false; | 
|  | 272 | } | 
|  | 273 |  | 
|  | 274 | static bool ValidateInternalFormat3D(GLenum internalformat, GLenum format, GLenum type) | 
|  | 275 | { | 
|  | 276 | static const FormatMap formatMap = BuildFormatMap3D(); | 
|  | 277 | FormatMap::const_iterator iter = formatMap.find(InternalFormatTypePair(internalformat, type)); | 
|  | 278 | if(iter != formatMap.end()) | 
|  | 279 | { | 
|  | 280 | return iter->second == format; | 
|  | 281 | } | 
|  | 282 | return false; | 
|  | 283 | } | 
|  | 284 |  | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 285 | extern "C" | 
|  | 286 | { | 
|  | 287 |  | 
|  | 288 | void GL_APIENTRY glActiveTexture(GLenum texture) | 
|  | 289 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 290 | TRACE("(GLenum texture = 0x%X)", texture); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 291 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 292 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 293 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 294 | if(context) | 
|  | 295 | { | 
|  | 296 | if(texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + es2::MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1) | 
|  | 297 | { | 
|  | 298 | return error(GL_INVALID_ENUM); | 
|  | 299 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 300 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 301 | context->setActiveSampler(texture - GL_TEXTURE0); | 
|  | 302 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 303 | } | 
|  | 304 |  | 
|  | 305 | void GL_APIENTRY glAttachShader(GLuint program, GLuint shader) | 
|  | 306 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 307 | TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 308 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 309 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 310 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 311 | if(context) | 
|  | 312 | { | 
|  | 313 | es2::Program *programObject = context->getProgram(program); | 
|  | 314 | es2::Shader *shaderObject = context->getShader(shader); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 315 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 316 | if(!programObject) | 
|  | 317 | { | 
|  | 318 | if(context->getShader(program)) | 
|  | 319 | { | 
|  | 320 | return error(GL_INVALID_OPERATION); | 
|  | 321 | } | 
|  | 322 | else | 
|  | 323 | { | 
|  | 324 | return error(GL_INVALID_VALUE); | 
|  | 325 | } | 
|  | 326 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 327 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 328 | if(!shaderObject) | 
|  | 329 | { | 
|  | 330 | if(context->getProgram(shader)) | 
|  | 331 | { | 
|  | 332 | return error(GL_INVALID_OPERATION); | 
|  | 333 | } | 
|  | 334 | else | 
|  | 335 | { | 
|  | 336 | return error(GL_INVALID_VALUE); | 
|  | 337 | } | 
|  | 338 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 339 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 340 | if(!programObject->attachShader(shaderObject)) | 
|  | 341 | { | 
|  | 342 | return error(GL_INVALID_OPERATION); | 
|  | 343 | } | 
|  | 344 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 345 | } | 
|  | 346 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 347 | void GL_APIENTRY glBeginQueryEXT(GLenum target, GLuint name) | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 348 | { | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 349 | TRACE("(GLenum target = 0x%X, GLuint name = %d)", target, name); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 350 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 351 | switch(target) | 
|  | 352 | { | 
|  | 353 | case GL_ANY_SAMPLES_PASSED_EXT: | 
|  | 354 | case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: | 
|  | 355 | break; | 
|  | 356 | default: | 
|  | 357 | return error(GL_INVALID_ENUM); | 
|  | 358 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 359 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 360 | if(name == 0) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 361 | { | 
|  | 362 | return error(GL_INVALID_OPERATION); | 
|  | 363 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 364 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 365 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 366 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 367 | if(context) | 
|  | 368 | { | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 369 | context->beginQuery(target, name); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 370 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 371 | } | 
|  | 372 |  | 
|  | 373 | void GL_APIENTRY glBindAttribLocation(GLuint program, GLuint index, const GLchar* name) | 
|  | 374 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 375 | TRACE("(GLuint program = %d, GLuint index = %d, const GLchar* name = %s)", program, index, name); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 376 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 377 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 378 | { | 
|  | 379 | return error(GL_INVALID_VALUE); | 
|  | 380 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 381 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 382 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 383 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 384 | if(context) | 
|  | 385 | { | 
|  | 386 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 387 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 388 | if(!programObject) | 
|  | 389 | { | 
|  | 390 | if(context->getShader(program)) | 
|  | 391 | { | 
|  | 392 | return error(GL_INVALID_OPERATION); | 
|  | 393 | } | 
|  | 394 | else | 
|  | 395 | { | 
|  | 396 | return error(GL_INVALID_VALUE); | 
|  | 397 | } | 
|  | 398 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 399 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 400 | if(strncmp(name, "gl_", 3) == 0) | 
|  | 401 | { | 
|  | 402 | return error(GL_INVALID_OPERATION); | 
|  | 403 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 404 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 405 | programObject->bindAttributeLocation(index, name); | 
|  | 406 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 407 | } | 
|  | 408 |  | 
|  | 409 | void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer) | 
|  | 410 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 411 | TRACE("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 412 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 413 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 414 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 415 | if(context) | 
|  | 416 | { | 
|  | 417 | switch(target) | 
|  | 418 | { | 
|  | 419 | case GL_ARRAY_BUFFER: | 
|  | 420 | context->bindArrayBuffer(buffer); | 
|  | 421 | return; | 
|  | 422 | case GL_ELEMENT_ARRAY_BUFFER: | 
|  | 423 | context->bindElementArrayBuffer(buffer); | 
|  | 424 | return; | 
|  | 425 | default: | 
|  | 426 | return error(GL_INVALID_ENUM); | 
|  | 427 | } | 
|  | 428 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 429 | } | 
|  | 430 |  | 
|  | 431 | void GL_APIENTRY glBindFramebuffer(GLenum target, GLuint framebuffer) | 
|  | 432 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 433 | TRACE("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 434 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 435 | if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE) | 
|  | 436 | { | 
|  | 437 | return error(GL_INVALID_ENUM); | 
|  | 438 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 439 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 440 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 441 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 442 | if(context) | 
|  | 443 | { | 
|  | 444 | if(target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER) | 
|  | 445 | { | 
|  | 446 | context->bindReadFramebuffer(framebuffer); | 
|  | 447 | } | 
| Nicolas Capens | 08e90f0 | 2014-11-21 12:49:12 -0500 | [diff] [blame] | 448 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 449 | if(target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER) | 
|  | 450 | { | 
|  | 451 | context->bindDrawFramebuffer(framebuffer); | 
|  | 452 | } | 
|  | 453 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 454 | } | 
|  | 455 |  | 
|  | 456 | void GL_APIENTRY glBindRenderbuffer(GLenum target, GLuint renderbuffer) | 
|  | 457 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 458 | TRACE("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 459 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 460 | if(target != GL_RENDERBUFFER) | 
|  | 461 | { | 
|  | 462 | return error(GL_INVALID_ENUM); | 
|  | 463 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 464 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 465 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 466 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 467 | if(context) | 
|  | 468 | { | 
|  | 469 | if(renderbuffer != 0 && !context->getRenderbuffer(renderbuffer)) | 
|  | 470 | { | 
|  | 471 | // [OpenGL ES 2.0.25] Section 4.4.3 page 112 | 
|  | 472 | // [OpenGL ES 3.0.2] Section 4.4.2 page 201 | 
|  | 473 | // 'renderbuffer' must be either zero or the name of an existing renderbuffer object of | 
|  | 474 | // type 'renderbuffertarget', otherwise an INVALID_OPERATION error is generated. | 
|  | 475 | return error(GL_INVALID_OPERATION); | 
|  | 476 | } | 
| Alexis Hetu | 42a584d | 2014-11-07 14:23:33 -0500 | [diff] [blame] | 477 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 478 | context->bindRenderbuffer(renderbuffer); | 
|  | 479 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 480 | } | 
|  | 481 |  | 
|  | 482 | void GL_APIENTRY glBindTexture(GLenum target, GLuint texture) | 
|  | 483 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 484 | TRACE("(GLenum target = 0x%X, GLuint texture = %d)", target, texture); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 485 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 486 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 487 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 488 | if(context) | 
|  | 489 | { | 
|  | 490 | es2::Texture *textureObject = context->getTexture(texture); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 491 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 492 | if(textureObject && textureObject->getTarget() != target && texture != 0) | 
|  | 493 | { | 
|  | 494 | return error(GL_INVALID_OPERATION); | 
|  | 495 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 496 |  | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 497 | egl::GLint clientVersion = context->getClientVersion(); | 
|  | 498 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 499 | switch(target) | 
|  | 500 | { | 
|  | 501 | case GL_TEXTURE_2D: | 
|  | 502 | context->bindTexture2D(texture); | 
|  | 503 | return; | 
|  | 504 | case GL_TEXTURE_CUBE_MAP: | 
|  | 505 | context->bindTextureCubeMap(texture); | 
|  | 506 | return; | 
|  | 507 | case GL_TEXTURE_EXTERNAL_OES: | 
|  | 508 | context->bindTextureExternal(texture); | 
|  | 509 | return; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 510 | case GL_TEXTURE_2D_ARRAY: | 
|  | 511 | if(clientVersion < 3) | 
|  | 512 | { | 
|  | 513 | return error(GL_INVALID_ENUM); | 
|  | 514 | } | 
|  | 515 | else | 
|  | 516 | { | 
|  | 517 | UNIMPLEMENTED(); | 
|  | 518 | context->bindTexture3D(texture); | 
|  | 519 | break; | 
|  | 520 | } | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 521 | case GL_TEXTURE_3D_OES: | 
|  | 522 | context->bindTexture3D(texture); | 
|  | 523 | return; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 524 | default: | 
|  | 525 | return error(GL_INVALID_ENUM); | 
|  | 526 | } | 
|  | 527 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 528 | } | 
|  | 529 |  | 
|  | 530 | void GL_APIENTRY glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) | 
|  | 531 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 532 | TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)", | 
|  | 533 | red, green, blue, alpha); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 534 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 535 | es2::Context* context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 536 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 537 | if(context) | 
|  | 538 | { | 
|  | 539 | context->setBlendColor(es2::clamp01(red), es2::clamp01(green), es2::clamp01(blue), es2::clamp01(alpha)); | 
|  | 540 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 541 | } | 
|  | 542 |  | 
|  | 543 | void GL_APIENTRY glBlendEquation(GLenum mode) | 
|  | 544 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 545 | glBlendEquationSeparate(mode, mode); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 546 | } | 
|  | 547 |  | 
|  | 548 | void GL_APIENTRY glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) | 
|  | 549 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 550 | TRACE("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 551 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 552 | switch(modeRGB) | 
|  | 553 | { | 
|  | 554 | case GL_FUNC_ADD: | 
|  | 555 | case GL_FUNC_SUBTRACT: | 
|  | 556 | case GL_FUNC_REVERSE_SUBTRACT: | 
|  | 557 | case GL_MIN_EXT: | 
|  | 558 | case GL_MAX_EXT: | 
|  | 559 | break; | 
|  | 560 | default: | 
|  | 561 | return error(GL_INVALID_ENUM); | 
|  | 562 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 563 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 564 | switch(modeAlpha) | 
|  | 565 | { | 
|  | 566 | case GL_FUNC_ADD: | 
|  | 567 | case GL_FUNC_SUBTRACT: | 
|  | 568 | case GL_FUNC_REVERSE_SUBTRACT: | 
|  | 569 | case GL_MIN_EXT: | 
|  | 570 | case GL_MAX_EXT: | 
|  | 571 | break; | 
|  | 572 | default: | 
|  | 573 | return error(GL_INVALID_ENUM); | 
|  | 574 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 575 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 576 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 577 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 578 | if(context) | 
|  | 579 | { | 
|  | 580 | context->setBlendEquation(modeRGB, modeAlpha); | 
|  | 581 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 582 | } | 
|  | 583 |  | 
|  | 584 | void GL_APIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor) | 
|  | 585 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 586 | glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 587 | } | 
|  | 588 |  | 
|  | 589 | void GL_APIENTRY glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) | 
|  | 590 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 591 | TRACE("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)", | 
|  | 592 | srcRGB, dstRGB, srcAlpha, dstAlpha); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 593 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 594 | switch(srcRGB) | 
|  | 595 | { | 
|  | 596 | case GL_ZERO: | 
|  | 597 | case GL_ONE: | 
|  | 598 | case GL_SRC_COLOR: | 
|  | 599 | case GL_ONE_MINUS_SRC_COLOR: | 
|  | 600 | case GL_DST_COLOR: | 
|  | 601 | case GL_ONE_MINUS_DST_COLOR: | 
|  | 602 | case GL_SRC_ALPHA: | 
|  | 603 | case GL_ONE_MINUS_SRC_ALPHA: | 
|  | 604 | case GL_DST_ALPHA: | 
|  | 605 | case GL_ONE_MINUS_DST_ALPHA: | 
|  | 606 | case GL_CONSTANT_COLOR: | 
|  | 607 | case GL_ONE_MINUS_CONSTANT_COLOR: | 
|  | 608 | case GL_CONSTANT_ALPHA: | 
|  | 609 | case GL_ONE_MINUS_CONSTANT_ALPHA: | 
|  | 610 | case GL_SRC_ALPHA_SATURATE: | 
|  | 611 | break; | 
|  | 612 | default: | 
|  | 613 | return error(GL_INVALID_ENUM); | 
|  | 614 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 615 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 616 | switch(dstRGB) | 
|  | 617 | { | 
|  | 618 | case GL_ZERO: | 
|  | 619 | case GL_ONE: | 
|  | 620 | case GL_SRC_COLOR: | 
|  | 621 | case GL_ONE_MINUS_SRC_COLOR: | 
|  | 622 | case GL_DST_COLOR: | 
|  | 623 | case GL_ONE_MINUS_DST_COLOR: | 
|  | 624 | case GL_SRC_ALPHA: | 
|  | 625 | case GL_ONE_MINUS_SRC_ALPHA: | 
|  | 626 | case GL_DST_ALPHA: | 
|  | 627 | case GL_ONE_MINUS_DST_ALPHA: | 
|  | 628 | case GL_CONSTANT_COLOR: | 
|  | 629 | case GL_ONE_MINUS_CONSTANT_COLOR: | 
|  | 630 | case GL_CONSTANT_ALPHA: | 
|  | 631 | case GL_ONE_MINUS_CONSTANT_ALPHA: | 
|  | 632 | break; | 
|  | 633 | default: | 
|  | 634 | return error(GL_INVALID_ENUM); | 
|  | 635 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 636 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 637 | switch(srcAlpha) | 
|  | 638 | { | 
|  | 639 | case GL_ZERO: | 
|  | 640 | case GL_ONE: | 
|  | 641 | case GL_SRC_COLOR: | 
|  | 642 | case GL_ONE_MINUS_SRC_COLOR: | 
|  | 643 | case GL_DST_COLOR: | 
|  | 644 | case GL_ONE_MINUS_DST_COLOR: | 
|  | 645 | case GL_SRC_ALPHA: | 
|  | 646 | case GL_ONE_MINUS_SRC_ALPHA: | 
|  | 647 | case GL_DST_ALPHA: | 
|  | 648 | case GL_ONE_MINUS_DST_ALPHA: | 
|  | 649 | case GL_CONSTANT_COLOR: | 
|  | 650 | case GL_ONE_MINUS_CONSTANT_COLOR: | 
|  | 651 | case GL_CONSTANT_ALPHA: | 
|  | 652 | case GL_ONE_MINUS_CONSTANT_ALPHA: | 
|  | 653 | case GL_SRC_ALPHA_SATURATE: | 
|  | 654 | break; | 
|  | 655 | default: | 
|  | 656 | return error(GL_INVALID_ENUM); | 
|  | 657 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 658 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 659 | switch(dstAlpha) | 
|  | 660 | { | 
|  | 661 | case GL_ZERO: | 
|  | 662 | case GL_ONE: | 
|  | 663 | case GL_SRC_COLOR: | 
|  | 664 | case GL_ONE_MINUS_SRC_COLOR: | 
|  | 665 | case GL_DST_COLOR: | 
|  | 666 | case GL_ONE_MINUS_DST_COLOR: | 
|  | 667 | case GL_SRC_ALPHA: | 
|  | 668 | case GL_ONE_MINUS_SRC_ALPHA: | 
|  | 669 | case GL_DST_ALPHA: | 
|  | 670 | case GL_ONE_MINUS_DST_ALPHA: | 
|  | 671 | case GL_CONSTANT_COLOR: | 
|  | 672 | case GL_ONE_MINUS_CONSTANT_COLOR: | 
|  | 673 | case GL_CONSTANT_ALPHA: | 
|  | 674 | case GL_ONE_MINUS_CONSTANT_ALPHA: | 
|  | 675 | break; | 
|  | 676 | default: | 
|  | 677 | return error(GL_INVALID_ENUM); | 
|  | 678 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 679 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 680 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 681 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 682 | if(context) | 
|  | 683 | { | 
|  | 684 | context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha); | 
|  | 685 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 686 | } | 
|  | 687 |  | 
|  | 688 | void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage) | 
| Nicolas Capens | 54b721d | 2014-12-12 12:50:04 -0500 | [diff] [blame] | 689 | { | 
|  | 690 | size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications | 
| Nicolas Capens | 4cadfe3 | 2014-12-10 22:26:26 -0500 | [diff] [blame] | 691 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 692 | TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)", | 
|  | 693 | target, size, data, usage); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 694 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 695 | if(size < 0) | 
|  | 696 | { | 
|  | 697 | return error(GL_INVALID_VALUE); | 
|  | 698 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 699 |  | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 700 | egl::GLint clientVersion = egl::getClientVersion(); | 
|  | 701 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 702 | switch(usage) | 
|  | 703 | { | 
|  | 704 | case GL_STREAM_DRAW: | 
|  | 705 | case GL_STATIC_DRAW: | 
|  | 706 | case GL_DYNAMIC_DRAW: | 
|  | 707 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 708 | case GL_STREAM_READ: | 
|  | 709 | case GL_STREAM_COPY: | 
|  | 710 | case GL_STATIC_READ: | 
|  | 711 | case GL_STATIC_COPY: | 
|  | 712 | case GL_DYNAMIC_READ: | 
|  | 713 | case GL_DYNAMIC_COPY: | 
|  | 714 | if(clientVersion < 3) | 
|  | 715 | { | 
|  | 716 | return error(GL_INVALID_ENUM); | 
|  | 717 | } | 
|  | 718 | break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 719 | default: | 
|  | 720 | return error(GL_INVALID_ENUM); | 
|  | 721 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 722 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 723 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 724 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 725 | if(context) | 
|  | 726 | { | 
|  | 727 | es2::Buffer *buffer; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 728 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 729 | switch(target) | 
|  | 730 | { | 
|  | 731 | case GL_ARRAY_BUFFER: | 
|  | 732 | buffer = context->getArrayBuffer(); | 
|  | 733 | break; | 
|  | 734 | case GL_ELEMENT_ARRAY_BUFFER: | 
|  | 735 | buffer = context->getElementArrayBuffer(); | 
|  | 736 | break; | 
|  | 737 | default: | 
|  | 738 | return error(GL_INVALID_ENUM); | 
|  | 739 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 740 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 741 | if(!buffer) | 
|  | 742 | { | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 743 | // A null buffer means that "0" is bound to the requested buffer target | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 744 | return error(GL_INVALID_OPERATION); | 
|  | 745 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 746 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 747 | buffer->bufferData(data, size, usage); | 
|  | 748 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 749 | } | 
|  | 750 |  | 
|  | 751 | void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data) | 
| Nicolas Capens | 54b721d | 2014-12-12 12:50:04 -0500 | [diff] [blame] | 752 | { | 
|  | 753 | size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications | 
|  | 754 | offset = static_cast<GLint>(offset); | 
| Nicolas Capens | 4cadfe3 | 2014-12-10 22:26:26 -0500 | [diff] [blame] | 755 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 756 | TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)", | 
|  | 757 | target, offset, size, data); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 758 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 759 | if(size < 0 || offset < 0) | 
|  | 760 | { | 
|  | 761 | return error(GL_INVALID_VALUE); | 
|  | 762 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 763 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 764 | if(data == NULL) | 
|  | 765 | { | 
|  | 766 | return; | 
|  | 767 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 768 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 769 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 770 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 771 | if(context) | 
|  | 772 | { | 
|  | 773 | es2::Buffer *buffer; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 774 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 775 | switch(target) | 
|  | 776 | { | 
|  | 777 | case GL_ARRAY_BUFFER: | 
|  | 778 | buffer = context->getArrayBuffer(); | 
|  | 779 | break; | 
|  | 780 | case GL_ELEMENT_ARRAY_BUFFER: | 
|  | 781 | buffer = context->getElementArrayBuffer(); | 
|  | 782 | break; | 
|  | 783 | default: | 
|  | 784 | return error(GL_INVALID_ENUM); | 
|  | 785 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 786 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 787 | if(!buffer) | 
|  | 788 | { | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 789 | // A null buffer means that "0" is bound to the requested buffer target | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 790 | return error(GL_INVALID_OPERATION); | 
|  | 791 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 792 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 793 | if((size_t)size + offset > buffer->size()) | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 794 | { | 
|  | 795 | return error(GL_INVALID_VALUE); | 
|  | 796 | } | 
|  | 797 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 798 | buffer->bufferSubData(data, size, offset); | 
|  | 799 | } | 
|  | 800 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 801 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 802 | GLenum GL_APIENTRY glCheckFramebufferStatus(GLenum target) | 
|  | 803 | { | 
|  | 804 | TRACE("(GLenum target = 0x%X)", target); | 
|  | 805 |  | 
|  | 806 | if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE) | 
|  | 807 | { | 
|  | 808 | return error(GL_INVALID_ENUM, 0); | 
|  | 809 | } | 
|  | 810 |  | 
|  | 811 | es2::Context *context = es2::getContext(); | 
|  | 812 |  | 
|  | 813 | if(context) | 
|  | 814 | { | 
|  | 815 | es2::Framebuffer *framebuffer = NULL; | 
|  | 816 | if(target == GL_READ_FRAMEBUFFER_ANGLE) | 
|  | 817 | { | 
|  | 818 | framebuffer = context->getReadFramebuffer(); | 
|  | 819 | } | 
|  | 820 | else | 
|  | 821 | { | 
|  | 822 | framebuffer = context->getDrawFramebuffer(); | 
|  | 823 | } | 
|  | 824 |  | 
|  | 825 | return framebuffer->completeness(); | 
|  | 826 | } | 
|  | 827 |  | 
|  | 828 | return 0; | 
|  | 829 | } | 
|  | 830 |  | 
|  | 831 | void GL_APIENTRY glClear(GLbitfield mask) | 
|  | 832 | { | 
|  | 833 | TRACE("(GLbitfield mask = %X)", mask); | 
|  | 834 |  | 
|  | 835 | if((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0) | 
|  | 836 | { | 
|  | 837 | return error(GL_INVALID_VALUE); | 
|  | 838 | } | 
|  | 839 |  | 
|  | 840 | es2::Context *context = es2::getContext(); | 
|  | 841 |  | 
|  | 842 | if(context) | 
|  | 843 | { | 
|  | 844 | context->clear(mask); | 
|  | 845 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 846 | } | 
|  | 847 |  | 
|  | 848 | void GL_APIENTRY glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) | 
|  | 849 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 850 | TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)", | 
|  | 851 | red, green, blue, alpha); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 852 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 853 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 854 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 855 | if(context) | 
|  | 856 | { | 
|  | 857 | context->setClearColor(red, green, blue, alpha); | 
|  | 858 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 859 | } | 
|  | 860 |  | 
|  | 861 | void GL_APIENTRY glClearDepthf(GLclampf depth) | 
|  | 862 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 863 | TRACE("(GLclampf depth = %f)", depth); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 864 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 865 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 866 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 867 | if(context) | 
|  | 868 | { | 
|  | 869 | context->setClearDepth(depth); | 
|  | 870 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 871 | } | 
|  | 872 |  | 
|  | 873 | void GL_APIENTRY glClearStencil(GLint s) | 
|  | 874 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 875 | TRACE("(GLint s = %d)", s); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 876 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 877 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 878 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 879 | if(context) | 
|  | 880 | { | 
|  | 881 | context->setClearStencil(s); | 
|  | 882 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 883 | } | 
|  | 884 |  | 
|  | 885 | void GL_APIENTRY glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) | 
|  | 886 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 887 | TRACE("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)", | 
|  | 888 | red, green, blue, alpha); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 889 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 890 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 891 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 892 | if(context) | 
|  | 893 | { | 
|  | 894 | context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE); | 
|  | 895 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 896 | } | 
|  | 897 |  | 
|  | 898 | void GL_APIENTRY glCompileShader(GLuint shader) | 
|  | 899 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 900 | TRACE("(GLuint shader = %d)", shader); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 901 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 902 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 903 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 904 | if(context) | 
|  | 905 | { | 
|  | 906 | es2::Shader *shaderObject = context->getShader(shader); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 907 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 908 | if(!shaderObject) | 
|  | 909 | { | 
|  | 910 | if(context->getProgram(shader)) | 
|  | 911 | { | 
|  | 912 | return error(GL_INVALID_OPERATION); | 
|  | 913 | } | 
|  | 914 | else | 
|  | 915 | { | 
|  | 916 | return error(GL_INVALID_VALUE); | 
|  | 917 | } | 
|  | 918 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 919 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 920 | shaderObject->compile(); | 
|  | 921 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 922 | } | 
|  | 923 |  | 
| Nicolas Capens | 08e90f0 | 2014-11-21 12:49:12 -0500 | [diff] [blame] | 924 | void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 925 | GLint border, GLsizei imageSize, const GLvoid* data) | 
|  | 926 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 927 | TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, " | 
|  | 928 | "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)", | 
|  | 929 | target, level, internalformat, width, height, border, imageSize, data); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 930 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 931 | if(!validImageSize(level, width, height) || border != 0 || imageSize < 0) | 
|  | 932 | { | 
|  | 933 | return error(GL_INVALID_VALUE); | 
|  | 934 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 935 |  | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 936 | egl::GLint clientVersion = egl::getClientVersion(); | 
|  | 937 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 938 | switch(internalformat) | 
|  | 939 | { | 
| Nicolas Capens | 2265824 | 2014-11-29 00:31:41 -0500 | [diff] [blame] | 940 | case GL_ETC1_RGB8_OES: | 
|  | 941 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 942 | case GL_COMPRESSED_R11_EAC: | 
|  | 943 | case GL_COMPRESSED_SIGNED_R11_EAC: | 
|  | 944 | case GL_COMPRESSED_RG11_EAC: | 
|  | 945 | case GL_COMPRESSED_SIGNED_RG11_EAC: | 
|  | 946 | case GL_COMPRESSED_RGB8_ETC2: | 
|  | 947 | case GL_COMPRESSED_SRGB8_ETC2: | 
|  | 948 | case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: | 
|  | 949 | case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: | 
|  | 950 | case GL_COMPRESSED_RGBA8_ETC2_EAC: | 
|  | 951 | case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: | 
|  | 952 | if(clientVersion >= 3) | 
|  | 953 | { | 
|  | 954 | break; | 
|  | 955 | } | 
|  | 956 | return error(GL_INVALID_ENUM); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 957 | case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: | 
|  | 958 | case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: | 
|  | 959 | case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: | 
|  | 960 | case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: | 
|  | 961 | if(!S3TC_SUPPORT) | 
|  | 962 | { | 
|  | 963 | return error(GL_INVALID_ENUM); | 
|  | 964 | } | 
|  | 965 | break; | 
|  | 966 | case GL_DEPTH_COMPONENT: | 
|  | 967 | case GL_DEPTH_COMPONENT16: | 
|  | 968 | case GL_DEPTH_COMPONENT32_OES: | 
|  | 969 | case GL_DEPTH_STENCIL_OES: | 
|  | 970 | case GL_DEPTH24_STENCIL8_OES: | 
|  | 971 | return error(GL_INVALID_OPERATION); | 
|  | 972 | default: | 
|  | 973 | return error(GL_INVALID_ENUM); | 
|  | 974 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 975 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 976 | if(border != 0) | 
|  | 977 | { | 
|  | 978 | return error(GL_INVALID_VALUE); | 
|  | 979 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 980 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 981 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 982 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 983 | if(context) | 
|  | 984 | { | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 985 | if(level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 986 | { | 
|  | 987 | return error(GL_INVALID_VALUE); | 
|  | 988 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 989 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 990 | switch(target) | 
|  | 991 | { | 
|  | 992 | case GL_TEXTURE_2D: | 
|  | 993 | if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) || | 
|  | 994 | height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level)) | 
|  | 995 | { | 
|  | 996 | return error(GL_INVALID_VALUE); | 
|  | 997 | } | 
|  | 998 | break; | 
|  | 999 | case GL_TEXTURE_CUBE_MAP_POSITIVE_X: | 
|  | 1000 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: | 
|  | 1001 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: | 
|  | 1002 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: | 
|  | 1003 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: | 
|  | 1004 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: | 
|  | 1005 | if(width != height) | 
|  | 1006 | { | 
|  | 1007 | return error(GL_INVALID_VALUE); | 
|  | 1008 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1009 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1010 | if(width > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) || | 
|  | 1011 | height > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level)) | 
|  | 1012 | { | 
|  | 1013 | return error(GL_INVALID_VALUE); | 
|  | 1014 | } | 
|  | 1015 | break; | 
|  | 1016 | default: | 
|  | 1017 | return error(GL_INVALID_ENUM); | 
|  | 1018 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1019 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1020 | if(imageSize != es2::ComputeCompressedSize(width, height, internalformat)) | 
|  | 1021 | { | 
|  | 1022 | return error(GL_INVALID_VALUE); | 
|  | 1023 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1024 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1025 | if(target == GL_TEXTURE_2D) | 
|  | 1026 | { | 
|  | 1027 | es2::Texture2D *texture = context->getTexture2D(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1028 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1029 | if(!texture) | 
|  | 1030 | { | 
|  | 1031 | return error(GL_INVALID_OPERATION); | 
|  | 1032 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1033 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1034 | texture->setCompressedImage(level, internalformat, width, height, imageSize, data); | 
|  | 1035 | } | 
|  | 1036 | else | 
|  | 1037 | { | 
|  | 1038 | es2::TextureCubeMap *texture = context->getTextureCubeMap(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1039 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1040 | if(!texture) | 
|  | 1041 | { | 
|  | 1042 | return error(GL_INVALID_OPERATION); | 
|  | 1043 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1044 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1045 | switch(target) | 
|  | 1046 | { | 
|  | 1047 | case GL_TEXTURE_CUBE_MAP_POSITIVE_X: | 
|  | 1048 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: | 
|  | 1049 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: | 
|  | 1050 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: | 
|  | 1051 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: | 
|  | 1052 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: | 
|  | 1053 | texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data); | 
|  | 1054 | break; | 
|  | 1055 | default: UNREACHABLE(); | 
|  | 1056 | } | 
|  | 1057 | } | 
|  | 1058 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1059 | } | 
|  | 1060 |  | 
|  | 1061 | void GL_APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1062 | GLenum format, GLsizei imageSize, const GLvoid* data) | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1063 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1064 | TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, " | 
|  | 1065 | "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, " | 
|  | 1066 | "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)", | 
|  | 1067 | target, level, xoffset, yoffset, width, height, format, imageSize, data); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1068 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1069 | if(!es2::IsTextureTarget(target)) | 
|  | 1070 | { | 
|  | 1071 | return error(GL_INVALID_ENUM); | 
|  | 1072 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1073 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1074 | if(xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0) | 
|  | 1075 | { | 
|  | 1076 | return error(GL_INVALID_VALUE); | 
|  | 1077 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1078 |  | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 1079 | egl::GLint clientVersion = egl::getClientVersion(); | 
|  | 1080 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1081 | switch(format) | 
|  | 1082 | { | 
| Nicolas Capens | 2265824 | 2014-11-29 00:31:41 -0500 | [diff] [blame] | 1083 | case GL_ETC1_RGB8_OES: | 
|  | 1084 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 1085 | case GL_COMPRESSED_R11_EAC: | 
|  | 1086 | case GL_COMPRESSED_SIGNED_R11_EAC: | 
|  | 1087 | case GL_COMPRESSED_RG11_EAC: | 
|  | 1088 | case GL_COMPRESSED_SIGNED_RG11_EAC: | 
|  | 1089 | case GL_COMPRESSED_RGB8_ETC2: | 
|  | 1090 | case GL_COMPRESSED_SRGB8_ETC2: | 
|  | 1091 | case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: | 
|  | 1092 | case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: | 
|  | 1093 | case GL_COMPRESSED_RGBA8_ETC2_EAC: | 
|  | 1094 | case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: | 
|  | 1095 | if(clientVersion >= 3) | 
|  | 1096 | { | 
|  | 1097 | break; | 
|  | 1098 | } | 
|  | 1099 | return error(GL_INVALID_ENUM); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1100 | case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: | 
|  | 1101 | case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: | 
|  | 1102 | case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: | 
|  | 1103 | case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: | 
|  | 1104 | if(!S3TC_SUPPORT) | 
|  | 1105 | { | 
|  | 1106 | return error(GL_INVALID_ENUM); | 
|  | 1107 | } | 
|  | 1108 | break; | 
|  | 1109 | default: | 
|  | 1110 | return error(GL_INVALID_ENUM); | 
|  | 1111 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1112 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1113 | if(width == 0 || height == 0 || data == NULL) | 
|  | 1114 | { | 
|  | 1115 | return; | 
|  | 1116 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1117 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1118 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1119 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1120 | if(context) | 
|  | 1121 | { | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 1122 | if(level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1123 | { | 
|  | 1124 | return error(GL_INVALID_VALUE); | 
|  | 1125 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1126 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1127 | if(imageSize != es2::ComputeCompressedSize(width, height, format)) | 
|  | 1128 | { | 
|  | 1129 | return error(GL_INVALID_VALUE); | 
|  | 1130 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1131 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1132 | if(xoffset % 4 != 0 || yoffset % 4 != 0) | 
|  | 1133 | { | 
|  | 1134 | // We wait to check the offsets until this point, because the multiple-of-four restriction does not exist unless DXT1 textures are supported | 
|  | 1135 | return error(GL_INVALID_OPERATION); | 
|  | 1136 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1137 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1138 | if(target == GL_TEXTURE_2D) | 
|  | 1139 | { | 
|  | 1140 | es2::Texture2D *texture = context->getTexture2D(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1141 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1142 | if(validateSubImageParams(true, width, height, xoffset, yoffset, target, level, format, texture)) | 
|  | 1143 | { | 
|  | 1144 | texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data); | 
|  | 1145 | } | 
|  | 1146 | } | 
|  | 1147 | else if(es2::IsCubemapTextureTarget(target)) | 
|  | 1148 | { | 
|  | 1149 | es2::TextureCubeMap *texture = context->getTextureCubeMap(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1150 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1151 | if(validateSubImageParams(true, width, height, xoffset, yoffset, target, level, format, texture)) | 
|  | 1152 | { | 
|  | 1153 | texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data); | 
|  | 1154 | } | 
|  | 1155 | } | 
|  | 1156 | else | 
|  | 1157 | { | 
|  | 1158 | UNREACHABLE(); | 
|  | 1159 | } | 
|  | 1160 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1161 | } | 
|  | 1162 |  | 
|  | 1163 | void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) | 
|  | 1164 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1165 | TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, " | 
|  | 1166 | "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)", | 
|  | 1167 | target, level, internalformat, x, y, width, height, border); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1168 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1169 | if(!validImageSize(level, width, height)) | 
|  | 1170 | { | 
|  | 1171 | return error(GL_INVALID_VALUE); | 
|  | 1172 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1173 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1174 | if(border != 0) | 
|  | 1175 | { | 
|  | 1176 | return error(GL_INVALID_VALUE); | 
|  | 1177 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1178 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1179 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1180 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1181 | if(context) | 
|  | 1182 | { | 
|  | 1183 | switch(target) | 
|  | 1184 | { | 
|  | 1185 | case GL_TEXTURE_2D: | 
|  | 1186 | if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) || | 
|  | 1187 | height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level)) | 
|  | 1188 | { | 
|  | 1189 | return error(GL_INVALID_VALUE); | 
|  | 1190 | } | 
|  | 1191 | break; | 
|  | 1192 | case GL_TEXTURE_CUBE_MAP_POSITIVE_X: | 
|  | 1193 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: | 
|  | 1194 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: | 
|  | 1195 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: | 
|  | 1196 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: | 
|  | 1197 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: | 
|  | 1198 | if(width != height) | 
|  | 1199 | { | 
|  | 1200 | return error(GL_INVALID_VALUE); | 
|  | 1201 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1202 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1203 | if(width > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) || | 
|  | 1204 | height > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level)) | 
|  | 1205 | { | 
|  | 1206 | return error(GL_INVALID_VALUE); | 
|  | 1207 | } | 
|  | 1208 | break; | 
|  | 1209 | default: | 
|  | 1210 | return error(GL_INVALID_ENUM); | 
|  | 1211 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1212 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1213 | es2::Framebuffer *framebuffer = context->getReadFramebuffer(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1214 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1215 | if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) | 
|  | 1216 | { | 
|  | 1217 | return error(GL_INVALID_FRAMEBUFFER_OPERATION); | 
|  | 1218 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1219 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 1220 | if(context->getReadFramebufferName() != 0 && framebuffer->getColorbuffer()->getSamples() > 1) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1221 | { | 
|  | 1222 | return error(GL_INVALID_OPERATION); | 
|  | 1223 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1224 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1225 | es2::Renderbuffer *source = framebuffer->getColorbuffer(); | 
|  | 1226 | GLenum colorbufferFormat = source->getFormat(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1227 |  | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 1228 | if(!validateColorBufferFormat(internalformat, colorbufferFormat)) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1229 | { | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 1230 | return; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1231 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1232 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1233 | if(target == GL_TEXTURE_2D) | 
|  | 1234 | { | 
|  | 1235 | es2::Texture2D *texture = context->getTexture2D(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1236 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1237 | if(!texture) | 
|  | 1238 | { | 
|  | 1239 | return error(GL_INVALID_OPERATION); | 
|  | 1240 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1241 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1242 | texture->copyImage(level, internalformat, x, y, width, height, framebuffer); | 
|  | 1243 | } | 
|  | 1244 | else if(es2::IsCubemapTextureTarget(target)) | 
|  | 1245 | { | 
|  | 1246 | es2::TextureCubeMap *texture = context->getTextureCubeMap(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1247 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1248 | if(!texture) | 
|  | 1249 | { | 
|  | 1250 | return error(GL_INVALID_OPERATION); | 
|  | 1251 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1252 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1253 | texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer); | 
|  | 1254 | } | 
|  | 1255 | else UNREACHABLE(); | 
|  | 1256 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1257 | } | 
|  | 1258 |  | 
|  | 1259 | void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) | 
|  | 1260 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1261 | TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, " | 
|  | 1262 | "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", | 
|  | 1263 | target, level, xoffset, yoffset, x, y, width, height); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1264 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1265 | if(!es2::IsTextureTarget(target)) | 
|  | 1266 | { | 
|  | 1267 | return error(GL_INVALID_ENUM); | 
|  | 1268 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1269 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1270 | if(level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0) | 
|  | 1271 | { | 
|  | 1272 | return error(GL_INVALID_VALUE); | 
|  | 1273 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1274 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1275 | if(std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height) | 
|  | 1276 | { | 
|  | 1277 | return error(GL_INVALID_VALUE); | 
|  | 1278 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1279 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1280 | if(width == 0 || height == 0) | 
|  | 1281 | { | 
|  | 1282 | return; | 
|  | 1283 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1284 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1285 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1286 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1287 | if(context) | 
|  | 1288 | { | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 1289 | if(level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1290 | { | 
|  | 1291 | return error(GL_INVALID_VALUE); | 
|  | 1292 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1293 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1294 | es2::Framebuffer *framebuffer = context->getReadFramebuffer(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1295 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1296 | if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) | 
|  | 1297 | { | 
|  | 1298 | return error(GL_INVALID_FRAMEBUFFER_OPERATION); | 
|  | 1299 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1300 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 1301 | if(context->getReadFramebufferName() != 0 && framebuffer->getColorbuffer()->getSamples() > 1) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1302 | { | 
|  | 1303 | return error(GL_INVALID_OPERATION); | 
|  | 1304 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1305 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1306 | es2::Renderbuffer *source = framebuffer->getColorbuffer(); | 
|  | 1307 | GLenum colorbufferFormat = source->getFormat(); | 
|  | 1308 | es2::Texture *texture = NULL; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1309 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1310 | if(target == GL_TEXTURE_2D) | 
|  | 1311 | { | 
|  | 1312 | texture = context->getTexture2D(); | 
|  | 1313 | } | 
|  | 1314 | else if(es2::IsCubemapTextureTarget(target)) | 
|  | 1315 | { | 
|  | 1316 | texture = context->getTextureCubeMap(); | 
|  | 1317 | } | 
|  | 1318 | else UNREACHABLE(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1319 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1320 | if(!validateSubImageParams(false, width, height, xoffset, yoffset, target, level, GL_NONE, texture)) | 
|  | 1321 | { | 
|  | 1322 | return; | 
|  | 1323 | } | 
|  | 1324 |  | 
|  | 1325 | GLenum textureFormat = texture->getFormat(target, level); | 
|  | 1326 |  | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 1327 | if(!validateColorBufferFormat(textureFormat, colorbufferFormat)) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1328 | { | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 1329 | return; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1330 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1331 |  | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 1332 | texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1333 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1334 | } | 
|  | 1335 |  | 
|  | 1336 | GLuint GL_APIENTRY glCreateProgram(void) | 
|  | 1337 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1338 | TRACE("()"); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1339 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1340 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1341 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1342 | if(context) | 
|  | 1343 | { | 
|  | 1344 | return context->createProgram(); | 
|  | 1345 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1346 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1347 | return 0; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1348 | } | 
|  | 1349 |  | 
|  | 1350 | GLuint GL_APIENTRY glCreateShader(GLenum type) | 
|  | 1351 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1352 | TRACE("(GLenum type = 0x%X)", type); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1353 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1354 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1355 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1356 | if(context) | 
|  | 1357 | { | 
|  | 1358 | switch(type) | 
|  | 1359 | { | 
|  | 1360 | case GL_FRAGMENT_SHADER: | 
|  | 1361 | case GL_VERTEX_SHADER: | 
|  | 1362 | return context->createShader(type); | 
|  | 1363 | default: | 
|  | 1364 | return error(GL_INVALID_ENUM, 0); | 
|  | 1365 | } | 
|  | 1366 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1367 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1368 | return 0; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1369 | } | 
|  | 1370 |  | 
|  | 1371 | void GL_APIENTRY glCullFace(GLenum mode) | 
|  | 1372 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1373 | TRACE("(GLenum mode = 0x%X)", mode); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1374 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1375 | switch(mode) | 
|  | 1376 | { | 
|  | 1377 | case GL_FRONT: | 
|  | 1378 | case GL_BACK: | 
|  | 1379 | case GL_FRONT_AND_BACK: | 
|  | 1380 | { | 
|  | 1381 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1382 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1383 | if(context) | 
|  | 1384 | { | 
|  | 1385 | context->setCullMode(mode); | 
|  | 1386 | } | 
|  | 1387 | } | 
|  | 1388 | break; | 
|  | 1389 | default: | 
|  | 1390 | return error(GL_INVALID_ENUM); | 
|  | 1391 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1392 | } | 
|  | 1393 |  | 
|  | 1394 | void GL_APIENTRY glDeleteBuffers(GLsizei n, const GLuint* buffers) | 
|  | 1395 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1396 | TRACE("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1397 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1398 | if(n < 0) | 
|  | 1399 | { | 
|  | 1400 | return error(GL_INVALID_VALUE); | 
|  | 1401 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1402 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1403 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1404 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1405 | if(context) | 
|  | 1406 | { | 
|  | 1407 | for(int i = 0; i < n; i++) | 
|  | 1408 | { | 
|  | 1409 | context->deleteBuffer(buffers[i]); | 
|  | 1410 | } | 
|  | 1411 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1412 | } | 
|  | 1413 |  | 
|  | 1414 | void GL_APIENTRY glDeleteFencesNV(GLsizei n, const GLuint* fences) | 
|  | 1415 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1416 | TRACE("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1417 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1418 | if(n < 0) | 
|  | 1419 | { | 
|  | 1420 | return error(GL_INVALID_VALUE); | 
|  | 1421 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1422 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1423 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1424 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1425 | if(context) | 
|  | 1426 | { | 
|  | 1427 | for(int i = 0; i < n; i++) | 
|  | 1428 | { | 
|  | 1429 | context->deleteFence(fences[i]); | 
|  | 1430 | } | 
|  | 1431 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1432 | } | 
|  | 1433 |  | 
|  | 1434 | void GL_APIENTRY glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers) | 
|  | 1435 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1436 | TRACE("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1437 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1438 | if(n < 0) | 
|  | 1439 | { | 
|  | 1440 | return error(GL_INVALID_VALUE); | 
|  | 1441 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1442 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1443 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1444 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1445 | if(context) | 
|  | 1446 | { | 
|  | 1447 | for(int i = 0; i < n; i++) | 
|  | 1448 | { | 
|  | 1449 | if(framebuffers[i] != 0) | 
|  | 1450 | { | 
|  | 1451 | context->deleteFramebuffer(framebuffers[i]); | 
|  | 1452 | } | 
|  | 1453 | } | 
|  | 1454 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1455 | } | 
|  | 1456 |  | 
|  | 1457 | void GL_APIENTRY glDeleteProgram(GLuint program) | 
|  | 1458 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1459 | TRACE("(GLuint program = %d)", program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1460 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1461 | if(program == 0) | 
|  | 1462 | { | 
|  | 1463 | return; | 
|  | 1464 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1465 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1466 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1467 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1468 | if(context) | 
|  | 1469 | { | 
|  | 1470 | if(!context->getProgram(program)) | 
|  | 1471 | { | 
|  | 1472 | if(context->getShader(program)) | 
|  | 1473 | { | 
|  | 1474 | return error(GL_INVALID_OPERATION); | 
|  | 1475 | } | 
|  | 1476 | else | 
|  | 1477 | { | 
|  | 1478 | return error(GL_INVALID_VALUE); | 
|  | 1479 | } | 
|  | 1480 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1481 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1482 | context->deleteProgram(program); | 
|  | 1483 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1484 | } | 
|  | 1485 |  | 
|  | 1486 | void GL_APIENTRY glDeleteQueriesEXT(GLsizei n, const GLuint *ids) | 
|  | 1487 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1488 | TRACE("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1489 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1490 | if(n < 0) | 
|  | 1491 | { | 
|  | 1492 | return error(GL_INVALID_VALUE); | 
|  | 1493 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1494 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1495 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1496 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1497 | if(context) | 
|  | 1498 | { | 
|  | 1499 | for(int i = 0; i < n; i++) | 
|  | 1500 | { | 
|  | 1501 | context->deleteQuery(ids[i]); | 
|  | 1502 | } | 
|  | 1503 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1504 | } | 
|  | 1505 |  | 
|  | 1506 | void GL_APIENTRY glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) | 
|  | 1507 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1508 | TRACE("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1509 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1510 | if(n < 0) | 
|  | 1511 | { | 
|  | 1512 | return error(GL_INVALID_VALUE); | 
|  | 1513 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1514 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1515 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1516 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1517 | if(context) | 
|  | 1518 | { | 
|  | 1519 | for(int i = 0; i < n; i++) | 
|  | 1520 | { | 
|  | 1521 | context->deleteRenderbuffer(renderbuffers[i]); | 
|  | 1522 | } | 
|  | 1523 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1524 | } | 
|  | 1525 |  | 
|  | 1526 | void GL_APIENTRY glDeleteShader(GLuint shader) | 
|  | 1527 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1528 | TRACE("(GLuint shader = %d)", shader); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1529 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1530 | if(shader == 0) | 
|  | 1531 | { | 
|  | 1532 | return; | 
|  | 1533 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1534 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1535 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1536 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1537 | if(context) | 
|  | 1538 | { | 
|  | 1539 | if(!context->getShader(shader)) | 
|  | 1540 | { | 
|  | 1541 | if(context->getProgram(shader)) | 
|  | 1542 | { | 
|  | 1543 | return error(GL_INVALID_OPERATION); | 
|  | 1544 | } | 
|  | 1545 | else | 
|  | 1546 | { | 
|  | 1547 | return error(GL_INVALID_VALUE); | 
|  | 1548 | } | 
|  | 1549 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1550 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1551 | context->deleteShader(shader); | 
|  | 1552 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1553 | } | 
|  | 1554 |  | 
|  | 1555 | void GL_APIENTRY glDeleteTextures(GLsizei n, const GLuint* textures) | 
|  | 1556 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1557 | TRACE("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1558 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1559 | if(n < 0) | 
|  | 1560 | { | 
|  | 1561 | return error(GL_INVALID_VALUE); | 
|  | 1562 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1563 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1564 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1565 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1566 | if(context) | 
|  | 1567 | { | 
|  | 1568 | for(int i = 0; i < n; i++) | 
|  | 1569 | { | 
|  | 1570 | if(textures[i] != 0) | 
|  | 1571 | { | 
|  | 1572 | context->deleteTexture(textures[i]); | 
|  | 1573 | } | 
|  | 1574 | } | 
|  | 1575 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1576 | } | 
|  | 1577 |  | 
|  | 1578 | void GL_APIENTRY glDepthFunc(GLenum func) | 
|  | 1579 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1580 | TRACE("(GLenum func = 0x%X)", func); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1581 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1582 | switch(func) | 
|  | 1583 | { | 
|  | 1584 | case GL_NEVER: | 
|  | 1585 | case GL_ALWAYS: | 
|  | 1586 | case GL_LESS: | 
|  | 1587 | case GL_LEQUAL: | 
|  | 1588 | case GL_EQUAL: | 
|  | 1589 | case GL_GREATER: | 
|  | 1590 | case GL_GEQUAL: | 
|  | 1591 | case GL_NOTEQUAL: | 
|  | 1592 | break; | 
|  | 1593 | default: | 
|  | 1594 | return error(GL_INVALID_ENUM); | 
|  | 1595 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1596 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1597 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1598 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1599 | if(context) | 
|  | 1600 | { | 
|  | 1601 | context->setDepthFunc(func); | 
|  | 1602 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1603 | } | 
|  | 1604 |  | 
|  | 1605 | void GL_APIENTRY glDepthMask(GLboolean flag) | 
|  | 1606 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1607 | TRACE("(GLboolean flag = %d)", flag); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1608 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1609 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1610 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1611 | if(context) | 
|  | 1612 | { | 
|  | 1613 | context->setDepthMask(flag != GL_FALSE); | 
|  | 1614 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1615 | } | 
|  | 1616 |  | 
|  | 1617 | void GL_APIENTRY glDepthRangef(GLclampf zNear, GLclampf zFar) | 
|  | 1618 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1619 | TRACE("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1620 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1621 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1622 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1623 | if(context) | 
|  | 1624 | { | 
|  | 1625 | context->setDepthRange(zNear, zFar); | 
|  | 1626 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1627 | } | 
|  | 1628 |  | 
|  | 1629 | void GL_APIENTRY glDetachShader(GLuint program, GLuint shader) | 
|  | 1630 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1631 | TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1632 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1633 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1634 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1635 | if(context) | 
|  | 1636 | { | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1637 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1638 | es2::Program *programObject = context->getProgram(program); | 
|  | 1639 | es2::Shader *shaderObject = context->getShader(shader); | 
| Nicolas Capens | 08e90f0 | 2014-11-21 12:49:12 -0500 | [diff] [blame] | 1640 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1641 | if(!programObject) | 
|  | 1642 | { | 
|  | 1643 | es2::Shader *shaderByProgramHandle; | 
|  | 1644 | shaderByProgramHandle = context->getShader(program); | 
|  | 1645 | if(!shaderByProgramHandle) | 
|  | 1646 | { | 
|  | 1647 | return error(GL_INVALID_VALUE); | 
|  | 1648 | } | 
|  | 1649 | else | 
|  | 1650 | { | 
|  | 1651 | return error(GL_INVALID_OPERATION); | 
|  | 1652 | } | 
|  | 1653 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1654 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1655 | if(!shaderObject) | 
|  | 1656 | { | 
|  | 1657 | es2::Program *programByShaderHandle = context->getProgram(shader); | 
|  | 1658 | if(!programByShaderHandle) | 
|  | 1659 | { | 
|  | 1660 | return error(GL_INVALID_VALUE); | 
|  | 1661 | } | 
|  | 1662 | else | 
|  | 1663 | { | 
|  | 1664 | return error(GL_INVALID_OPERATION); | 
|  | 1665 | } | 
|  | 1666 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1667 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1668 | if(!programObject->detachShader(shaderObject)) | 
|  | 1669 | { | 
|  | 1670 | return error(GL_INVALID_OPERATION); | 
|  | 1671 | } | 
|  | 1672 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1673 | } | 
|  | 1674 |  | 
|  | 1675 | void GL_APIENTRY glDisable(GLenum cap) | 
|  | 1676 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1677 | TRACE("(GLenum cap = 0x%X)", cap); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1678 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1679 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1680 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1681 | if(context) | 
|  | 1682 | { | 
|  | 1683 | switch(cap) | 
|  | 1684 | { | 
|  | 1685 | case GL_CULL_FACE:                context->setCullFace(false);              break; | 
|  | 1686 | case GL_POLYGON_OFFSET_FILL:      context->setPolygonOffsetFill(false);     break; | 
|  | 1687 | case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break; | 
|  | 1688 | case GL_SAMPLE_COVERAGE:          context->setSampleCoverage(false);        break; | 
|  | 1689 | case GL_SCISSOR_TEST:             context->setScissorTest(false);           break; | 
|  | 1690 | case GL_STENCIL_TEST:             context->setStencilTest(false);           break; | 
|  | 1691 | case GL_DEPTH_TEST:               context->setDepthTest(false);             break; | 
|  | 1692 | case GL_BLEND:                    context->setBlend(false);                 break; | 
|  | 1693 | case GL_DITHER:                   context->setDither(false);                break; | 
| Alexis Hetu | fceb183 | 2015-03-10 16:42:04 -0400 | [diff] [blame] | 1694 | case GL_PRIMITIVE_RESTART_FIXED_INDEX: context->setPrimitiveRestartFixedIndex(false); break; | 
|  | 1695 | case GL_RASTERIZER_DISCARD:       context->setRasterizerDiscard(false); break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1696 | default: | 
|  | 1697 | return error(GL_INVALID_ENUM); | 
|  | 1698 | } | 
|  | 1699 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1700 | } | 
|  | 1701 |  | 
|  | 1702 | void GL_APIENTRY glDisableVertexAttribArray(GLuint index) | 
|  | 1703 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1704 | TRACE("(GLuint index = %d)", index); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1705 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1706 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 1707 | { | 
|  | 1708 | return error(GL_INVALID_VALUE); | 
|  | 1709 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1710 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1711 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1712 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1713 | if(context) | 
|  | 1714 | { | 
|  | 1715 | context->setEnableVertexAttribArray(index, false); | 
|  | 1716 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1717 | } | 
|  | 1718 |  | 
|  | 1719 | void GL_APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count) | 
|  | 1720 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1721 | TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1722 |  | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 1723 | switch(mode) | 
|  | 1724 | { | 
|  | 1725 | case GL_POINTS: | 
|  | 1726 | case GL_LINES: | 
|  | 1727 | case GL_LINE_LOOP: | 
|  | 1728 | case GL_LINE_STRIP: | 
|  | 1729 | case GL_TRIANGLES: | 
|  | 1730 | case GL_TRIANGLE_FAN: | 
|  | 1731 | case GL_TRIANGLE_STRIP: | 
|  | 1732 | break; | 
|  | 1733 | default: | 
|  | 1734 | return error(GL_INVALID_ENUM); | 
|  | 1735 | } | 
|  | 1736 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1737 | if(count < 0 || first < 0) | 
|  | 1738 | { | 
|  | 1739 | return error(GL_INVALID_VALUE); | 
|  | 1740 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1741 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1742 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1743 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1744 | if(context) | 
|  | 1745 | { | 
|  | 1746 | context->drawArrays(mode, first, count); | 
|  | 1747 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1748 | } | 
|  | 1749 |  | 
|  | 1750 | void GL_APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) | 
|  | 1751 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1752 | TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)", | 
|  | 1753 | mode, count, type, indices); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1754 |  | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 1755 | switch(mode) | 
|  | 1756 | { | 
|  | 1757 | case GL_POINTS: | 
|  | 1758 | case GL_LINES: | 
|  | 1759 | case GL_LINE_LOOP: | 
|  | 1760 | case GL_LINE_STRIP: | 
|  | 1761 | case GL_TRIANGLES: | 
|  | 1762 | case GL_TRIANGLE_FAN: | 
|  | 1763 | case GL_TRIANGLE_STRIP: | 
|  | 1764 | break; | 
|  | 1765 | default: | 
|  | 1766 | return error(GL_INVALID_ENUM); | 
|  | 1767 | } | 
|  | 1768 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1769 | if(count < 0) | 
|  | 1770 | { | 
|  | 1771 | return error(GL_INVALID_VALUE); | 
|  | 1772 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1773 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1774 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1775 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1776 | if(context) | 
|  | 1777 | { | 
|  | 1778 | switch(type) | 
|  | 1779 | { | 
|  | 1780 | case GL_UNSIGNED_BYTE: | 
|  | 1781 | case GL_UNSIGNED_SHORT: | 
|  | 1782 | case GL_UNSIGNED_INT: | 
|  | 1783 | break; | 
|  | 1784 | default: | 
|  | 1785 | return error(GL_INVALID_ENUM); | 
|  | 1786 | } | 
| Nicolas Capens | 08e90f0 | 2014-11-21 12:49:12 -0500 | [diff] [blame] | 1787 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1788 | context->drawElements(mode, count, type, indices); | 
|  | 1789 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1790 | } | 
|  | 1791 |  | 
|  | 1792 | void GL_APIENTRY glEnable(GLenum cap) | 
|  | 1793 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1794 | TRACE("(GLenum cap = 0x%X)", cap); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1795 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1796 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1797 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1798 | if(context) | 
|  | 1799 | { | 
|  | 1800 | switch(cap) | 
|  | 1801 | { | 
|  | 1802 | case GL_CULL_FACE:                context->setCullFace(true);              break; | 
|  | 1803 | case GL_POLYGON_OFFSET_FILL:      context->setPolygonOffsetFill(true);     break; | 
|  | 1804 | case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break; | 
|  | 1805 | case GL_SAMPLE_COVERAGE:          context->setSampleCoverage(true);        break; | 
|  | 1806 | case GL_SCISSOR_TEST:             context->setScissorTest(true);           break; | 
|  | 1807 | case GL_STENCIL_TEST:             context->setStencilTest(true);           break; | 
|  | 1808 | case GL_DEPTH_TEST:               context->setDepthTest(true);             break; | 
|  | 1809 | case GL_BLEND:                    context->setBlend(true);                 break; | 
|  | 1810 | case GL_DITHER:                   context->setDither(true);                break; | 
| Alexis Hetu | fceb183 | 2015-03-10 16:42:04 -0400 | [diff] [blame] | 1811 | case GL_PRIMITIVE_RESTART_FIXED_INDEX: context->setPrimitiveRestartFixedIndex(true); break; | 
|  | 1812 | case GL_RASTERIZER_DISCARD:       context->setRasterizerDiscard(true); break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1813 | default: | 
|  | 1814 | return error(GL_INVALID_ENUM); | 
|  | 1815 | } | 
|  | 1816 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1817 | } | 
|  | 1818 |  | 
|  | 1819 | void GL_APIENTRY glEnableVertexAttribArray(GLuint index) | 
|  | 1820 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1821 | TRACE("(GLuint index = %d)", index); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1822 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1823 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 1824 | { | 
|  | 1825 | return error(GL_INVALID_VALUE); | 
|  | 1826 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1827 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1828 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1829 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1830 | if(context) | 
|  | 1831 | { | 
|  | 1832 | context->setEnableVertexAttribArray(index, true); | 
|  | 1833 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1834 | } | 
|  | 1835 |  | 
|  | 1836 | void GL_APIENTRY glEndQueryEXT(GLenum target) | 
|  | 1837 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1838 | TRACE("GLenum target = 0x%X)", target); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1839 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1840 | switch(target) | 
|  | 1841 | { | 
|  | 1842 | case GL_ANY_SAMPLES_PASSED_EXT: | 
|  | 1843 | case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: | 
|  | 1844 | break; | 
|  | 1845 | default: | 
|  | 1846 | return error(GL_INVALID_ENUM); | 
|  | 1847 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1848 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1849 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1850 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1851 | if(context) | 
|  | 1852 | { | 
|  | 1853 | context->endQuery(target); | 
|  | 1854 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1855 | } | 
|  | 1856 |  | 
|  | 1857 | void GL_APIENTRY glFinishFenceNV(GLuint fence) | 
|  | 1858 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1859 | TRACE("(GLuint fence = %d)", fence); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1860 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1861 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1862 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1863 | if(context) | 
|  | 1864 | { | 
|  | 1865 | es2::Fence* fenceObject = context->getFence(fence); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1866 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1867 | if(fenceObject == NULL) | 
|  | 1868 | { | 
|  | 1869 | return error(GL_INVALID_OPERATION); | 
|  | 1870 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1871 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1872 | fenceObject->finishFence(); | 
|  | 1873 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1874 | } | 
|  | 1875 |  | 
|  | 1876 | void GL_APIENTRY glFinish(void) | 
|  | 1877 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1878 | TRACE("()"); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1879 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1880 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1881 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1882 | if(context) | 
|  | 1883 | { | 
|  | 1884 | context->finish(); | 
|  | 1885 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1886 | } | 
|  | 1887 |  | 
|  | 1888 | void GL_APIENTRY glFlush(void) | 
|  | 1889 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1890 | TRACE("()"); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1891 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1892 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1893 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1894 | if(context) | 
|  | 1895 | { | 
|  | 1896 | context->flush(); | 
|  | 1897 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1898 | } | 
|  | 1899 |  | 
|  | 1900 | void GL_APIENTRY glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) | 
|  | 1901 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1902 | TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, " | 
|  | 1903 | "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1904 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1905 | if((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE) || | 
|  | 1906 | (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0)) | 
|  | 1907 | { | 
|  | 1908 | return error(GL_INVALID_ENUM); | 
|  | 1909 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1910 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1911 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1912 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1913 | if(context) | 
|  | 1914 | { | 
|  | 1915 | es2::Framebuffer *framebuffer = NULL; | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 1916 | GLuint framebufferName = 0; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1917 | if(target == GL_READ_FRAMEBUFFER_ANGLE) | 
|  | 1918 | { | 
|  | 1919 | framebuffer = context->getReadFramebuffer(); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 1920 | framebufferName = context->getReadFramebufferName(); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1921 | } | 
|  | 1922 | else | 
|  | 1923 | { | 
|  | 1924 | framebuffer = context->getDrawFramebuffer(); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 1925 | framebufferName = context->getDrawFramebufferName(); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1926 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1927 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 1928 | if(!framebuffer || (framebufferName == 0 && renderbuffer != 0)) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1929 | { | 
|  | 1930 | return error(GL_INVALID_OPERATION); | 
|  | 1931 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1932 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1933 | switch(attachment) | 
|  | 1934 | { | 
|  | 1935 | case GL_COLOR_ATTACHMENT0: | 
|  | 1936 | framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer); | 
|  | 1937 | break; | 
|  | 1938 | case GL_DEPTH_ATTACHMENT: | 
|  | 1939 | framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer); | 
|  | 1940 | break; | 
|  | 1941 | case GL_STENCIL_ATTACHMENT: | 
|  | 1942 | framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer); | 
|  | 1943 | break; | 
|  | 1944 | default: | 
|  | 1945 | return error(GL_INVALID_ENUM); | 
|  | 1946 | } | 
|  | 1947 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1948 | } | 
|  | 1949 |  | 
|  | 1950 | void GL_APIENTRY glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) | 
|  | 1951 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1952 | TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, " | 
|  | 1953 | "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1954 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1955 | if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE) | 
|  | 1956 | { | 
|  | 1957 | return error(GL_INVALID_ENUM); | 
|  | 1958 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1959 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1960 | switch(attachment) | 
|  | 1961 | { | 
|  | 1962 | case GL_COLOR_ATTACHMENT0: | 
|  | 1963 | case GL_DEPTH_ATTACHMENT: | 
|  | 1964 | case GL_STENCIL_ATTACHMENT: | 
|  | 1965 | break; | 
|  | 1966 | default: | 
|  | 1967 | return error(GL_INVALID_ENUM); | 
|  | 1968 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1969 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1970 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1971 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1972 | if(context) | 
|  | 1973 | { | 
|  | 1974 | if(texture == 0) | 
|  | 1975 | { | 
|  | 1976 | textarget = GL_NONE; | 
|  | 1977 | } | 
|  | 1978 | else | 
|  | 1979 | { | 
|  | 1980 | es2::Texture *tex = context->getTexture(texture); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1981 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1982 | if(tex == NULL) | 
|  | 1983 | { | 
|  | 1984 | return error(GL_INVALID_OPERATION); | 
|  | 1985 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1986 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1987 | if(tex->isCompressed(textarget, level)) | 
|  | 1988 | { | 
|  | 1989 | return error(GL_INVALID_OPERATION); | 
|  | 1990 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 1991 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 1992 | switch(textarget) | 
|  | 1993 | { | 
|  | 1994 | case GL_TEXTURE_2D: | 
|  | 1995 | if(tex->getTarget() != GL_TEXTURE_2D) | 
|  | 1996 | { | 
|  | 1997 | return error(GL_INVALID_OPERATION); | 
|  | 1998 | } | 
|  | 1999 | break; | 
|  | 2000 | case GL_TEXTURE_CUBE_MAP_POSITIVE_X: | 
|  | 2001 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: | 
|  | 2002 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: | 
|  | 2003 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: | 
|  | 2004 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: | 
|  | 2005 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: | 
|  | 2006 | if(tex->getTarget() != GL_TEXTURE_CUBE_MAP) | 
|  | 2007 | { | 
|  | 2008 | return error(GL_INVALID_OPERATION); | 
|  | 2009 | } | 
|  | 2010 | break; | 
|  | 2011 | default: | 
|  | 2012 | return error(GL_INVALID_ENUM); | 
|  | 2013 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2014 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2015 | if(level != 0) | 
|  | 2016 | { | 
|  | 2017 | return error(GL_INVALID_VALUE); | 
|  | 2018 | } | 
|  | 2019 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2020 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2021 | es2::Framebuffer *framebuffer = NULL; | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2022 | GLuint framebufferName = 0; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2023 | if(target == GL_READ_FRAMEBUFFER_ANGLE) | 
|  | 2024 | { | 
|  | 2025 | framebuffer = context->getReadFramebuffer(); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2026 | framebufferName = context->getReadFramebufferName(); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2027 | } | 
|  | 2028 | else | 
|  | 2029 | { | 
|  | 2030 | framebuffer = context->getDrawFramebuffer(); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2031 | framebufferName = context->getDrawFramebufferName(); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2032 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2033 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2034 | if(framebufferName == 0 || !framebuffer) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2035 | { | 
|  | 2036 | return error(GL_INVALID_OPERATION); | 
|  | 2037 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2038 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2039 | switch(attachment) | 
|  | 2040 | { | 
|  | 2041 | case GL_COLOR_ATTACHMENT0:  framebuffer->setColorbuffer(textarget, texture);   break; | 
|  | 2042 | case GL_DEPTH_ATTACHMENT:   framebuffer->setDepthbuffer(textarget, texture);   break; | 
|  | 2043 | case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break; | 
|  | 2044 | } | 
|  | 2045 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2046 | } | 
|  | 2047 |  | 
|  | 2048 | void GL_APIENTRY glFrontFace(GLenum mode) | 
|  | 2049 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2050 | TRACE("(GLenum mode = 0x%X)", mode); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2051 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2052 | switch(mode) | 
|  | 2053 | { | 
|  | 2054 | case GL_CW: | 
|  | 2055 | case GL_CCW: | 
|  | 2056 | { | 
|  | 2057 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2058 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2059 | if(context) | 
|  | 2060 | { | 
|  | 2061 | context->setFrontFace(mode); | 
|  | 2062 | } | 
|  | 2063 | } | 
|  | 2064 | break; | 
|  | 2065 | default: | 
|  | 2066 | return error(GL_INVALID_ENUM); | 
|  | 2067 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2068 | } | 
|  | 2069 |  | 
|  | 2070 | void GL_APIENTRY glGenBuffers(GLsizei n, GLuint* buffers) | 
|  | 2071 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2072 | TRACE("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2073 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2074 | if(n < 0) | 
|  | 2075 | { | 
|  | 2076 | return error(GL_INVALID_VALUE); | 
|  | 2077 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2078 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2079 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2080 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2081 | if(context) | 
|  | 2082 | { | 
|  | 2083 | for(int i = 0; i < n; i++) | 
|  | 2084 | { | 
|  | 2085 | buffers[i] = context->createBuffer(); | 
|  | 2086 | } | 
|  | 2087 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2088 | } | 
|  | 2089 |  | 
|  | 2090 | void GL_APIENTRY glGenerateMipmap(GLenum target) | 
|  | 2091 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2092 | TRACE("(GLenum target = 0x%X)", target); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2093 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2094 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2095 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2096 | if(context) | 
|  | 2097 | { | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 2098 | es2::Texture *texture = nullptr; | 
|  | 2099 |  | 
|  | 2100 | egl::GLint clientVersion = context->getClientVersion(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2101 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2102 | switch(target) | 
|  | 2103 | { | 
|  | 2104 | case GL_TEXTURE_2D: | 
|  | 2105 | texture = context->getTexture2D(); | 
|  | 2106 | break; | 
|  | 2107 | case GL_TEXTURE_CUBE_MAP: | 
|  | 2108 | texture = context->getTextureCubeMap(); | 
|  | 2109 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 2110 | case GL_TEXTURE_2D_ARRAY: | 
|  | 2111 | if(clientVersion < 3) | 
|  | 2112 | { | 
|  | 2113 | return error(GL_INVALID_ENUM); | 
|  | 2114 | } | 
|  | 2115 | else | 
|  | 2116 | { | 
|  | 2117 | UNIMPLEMENTED(); | 
|  | 2118 | texture = context->getTexture3D(); | 
|  | 2119 | break; | 
|  | 2120 | } | 
|  | 2121 | case GL_TEXTURE_3D_OES: | 
|  | 2122 | texture = context->getTexture3D(); | 
|  | 2123 | break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2124 | default: | 
|  | 2125 | return error(GL_INVALID_ENUM); | 
|  | 2126 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2127 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2128 | if(texture->isCompressed(target, 0) || texture->isDepth(target, 0)) | 
|  | 2129 | { | 
|  | 2130 | return error(GL_INVALID_OPERATION); | 
|  | 2131 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2132 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2133 | texture->generateMipmaps(); | 
|  | 2134 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2135 | } | 
|  | 2136 |  | 
|  | 2137 | void GL_APIENTRY glGenFencesNV(GLsizei n, GLuint* fences) | 
|  | 2138 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2139 | TRACE("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2140 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2141 | if(n < 0) | 
|  | 2142 | { | 
|  | 2143 | return error(GL_INVALID_VALUE); | 
|  | 2144 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2145 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2146 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2147 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2148 | if(context) | 
|  | 2149 | { | 
|  | 2150 | for(int i = 0; i < n; i++) | 
|  | 2151 | { | 
|  | 2152 | fences[i] = context->createFence(); | 
|  | 2153 | } | 
|  | 2154 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2155 | } | 
|  | 2156 |  | 
|  | 2157 | void GL_APIENTRY glGenFramebuffers(GLsizei n, GLuint* framebuffers) | 
|  | 2158 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2159 | TRACE("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2160 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2161 | if(n < 0) | 
|  | 2162 | { | 
|  | 2163 | return error(GL_INVALID_VALUE); | 
|  | 2164 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2165 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2166 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2167 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2168 | if(context) | 
|  | 2169 | { | 
|  | 2170 | for(int i = 0; i < n; i++) | 
|  | 2171 | { | 
|  | 2172 | framebuffers[i] = context->createFramebuffer(); | 
|  | 2173 | } | 
|  | 2174 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2175 | } | 
|  | 2176 |  | 
|  | 2177 | void GL_APIENTRY glGenQueriesEXT(GLsizei n, GLuint* ids) | 
|  | 2178 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2179 | TRACE("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2180 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2181 | if(n < 0) | 
|  | 2182 | { | 
|  | 2183 | return error(GL_INVALID_VALUE); | 
|  | 2184 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2185 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2186 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2187 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2188 | if(context) | 
|  | 2189 | { | 
|  | 2190 | for(int i = 0; i < n; i++) | 
|  | 2191 | { | 
|  | 2192 | ids[i] = context->createQuery(); | 
|  | 2193 | } | 
|  | 2194 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2195 | } | 
|  | 2196 |  | 
|  | 2197 | void GL_APIENTRY glGenRenderbuffers(GLsizei n, GLuint* renderbuffers) | 
|  | 2198 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2199 | TRACE("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2200 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2201 | if(n < 0) | 
|  | 2202 | { | 
|  | 2203 | return error(GL_INVALID_VALUE); | 
|  | 2204 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2205 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2206 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2207 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2208 | if(context) | 
|  | 2209 | { | 
|  | 2210 | for(int i = 0; i < n; i++) | 
|  | 2211 | { | 
|  | 2212 | renderbuffers[i] = context->createRenderbuffer(); | 
|  | 2213 | } | 
|  | 2214 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2215 | } | 
|  | 2216 |  | 
|  | 2217 | void GL_APIENTRY glGenTextures(GLsizei n, GLuint* textures) | 
|  | 2218 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2219 | TRACE("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2220 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2221 | if(n < 0) | 
|  | 2222 | { | 
|  | 2223 | return error(GL_INVALID_VALUE); | 
|  | 2224 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2225 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2226 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2227 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2228 | if(context) | 
|  | 2229 | { | 
|  | 2230 | for(int i = 0; i < n; i++) | 
|  | 2231 | { | 
|  | 2232 | textures[i] = context->createTexture(); | 
|  | 2233 | } | 
|  | 2234 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2235 | } | 
|  | 2236 |  | 
|  | 2237 | void GL_APIENTRY glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) | 
|  | 2238 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2239 | TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, " | 
|  | 2240 | "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)", | 
|  | 2241 | program, index, bufsize, length, size, type, name); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2242 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2243 | if(bufsize < 0) | 
|  | 2244 | { | 
|  | 2245 | return error(GL_INVALID_VALUE); | 
|  | 2246 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2247 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2248 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2249 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2250 | if(context) | 
|  | 2251 | { | 
|  | 2252 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2253 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2254 | if(!programObject) | 
|  | 2255 | { | 
|  | 2256 | if(context->getShader(program)) | 
|  | 2257 | { | 
|  | 2258 | return error(GL_INVALID_OPERATION); | 
|  | 2259 | } | 
|  | 2260 | else | 
|  | 2261 | { | 
|  | 2262 | return error(GL_INVALID_VALUE); | 
|  | 2263 | } | 
|  | 2264 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2265 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2266 | if(index >= (GLuint)programObject->getActiveAttributeCount()) | 
|  | 2267 | { | 
|  | 2268 | return error(GL_INVALID_VALUE); | 
|  | 2269 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2270 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2271 | programObject->getActiveAttribute(index, bufsize, length, size, type, name); | 
|  | 2272 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2273 | } | 
|  | 2274 |  | 
|  | 2275 | void GL_APIENTRY glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name) | 
|  | 2276 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2277 | TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, " | 
|  | 2278 | "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = %s)", | 
|  | 2279 | program, index, bufsize, length, size, type, name); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2280 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2281 | if(bufsize < 0) | 
|  | 2282 | { | 
|  | 2283 | return error(GL_INVALID_VALUE); | 
|  | 2284 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2285 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2286 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2287 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2288 | if(context) | 
|  | 2289 | { | 
|  | 2290 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2291 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2292 | if(!programObject) | 
|  | 2293 | { | 
|  | 2294 | if(context->getShader(program)) | 
|  | 2295 | { | 
|  | 2296 | return error(GL_INVALID_OPERATION); | 
|  | 2297 | } | 
|  | 2298 | else | 
|  | 2299 | { | 
|  | 2300 | return error(GL_INVALID_VALUE); | 
|  | 2301 | } | 
|  | 2302 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2303 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2304 | if(index >= (GLuint)programObject->getActiveUniformCount()) | 
|  | 2305 | { | 
|  | 2306 | return error(GL_INVALID_VALUE); | 
|  | 2307 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2308 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2309 | programObject->getActiveUniform(index, bufsize, length, size, type, name); | 
|  | 2310 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2311 | } | 
|  | 2312 |  | 
|  | 2313 | void GL_APIENTRY glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) | 
|  | 2314 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2315 | TRACE("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)", | 
|  | 2316 | program, maxcount, count, shaders); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2317 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2318 | if(maxcount < 0) | 
|  | 2319 | { | 
|  | 2320 | return error(GL_INVALID_VALUE); | 
|  | 2321 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2322 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2323 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2324 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2325 | if(context) | 
|  | 2326 | { | 
|  | 2327 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2328 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2329 | if(!programObject) | 
|  | 2330 | { | 
|  | 2331 | if(context->getShader(program)) | 
|  | 2332 | { | 
|  | 2333 | return error(GL_INVALID_OPERATION); | 
|  | 2334 | } | 
|  | 2335 | else | 
|  | 2336 | { | 
|  | 2337 | return error(GL_INVALID_VALUE); | 
|  | 2338 | } | 
|  | 2339 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2340 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2341 | return programObject->getAttachedShaders(maxcount, count, shaders); | 
|  | 2342 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2343 | } | 
|  | 2344 |  | 
|  | 2345 | int GL_APIENTRY glGetAttribLocation(GLuint program, const GLchar* name) | 
|  | 2346 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2347 | TRACE("(GLuint program = %d, const GLchar* name = %s)", program, name); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2348 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2349 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2350 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2351 | if(context) | 
|  | 2352 | { | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2353 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2354 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2355 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2356 | if(!programObject) | 
|  | 2357 | { | 
|  | 2358 | if(context->getShader(program)) | 
|  | 2359 | { | 
|  | 2360 | return error(GL_INVALID_OPERATION, -1); | 
|  | 2361 | } | 
|  | 2362 | else | 
|  | 2363 | { | 
|  | 2364 | return error(GL_INVALID_VALUE, -1); | 
|  | 2365 | } | 
|  | 2366 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2367 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2368 | if(!programObject->isLinked()) | 
|  | 2369 | { | 
|  | 2370 | return error(GL_INVALID_OPERATION, -1); | 
|  | 2371 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2372 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2373 | return programObject->getAttributeLocation(name); | 
|  | 2374 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2375 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2376 | return -1; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2377 | } | 
|  | 2378 |  | 
|  | 2379 | void GL_APIENTRY glGetBooleanv(GLenum pname, GLboolean* params) | 
|  | 2380 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2381 | TRACE("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)",  pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2382 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2383 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2384 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2385 | if(context) | 
|  | 2386 | { | 
|  | 2387 | if(!(context->getBooleanv(pname, params))) | 
|  | 2388 | { | 
|  | 2389 | GLenum nativeType; | 
|  | 2390 | unsigned int numParams = 0; | 
|  | 2391 | if(!context->getQueryParameterInfo(pname, &nativeType, &numParams)) | 
|  | 2392 | return error(GL_INVALID_ENUM); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2393 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2394 | if(numParams == 0) | 
|  | 2395 | return; // it is known that the pname is valid, but there are no parameters to return | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2396 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2397 | if(nativeType == GL_FLOAT) | 
|  | 2398 | { | 
|  | 2399 | GLfloat *floatParams = NULL; | 
|  | 2400 | floatParams = new GLfloat[numParams]; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2401 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2402 | context->getFloatv(pname, floatParams); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2403 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2404 | for(unsigned int i = 0; i < numParams; ++i) | 
|  | 2405 | { | 
|  | 2406 | if(floatParams[i] == 0.0f) | 
|  | 2407 | params[i] = GL_FALSE; | 
|  | 2408 | else | 
|  | 2409 | params[i] = GL_TRUE; | 
|  | 2410 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2411 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2412 | delete [] floatParams; | 
|  | 2413 | } | 
|  | 2414 | else if(nativeType == GL_INT) | 
|  | 2415 | { | 
|  | 2416 | GLint *intParams = NULL; | 
|  | 2417 | intParams = new GLint[numParams]; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2418 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2419 | context->getIntegerv(pname, intParams); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2420 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2421 | for(unsigned int i = 0; i < numParams; ++i) | 
|  | 2422 | { | 
|  | 2423 | if(intParams[i] == 0) | 
|  | 2424 | params[i] = GL_FALSE; | 
|  | 2425 | else | 
|  | 2426 | params[i] = GL_TRUE; | 
|  | 2427 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2428 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2429 | delete [] intParams; | 
|  | 2430 | } | 
|  | 2431 | } | 
|  | 2432 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2433 | } | 
|  | 2434 |  | 
|  | 2435 | void GL_APIENTRY glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params) | 
|  | 2436 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2437 | TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2438 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2439 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2440 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2441 | if(context) | 
|  | 2442 | { | 
|  | 2443 | es2::Buffer *buffer; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2444 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2445 | switch(target) | 
|  | 2446 | { | 
|  | 2447 | case GL_ARRAY_BUFFER: | 
|  | 2448 | buffer = context->getArrayBuffer(); | 
|  | 2449 | break; | 
|  | 2450 | case GL_ELEMENT_ARRAY_BUFFER: | 
|  | 2451 | buffer = context->getElementArrayBuffer(); | 
|  | 2452 | break; | 
|  | 2453 | default: | 
|  | 2454 | return error(GL_INVALID_ENUM); | 
|  | 2455 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2456 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2457 | if(!buffer) | 
|  | 2458 | { | 
|  | 2459 | // A null buffer means that "0" is bound to the requested buffer target | 
|  | 2460 | return error(GL_INVALID_OPERATION); | 
|  | 2461 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2462 |  | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 2463 | egl::GLint clientVersion = context->getClientVersion(); | 
|  | 2464 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2465 | switch(pname) | 
|  | 2466 | { | 
|  | 2467 | case GL_BUFFER_USAGE: | 
|  | 2468 | *params = buffer->usage(); | 
|  | 2469 | break; | 
|  | 2470 | case GL_BUFFER_SIZE: | 
|  | 2471 | *params = buffer->size(); | 
|  | 2472 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 2473 | case GL_BUFFER_ACCESS_FLAGS: | 
|  | 2474 | if(clientVersion >= 3) | 
|  | 2475 | { | 
|  | 2476 | *params = buffer->access(); | 
|  | 2477 | break; | 
|  | 2478 | } | 
|  | 2479 | else return error(GL_INVALID_ENUM); | 
|  | 2480 | case GL_BUFFER_MAPPED: | 
|  | 2481 | if(clientVersion >= 3) | 
|  | 2482 | { | 
|  | 2483 | *params = buffer->isMapped(); | 
|  | 2484 | break; | 
|  | 2485 | } | 
|  | 2486 | else return error(GL_INVALID_ENUM); | 
|  | 2487 | case GL_BUFFER_MAP_LENGTH: | 
|  | 2488 | if(clientVersion >= 3) | 
|  | 2489 | { | 
|  | 2490 | *params = buffer->length(); | 
|  | 2491 | break; | 
|  | 2492 | } | 
|  | 2493 | else return error(GL_INVALID_ENUM); | 
|  | 2494 | case GL_BUFFER_MAP_OFFSET: | 
|  | 2495 | if(clientVersion >= 3) | 
|  | 2496 | { | 
|  | 2497 | *params = buffer->offset(); | 
|  | 2498 | break; | 
|  | 2499 | } | 
|  | 2500 | else return error(GL_INVALID_ENUM); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2501 | default: | 
|  | 2502 | return error(GL_INVALID_ENUM); | 
|  | 2503 | } | 
|  | 2504 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2505 | } | 
|  | 2506 |  | 
|  | 2507 | GLenum GL_APIENTRY glGetError(void) | 
|  | 2508 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2509 | TRACE("()"); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2510 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2511 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2512 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2513 | if(context) | 
|  | 2514 | { | 
|  | 2515 | return context->getError(); | 
|  | 2516 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2517 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2518 | return GL_NO_ERROR; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2519 | } | 
|  | 2520 |  | 
|  | 2521 | void GL_APIENTRY glGetFenceivNV(GLuint fence, GLenum pname, GLint *params) | 
|  | 2522 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2523 | TRACE("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2524 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2525 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2526 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2527 | if(context) | 
|  | 2528 | { | 
|  | 2529 | es2::Fence *fenceObject = context->getFence(fence); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2530 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2531 | if(fenceObject == NULL) | 
|  | 2532 | { | 
|  | 2533 | return error(GL_INVALID_OPERATION); | 
|  | 2534 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2535 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2536 | fenceObject->getFenceiv(pname, params); | 
|  | 2537 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2538 | } | 
|  | 2539 |  | 
|  | 2540 | void GL_APIENTRY glGetFloatv(GLenum pname, GLfloat* params) | 
|  | 2541 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2542 | TRACE("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2543 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2544 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2545 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2546 | if(context) | 
|  | 2547 | { | 
|  | 2548 | if(!(context->getFloatv(pname, params))) | 
|  | 2549 | { | 
|  | 2550 | GLenum nativeType; | 
|  | 2551 | unsigned int numParams = 0; | 
|  | 2552 | if(!context->getQueryParameterInfo(pname, &nativeType, &numParams)) | 
|  | 2553 | return error(GL_INVALID_ENUM); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2554 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2555 | if(numParams == 0) | 
|  | 2556 | return; // it is known that the pname is valid, but that there are no parameters to return. | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2557 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2558 | if(nativeType == GL_BOOL) | 
|  | 2559 | { | 
|  | 2560 | GLboolean *boolParams = NULL; | 
|  | 2561 | boolParams = new GLboolean[numParams]; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2562 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2563 | context->getBooleanv(pname, boolParams); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2564 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2565 | for(unsigned int i = 0; i < numParams; ++i) | 
|  | 2566 | { | 
|  | 2567 | if(boolParams[i] == GL_FALSE) | 
|  | 2568 | params[i] = 0.0f; | 
|  | 2569 | else | 
|  | 2570 | params[i] = 1.0f; | 
|  | 2571 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2572 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2573 | delete [] boolParams; | 
|  | 2574 | } | 
|  | 2575 | else if(nativeType == GL_INT) | 
|  | 2576 | { | 
|  | 2577 | GLint *intParams = NULL; | 
|  | 2578 | intParams = new GLint[numParams]; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2579 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2580 | context->getIntegerv(pname, intParams); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2581 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2582 | for(unsigned int i = 0; i < numParams; ++i) | 
|  | 2583 | { | 
|  | 2584 | params[i] = (GLfloat)intParams[i]; | 
|  | 2585 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2586 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2587 | delete [] intParams; | 
|  | 2588 | } | 
|  | 2589 | } | 
|  | 2590 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2591 | } | 
|  | 2592 |  | 
|  | 2593 | void GL_APIENTRY glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params) | 
|  | 2594 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2595 | TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", | 
|  | 2596 | target, attachment, pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2597 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2598 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2599 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2600 | if(context) | 
|  | 2601 | { | 
|  | 2602 | if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE) | 
|  | 2603 | { | 
|  | 2604 | return error(GL_INVALID_ENUM); | 
|  | 2605 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2606 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2607 | es2::Framebuffer *framebuffer = NULL; | 
|  | 2608 | if(target == GL_READ_FRAMEBUFFER_ANGLE) | 
|  | 2609 | { | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2610 | if(context->getReadFramebufferName() == 0) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2611 | { | 
|  | 2612 | return error(GL_INVALID_OPERATION); | 
|  | 2613 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2614 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2615 | framebuffer = context->getReadFramebuffer(); | 
|  | 2616 | } | 
|  | 2617 | else | 
|  | 2618 | { | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2619 | if(context->getDrawFramebufferName() == 0) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2620 | { | 
|  | 2621 | return error(GL_INVALID_OPERATION); | 
|  | 2622 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2623 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2624 | framebuffer = context->getDrawFramebuffer(); | 
|  | 2625 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2626 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2627 | GLenum attachmentType; | 
|  | 2628 | GLuint attachmentHandle; | 
|  | 2629 | switch(attachment) | 
|  | 2630 | { | 
|  | 2631 | case GL_COLOR_ATTACHMENT0: | 
|  | 2632 | attachmentType = framebuffer->getColorbufferType(); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2633 | attachmentHandle = framebuffer->getColorbufferName(); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2634 | break; | 
|  | 2635 | case GL_DEPTH_ATTACHMENT: | 
|  | 2636 | attachmentType = framebuffer->getDepthbufferType(); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2637 | attachmentHandle = framebuffer->getDepthbufferName(); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2638 | break; | 
|  | 2639 | case GL_STENCIL_ATTACHMENT: | 
|  | 2640 | attachmentType = framebuffer->getStencilbufferType(); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2641 | attachmentHandle = framebuffer->getStencilbufferName(); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2642 | break; | 
|  | 2643 | default: | 
|  | 2644 | return error(GL_INVALID_ENUM); | 
|  | 2645 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2646 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2647 | GLenum attachmentObjectType;   // Type category | 
|  | 2648 | if(attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER) | 
|  | 2649 | { | 
|  | 2650 | attachmentObjectType = attachmentType; | 
|  | 2651 | } | 
|  | 2652 | else if(es2::IsTextureTarget(attachmentType)) | 
|  | 2653 | { | 
|  | 2654 | attachmentObjectType = GL_TEXTURE; | 
|  | 2655 | } | 
|  | 2656 | else UNREACHABLE(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2657 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2658 | switch(pname) | 
|  | 2659 | { | 
|  | 2660 | case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: | 
|  | 2661 | *params = attachmentObjectType; | 
|  | 2662 | break; | 
|  | 2663 | case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: | 
|  | 2664 | if(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE) | 
|  | 2665 | { | 
|  | 2666 | *params = attachmentHandle; | 
|  | 2667 | } | 
|  | 2668 | else | 
|  | 2669 | { | 
|  | 2670 | return error(GL_INVALID_ENUM); | 
|  | 2671 | } | 
|  | 2672 | break; | 
|  | 2673 | case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: | 
|  | 2674 | if(attachmentObjectType == GL_TEXTURE) | 
|  | 2675 | { | 
|  | 2676 | *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0 | 
|  | 2677 | } | 
|  | 2678 | else | 
|  | 2679 | { | 
|  | 2680 | return error(GL_INVALID_ENUM); | 
|  | 2681 | } | 
|  | 2682 | break; | 
|  | 2683 | case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: | 
|  | 2684 | if(attachmentObjectType == GL_TEXTURE) | 
|  | 2685 | { | 
|  | 2686 | if(es2::IsCubemapTextureTarget(attachmentType)) | 
|  | 2687 | { | 
|  | 2688 | *params = attachmentType; | 
|  | 2689 | } | 
|  | 2690 | else | 
|  | 2691 | { | 
|  | 2692 | *params = 0; | 
|  | 2693 | } | 
|  | 2694 | } | 
|  | 2695 | else | 
|  | 2696 | { | 
|  | 2697 | return error(GL_INVALID_ENUM); | 
|  | 2698 | } | 
|  | 2699 | break; | 
|  | 2700 | default: | 
|  | 2701 | return error(GL_INVALID_ENUM); | 
|  | 2702 | } | 
|  | 2703 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2704 | } | 
|  | 2705 |  | 
|  | 2706 | GLenum GL_APIENTRY glGetGraphicsResetStatusEXT(void) | 
|  | 2707 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2708 | TRACE("()"); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2709 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2710 | return GL_NO_ERROR; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2711 | } | 
|  | 2712 |  | 
|  | 2713 | void GL_APIENTRY glGetIntegerv(GLenum pname, GLint* params) | 
|  | 2714 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2715 | TRACE("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2716 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2717 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2718 |  | 
| Nicolas Capens | 7ae353d | 2015-03-13 17:59:58 -0400 | [diff] [blame] | 2719 | if(!context) | 
|  | 2720 | { | 
|  | 2721 | ERR("glGetIntegerv() called without current context.");   // Not strictly an error, but probably unintended or attempting to rely on non-compliant behavior | 
|  | 2722 |  | 
|  | 2723 | // This is not spec compliant! When there is no current GL context, functions should | 
|  | 2724 | // have no side effects. Google Maps queries these values before creating a context, | 
|  | 2725 | // so we need this as a bug-compatible workaround. | 
|  | 2726 | switch(pname) | 
|  | 2727 | { | 
|  | 2728 | case GL_MAX_TEXTURE_SIZE:                 *params = es2::IMPLEMENTATION_MAX_TEXTURE_SIZE;  return; | 
|  | 2729 | case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:   *params = es2::MAX_VERTEX_TEXTURE_IMAGE_UNITS;   return; | 
|  | 2730 | case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = es2::MAX_COMBINED_TEXTURE_IMAGE_UNITS; return; | 
|  | 2731 | case GL_STENCIL_BITS:                     *params = 8;                                     return; | 
|  | 2732 | case GL_ALIASED_LINE_WIDTH_RANGE: | 
|  | 2733 | params[0] = (GLint)es2::ALIASED_LINE_WIDTH_RANGE_MIN; | 
|  | 2734 | params[1] = (GLint)es2::ALIASED_LINE_WIDTH_RANGE_MAX; | 
|  | 2735 | return; | 
|  | 2736 | } | 
|  | 2737 | } | 
|  | 2738 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2739 | if(context) | 
|  | 2740 | { | 
|  | 2741 | if(!(context->getIntegerv(pname, params))) | 
|  | 2742 | { | 
|  | 2743 | GLenum nativeType; | 
|  | 2744 | unsigned int numParams = 0; | 
|  | 2745 | if(!context->getQueryParameterInfo(pname, &nativeType, &numParams)) | 
|  | 2746 | return error(GL_INVALID_ENUM); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2747 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2748 | if(numParams == 0) | 
|  | 2749 | return; // it is known that pname is valid, but there are no parameters to return | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2750 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2751 | if(nativeType == GL_BOOL) | 
|  | 2752 | { | 
|  | 2753 | GLboolean *boolParams = NULL; | 
|  | 2754 | boolParams = new GLboolean[numParams]; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2755 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2756 | context->getBooleanv(pname, boolParams); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2757 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2758 | for(unsigned int i = 0; i < numParams; ++i) | 
|  | 2759 | { | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 2760 | params[i] = (boolParams[i] == GL_FALSE) ? 0 : 1; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2761 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2762 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2763 | delete [] boolParams; | 
|  | 2764 | } | 
|  | 2765 | else if(nativeType == GL_FLOAT) | 
|  | 2766 | { | 
|  | 2767 | GLfloat *floatParams = NULL; | 
|  | 2768 | floatParams = new GLfloat[numParams]; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2769 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2770 | context->getFloatv(pname, floatParams); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2771 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2772 | for(unsigned int i = 0; i < numParams; ++i) | 
|  | 2773 | { | 
|  | 2774 | if(pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR) | 
|  | 2775 | { | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 2776 | params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) * 0.5f); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2777 | } | 
|  | 2778 | else | 
|  | 2779 | { | 
|  | 2780 | params[i] = (GLint)(floatParams[i] > 0.0f ? floor(floatParams[i] + 0.5) : ceil(floatParams[i] - 0.5)); | 
|  | 2781 | } | 
|  | 2782 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2783 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2784 | delete [] floatParams; | 
|  | 2785 | } | 
|  | 2786 | } | 
|  | 2787 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2788 | } | 
|  | 2789 |  | 
|  | 2790 | void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint* params) | 
|  | 2791 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2792 | TRACE("(GLuint program = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", program, pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2793 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2794 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2795 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2796 | if(context) | 
|  | 2797 | { | 
|  | 2798 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2799 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2800 | if(!programObject) | 
|  | 2801 | { | 
|  | 2802 | return error(GL_INVALID_VALUE); | 
|  | 2803 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2804 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2805 | switch(pname) | 
|  | 2806 | { | 
|  | 2807 | case GL_DELETE_STATUS: | 
|  | 2808 | *params = programObject->isFlaggedForDeletion(); | 
|  | 2809 | return; | 
|  | 2810 | case GL_LINK_STATUS: | 
|  | 2811 | *params = programObject->isLinked(); | 
|  | 2812 | return; | 
|  | 2813 | case GL_VALIDATE_STATUS: | 
|  | 2814 | *params = programObject->isValidated(); | 
|  | 2815 | return; | 
|  | 2816 | case GL_INFO_LOG_LENGTH: | 
|  | 2817 | *params = programObject->getInfoLogLength(); | 
|  | 2818 | return; | 
|  | 2819 | case GL_ATTACHED_SHADERS: | 
|  | 2820 | *params = programObject->getAttachedShadersCount(); | 
|  | 2821 | return; | 
|  | 2822 | case GL_ACTIVE_ATTRIBUTES: | 
|  | 2823 | *params = programObject->getActiveAttributeCount(); | 
|  | 2824 | return; | 
|  | 2825 | case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH: | 
|  | 2826 | *params = programObject->getActiveAttributeMaxLength(); | 
|  | 2827 | return; | 
|  | 2828 | case GL_ACTIVE_UNIFORMS: | 
|  | 2829 | *params = programObject->getActiveUniformCount(); | 
|  | 2830 | return; | 
|  | 2831 | case GL_ACTIVE_UNIFORM_MAX_LENGTH: | 
|  | 2832 | *params = programObject->getActiveUniformMaxLength(); | 
|  | 2833 | return; | 
|  | 2834 | default: | 
|  | 2835 | return error(GL_INVALID_ENUM); | 
|  | 2836 | } | 
|  | 2837 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2838 | } | 
|  | 2839 |  | 
|  | 2840 | void GL_APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog) | 
|  | 2841 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2842 | TRACE("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)", | 
|  | 2843 | program, bufsize, length, infolog); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2844 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2845 | if(bufsize < 0) | 
|  | 2846 | { | 
|  | 2847 | return error(GL_INVALID_VALUE); | 
|  | 2848 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2849 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2850 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2851 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2852 | if(context) | 
|  | 2853 | { | 
|  | 2854 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2855 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2856 | if(!programObject) | 
|  | 2857 | { | 
|  | 2858 | return error(GL_INVALID_VALUE); | 
|  | 2859 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2860 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2861 | programObject->getInfoLog(bufsize, length, infolog); | 
|  | 2862 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2863 | } | 
|  | 2864 |  | 
|  | 2865 | void GL_APIENTRY glGetQueryivEXT(GLenum target, GLenum pname, GLint *params) | 
|  | 2866 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2867 | TRACE("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2868 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2869 | switch(pname) | 
|  | 2870 | { | 
|  | 2871 | case GL_CURRENT_QUERY_EXT: | 
|  | 2872 | break; | 
|  | 2873 | default: | 
|  | 2874 | return error(GL_INVALID_ENUM); | 
|  | 2875 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2876 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2877 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2878 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2879 | if(context) | 
|  | 2880 | { | 
|  | 2881 | params[0] = context->getActiveQuery(target); | 
|  | 2882 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2883 | } | 
|  | 2884 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2885 | void GL_APIENTRY glGetQueryObjectuivEXT(GLuint name, GLenum pname, GLuint *params) | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2886 | { | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2887 | TRACE("(GLuint name = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", name, pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2888 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2889 | switch(pname) | 
|  | 2890 | { | 
|  | 2891 | case GL_QUERY_RESULT_EXT: | 
|  | 2892 | case GL_QUERY_RESULT_AVAILABLE_EXT: | 
|  | 2893 | break; | 
|  | 2894 | default: | 
|  | 2895 | return error(GL_INVALID_ENUM); | 
|  | 2896 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2897 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2898 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2899 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2900 | if(context) | 
|  | 2901 | { | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2902 | es2::Query *queryObject = context->getQuery(name, false, GL_NONE); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2903 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2904 | if(!queryObject) | 
|  | 2905 | { | 
|  | 2906 | return error(GL_INVALID_OPERATION); | 
|  | 2907 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2908 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2909 | if(context->getActiveQuery(queryObject->getType()) == name) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2910 | { | 
|  | 2911 | return error(GL_INVALID_OPERATION); | 
|  | 2912 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2913 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2914 | switch(pname) | 
|  | 2915 | { | 
|  | 2916 | case GL_QUERY_RESULT_EXT: | 
|  | 2917 | params[0] = queryObject->getResult(); | 
|  | 2918 | break; | 
|  | 2919 | case GL_QUERY_RESULT_AVAILABLE_EXT: | 
|  | 2920 | params[0] = queryObject->isResultAvailable(); | 
|  | 2921 | break; | 
|  | 2922 | default: | 
|  | 2923 | ASSERT(false); | 
|  | 2924 | } | 
|  | 2925 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2926 | } | 
|  | 2927 |  | 
|  | 2928 | void GL_APIENTRY glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) | 
|  | 2929 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2930 | TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2931 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2932 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2933 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2934 | if(context) | 
|  | 2935 | { | 
|  | 2936 | if(target != GL_RENDERBUFFER) | 
|  | 2937 | { | 
|  | 2938 | return error(GL_INVALID_ENUM); | 
|  | 2939 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2940 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2941 | if(context->getRenderbufferName() == 0) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2942 | { | 
|  | 2943 | return error(GL_INVALID_OPERATION); | 
|  | 2944 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2945 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 2946 | es2::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferName()); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2947 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2948 | switch(pname) | 
|  | 2949 | { | 
|  | 2950 | case GL_RENDERBUFFER_WIDTH:           *params = renderbuffer->getWidth();       break; | 
|  | 2951 | case GL_RENDERBUFFER_HEIGHT:          *params = renderbuffer->getHeight();      break; | 
|  | 2952 | case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getFormat();      break; | 
|  | 2953 | case GL_RENDERBUFFER_RED_SIZE:        *params = renderbuffer->getRedSize();     break; | 
|  | 2954 | case GL_RENDERBUFFER_GREEN_SIZE:      *params = renderbuffer->getGreenSize();   break; | 
|  | 2955 | case GL_RENDERBUFFER_BLUE_SIZE:       *params = renderbuffer->getBlueSize();    break; | 
|  | 2956 | case GL_RENDERBUFFER_ALPHA_SIZE:      *params = renderbuffer->getAlphaSize();   break; | 
|  | 2957 | case GL_RENDERBUFFER_DEPTH_SIZE:      *params = renderbuffer->getDepthSize();   break; | 
|  | 2958 | case GL_RENDERBUFFER_STENCIL_SIZE:    *params = renderbuffer->getStencilSize(); break; | 
|  | 2959 | case GL_RENDERBUFFER_SAMPLES_ANGLE:   *params = renderbuffer->getSamples();     break; | 
|  | 2960 | default: | 
|  | 2961 | return error(GL_INVALID_ENUM); | 
|  | 2962 | } | 
|  | 2963 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2964 | } | 
|  | 2965 |  | 
|  | 2966 | void GL_APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint* params) | 
|  | 2967 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2968 | TRACE("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2969 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2970 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2971 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2972 | if(context) | 
|  | 2973 | { | 
|  | 2974 | es2::Shader *shaderObject = context->getShader(shader); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2975 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2976 | if(!shaderObject) | 
|  | 2977 | { | 
|  | 2978 | return error(GL_INVALID_VALUE); | 
|  | 2979 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 2980 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 2981 | switch(pname) | 
|  | 2982 | { | 
|  | 2983 | case GL_SHADER_TYPE: | 
|  | 2984 | *params = shaderObject->getType(); | 
|  | 2985 | return; | 
|  | 2986 | case GL_DELETE_STATUS: | 
|  | 2987 | *params = shaderObject->isFlaggedForDeletion(); | 
|  | 2988 | return; | 
|  | 2989 | case GL_COMPILE_STATUS: | 
|  | 2990 | *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE; | 
|  | 2991 | return; | 
|  | 2992 | case GL_INFO_LOG_LENGTH: | 
|  | 2993 | *params = shaderObject->getInfoLogLength(); | 
|  | 2994 | return; | 
|  | 2995 | case GL_SHADER_SOURCE_LENGTH: | 
|  | 2996 | *params = shaderObject->getSourceLength(); | 
|  | 2997 | return; | 
|  | 2998 | default: | 
|  | 2999 | return error(GL_INVALID_ENUM); | 
|  | 3000 | } | 
|  | 3001 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3002 | } | 
|  | 3003 |  | 
|  | 3004 | void GL_APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog) | 
|  | 3005 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3006 | TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)", | 
|  | 3007 | shader, bufsize, length, infolog); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3008 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3009 | if(bufsize < 0) | 
|  | 3010 | { | 
|  | 3011 | return error(GL_INVALID_VALUE); | 
|  | 3012 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3013 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3014 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3015 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3016 | if(context) | 
|  | 3017 | { | 
|  | 3018 | es2::Shader *shaderObject = context->getShader(shader); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3019 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3020 | if(!shaderObject) | 
|  | 3021 | { | 
|  | 3022 | return error(GL_INVALID_VALUE); | 
|  | 3023 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3024 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3025 | shaderObject->getInfoLog(bufsize, length, infolog); | 
|  | 3026 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3027 | } | 
|  | 3028 |  | 
|  | 3029 | void GL_APIENTRY glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) | 
|  | 3030 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3031 | TRACE("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)", | 
|  | 3032 | shadertype, precisiontype, range, precision); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3033 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3034 | switch(shadertype) | 
|  | 3035 | { | 
|  | 3036 | case GL_VERTEX_SHADER: | 
|  | 3037 | case GL_FRAGMENT_SHADER: | 
|  | 3038 | break; | 
|  | 3039 | default: | 
|  | 3040 | return error(GL_INVALID_ENUM); | 
|  | 3041 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3042 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3043 | switch(precisiontype) | 
|  | 3044 | { | 
|  | 3045 | case GL_LOW_FLOAT: | 
|  | 3046 | case GL_MEDIUM_FLOAT: | 
|  | 3047 | case GL_HIGH_FLOAT: | 
|  | 3048 | // IEEE 754 single-precision | 
|  | 3049 | range[0] = 127; | 
|  | 3050 | range[1] = 127; | 
|  | 3051 | *precision = 23; | 
|  | 3052 | break; | 
|  | 3053 | case GL_LOW_INT: | 
|  | 3054 | case GL_MEDIUM_INT: | 
|  | 3055 | case GL_HIGH_INT: | 
|  | 3056 | // Single-precision floating-point numbers can accurately represent integers up to +/-16777216 | 
|  | 3057 | range[0] = 24; | 
|  | 3058 | range[1] = 24; | 
|  | 3059 | *precision = 0; | 
|  | 3060 | break; | 
|  | 3061 | default: | 
|  | 3062 | return error(GL_INVALID_ENUM); | 
|  | 3063 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3064 | } | 
|  | 3065 |  | 
|  | 3066 | void GL_APIENTRY glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source) | 
|  | 3067 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3068 | TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)", | 
|  | 3069 | shader, bufsize, length, source); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3070 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3071 | if(bufsize < 0) | 
|  | 3072 | { | 
|  | 3073 | return error(GL_INVALID_VALUE); | 
|  | 3074 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3075 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3076 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3077 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3078 | if(context) | 
|  | 3079 | { | 
|  | 3080 | es2::Shader *shaderObject = context->getShader(shader); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3081 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3082 | if(!shaderObject) | 
|  | 3083 | { | 
|  | 3084 | return error(GL_INVALID_OPERATION); | 
|  | 3085 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3086 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3087 | shaderObject->getSource(bufsize, length, source); | 
|  | 3088 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3089 | } | 
|  | 3090 |  | 
|  | 3091 | const GLubyte* GL_APIENTRY glGetString(GLenum name) | 
|  | 3092 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3093 | TRACE("(GLenum name = 0x%X)", name); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3094 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3095 | switch(name) | 
|  | 3096 | { | 
|  | 3097 | case GL_VENDOR: | 
|  | 3098 | return (GLubyte*)"TransGaming Inc."; | 
|  | 3099 | case GL_RENDERER: | 
|  | 3100 | return (GLubyte*)"SwiftShader"; | 
|  | 3101 | case GL_VERSION: | 
|  | 3102 | return (GLubyte*)"OpenGL ES 2.0 SwiftShader " VERSION_STRING; | 
|  | 3103 | case GL_SHADING_LANGUAGE_VERSION: | 
|  | 3104 | return (GLubyte*)"OpenGL ES GLSL ES 1.00 SwiftShader " VERSION_STRING; | 
|  | 3105 | case GL_EXTENSIONS: | 
|  | 3106 | // Keep list sorted in following order: | 
|  | 3107 | // OES extensions | 
|  | 3108 | // EXT extensions | 
|  | 3109 | // Vendor extensions | 
|  | 3110 | return (GLubyte*) | 
| Nicolas Capens | 2265824 | 2014-11-29 00:31:41 -0500 | [diff] [blame] | 3111 | "GL_OES_compressed_ETC1_RGB8_texture " | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3112 | "GL_OES_depth_texture " | 
|  | 3113 | "GL_OES_depth_texture_cube_map " | 
|  | 3114 | "GL_OES_EGL_image " | 
|  | 3115 | "GL_OES_EGL_image_external " | 
|  | 3116 | "GL_OES_element_index_uint " | 
|  | 3117 | "GL_OES_packed_depth_stencil " | 
|  | 3118 | "GL_OES_rgb8_rgba8 " | 
|  | 3119 | "GL_OES_standard_derivatives " | 
|  | 3120 | "GL_OES_texture_float " | 
|  | 3121 | "GL_OES_texture_float_linear " | 
|  | 3122 | "GL_OES_texture_half_float " | 
|  | 3123 | "GL_OES_texture_half_float_linear " | 
|  | 3124 | "GL_OES_texture_npot " | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 3125 | "GL_OES_texture_3D " | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3126 | "GL_EXT_blend_minmax " | 
|  | 3127 | "GL_EXT_occlusion_query_boolean " | 
|  | 3128 | "GL_EXT_read_format_bgra " | 
| Nicolas Capens | 2265824 | 2014-11-29 00:31:41 -0500 | [diff] [blame] | 3129 | #if (S3TC_SUPPORT) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3130 | "GL_EXT_texture_compression_dxt1 " | 
| Nicolas Capens | 2265824 | 2014-11-29 00:31:41 -0500 | [diff] [blame] | 3131 | #endif | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3132 | "GL_EXT_texture_filter_anisotropic " | 
|  | 3133 | "GL_EXT_texture_format_BGRA8888 " | 
|  | 3134 | "GL_ANGLE_framebuffer_blit " | 
| Alexis Hetu | e9233fb | 2015-02-11 10:31:58 -0500 | [diff] [blame] | 3135 | "GL_NV_framebuffer_blit " | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3136 | "GL_ANGLE_framebuffer_multisample " | 
| Nicolas Capens | 2265824 | 2014-11-29 00:31:41 -0500 | [diff] [blame] | 3137 | #if (S3TC_SUPPORT) | 
|  | 3138 | "GL_ANGLE_texture_compression_dxt3 " | 
|  | 3139 | "GL_ANGLE_texture_compression_dxt5 " | 
|  | 3140 | #endif | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3141 | "GL_NV_fence"; | 
|  | 3142 | default: | 
|  | 3143 | return error(GL_INVALID_ENUM, (GLubyte*)NULL); | 
|  | 3144 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3145 | } | 
|  | 3146 |  | 
|  | 3147 | void GL_APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) | 
|  | 3148 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3149 | TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", target, pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3150 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3151 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3152 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3153 | if(context) | 
|  | 3154 | { | 
|  | 3155 | es2::Texture *texture; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3156 |  | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 3157 | egl::GLint clientVersion = context->getClientVersion(); | 
|  | 3158 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3159 | switch(target) | 
|  | 3160 | { | 
|  | 3161 | case GL_TEXTURE_2D: | 
|  | 3162 | texture = context->getTexture2D(); | 
|  | 3163 | break; | 
|  | 3164 | case GL_TEXTURE_CUBE_MAP: | 
|  | 3165 | texture = context->getTextureCubeMap(); | 
|  | 3166 | break; | 
|  | 3167 | case GL_TEXTURE_EXTERNAL_OES: | 
|  | 3168 | texture = context->getTextureExternal(); | 
|  | 3169 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 3170 | case GL_TEXTURE_2D_ARRAY: | 
|  | 3171 | if(clientVersion < 3) | 
|  | 3172 | { | 
|  | 3173 | return error(GL_INVALID_ENUM); | 
|  | 3174 | } | 
|  | 3175 | else | 
|  | 3176 | { | 
|  | 3177 | UNIMPLEMENTED(); | 
|  | 3178 | texture = context->getTexture3D(); | 
|  | 3179 | break; | 
|  | 3180 | } | 
|  | 3181 | case GL_TEXTURE_3D_OES: | 
|  | 3182 | texture = context->getTexture3D(); | 
|  | 3183 | break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3184 | default: | 
|  | 3185 | return error(GL_INVALID_ENUM); | 
|  | 3186 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3187 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3188 | switch(pname) | 
|  | 3189 | { | 
|  | 3190 | case GL_TEXTURE_MAG_FILTER: | 
|  | 3191 | *params = (GLfloat)texture->getMagFilter(); | 
|  | 3192 | break; | 
|  | 3193 | case GL_TEXTURE_MIN_FILTER: | 
|  | 3194 | *params = (GLfloat)texture->getMinFilter(); | 
|  | 3195 | break; | 
|  | 3196 | case GL_TEXTURE_WRAP_S: | 
|  | 3197 | *params = (GLfloat)texture->getWrapS(); | 
|  | 3198 | break; | 
|  | 3199 | case GL_TEXTURE_WRAP_T: | 
|  | 3200 | *params = (GLfloat)texture->getWrapT(); | 
|  | 3201 | break; | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 3202 | case GL_TEXTURE_WRAP_R_OES: | 
|  | 3203 | *params = (GLfloat)texture->getWrapR(); | 
|  | 3204 | break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3205 | case GL_TEXTURE_MAX_ANISOTROPY_EXT: | 
|  | 3206 | *params = texture->getMaxAnisotropy(); | 
|  | 3207 | break; | 
|  | 3208 | case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES: | 
|  | 3209 | *params = (GLfloat)1; | 
|  | 3210 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 3211 | case GL_TEXTURE_BASE_LEVEL: | 
|  | 3212 | if(clientVersion >= 3) | 
|  | 3213 | { | 
|  | 3214 | *params = (GLfloat)texture->getBaseLevel(); | 
|  | 3215 | break; | 
|  | 3216 | } | 
|  | 3217 | else return error(GL_INVALID_ENUM); | 
|  | 3218 | case GL_TEXTURE_COMPARE_FUNC: | 
|  | 3219 | if(clientVersion >= 3) | 
|  | 3220 | { | 
|  | 3221 | *params = (GLfloat)texture->getCompareFunc(); | 
|  | 3222 | break; | 
|  | 3223 | } | 
|  | 3224 | else return error(GL_INVALID_ENUM); | 
|  | 3225 | case GL_TEXTURE_COMPARE_MODE: | 
|  | 3226 | if(clientVersion >= 3) | 
|  | 3227 | { | 
|  | 3228 | *params = (GLfloat)texture->getCompareMode(); | 
|  | 3229 | break; | 
|  | 3230 | } | 
|  | 3231 | else return error(GL_INVALID_ENUM); | 
|  | 3232 | case GL_TEXTURE_IMMUTABLE_FORMAT: | 
|  | 3233 | if(clientVersion >= 3) | 
|  | 3234 | { | 
|  | 3235 | *params = (GLfloat)texture->getImmutableFormat(); | 
|  | 3236 | break; | 
|  | 3237 | } | 
|  | 3238 | else return error(GL_INVALID_ENUM); | 
|  | 3239 | case GL_TEXTURE_MAX_LEVEL: | 
|  | 3240 | if(clientVersion >= 3) | 
|  | 3241 | { | 
|  | 3242 | *params = (GLfloat)texture->getMaxLevel(); | 
|  | 3243 | break; | 
|  | 3244 | } | 
|  | 3245 | else return error(GL_INVALID_ENUM); | 
|  | 3246 | case GL_TEXTURE_MAX_LOD: | 
|  | 3247 | if(clientVersion >= 3) | 
|  | 3248 | { | 
|  | 3249 | *params = texture->getMaxLOD(); | 
|  | 3250 | break; | 
|  | 3251 | } | 
|  | 3252 | else return error(GL_INVALID_ENUM); | 
|  | 3253 | case GL_TEXTURE_MIN_LOD: | 
|  | 3254 | if(clientVersion >= 3) | 
|  | 3255 | { | 
|  | 3256 | *params = texture->getMinLOD(); | 
|  | 3257 | break; | 
|  | 3258 | } | 
|  | 3259 | else return error(GL_INVALID_ENUM); | 
|  | 3260 | case GL_TEXTURE_SWIZZLE_R: | 
|  | 3261 | if(clientVersion >= 3) | 
|  | 3262 | { | 
|  | 3263 | *params = (GLfloat)texture->getSwizzleR(); | 
|  | 3264 | break; | 
|  | 3265 | } | 
|  | 3266 | else return error(GL_INVALID_ENUM); | 
|  | 3267 | case GL_TEXTURE_SWIZZLE_G: | 
|  | 3268 | if(clientVersion >= 3) | 
|  | 3269 | { | 
|  | 3270 | *params = (GLfloat)texture->getSwizzleG(); | 
|  | 3271 | break; | 
|  | 3272 | } | 
|  | 3273 | else return error(GL_INVALID_ENUM); | 
|  | 3274 | case GL_TEXTURE_SWIZZLE_B: | 
|  | 3275 | if(clientVersion >= 3) | 
|  | 3276 | { | 
|  | 3277 | *params = (GLfloat)texture->getSwizzleB(); | 
|  | 3278 | break; | 
|  | 3279 | } | 
|  | 3280 | else return error(GL_INVALID_ENUM); | 
|  | 3281 | case GL_TEXTURE_SWIZZLE_A: | 
|  | 3282 | if(clientVersion >= 3) | 
|  | 3283 | { | 
|  | 3284 | *params = (GLfloat)texture->getSwizzleA(); | 
|  | 3285 | break; | 
|  | 3286 | } | 
|  | 3287 | else return error(GL_INVALID_ENUM); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3288 | default: | 
|  | 3289 | return error(GL_INVALID_ENUM); | 
|  | 3290 | } | 
|  | 3291 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3292 | } | 
|  | 3293 |  | 
|  | 3294 | void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) | 
|  | 3295 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3296 | TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3297 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3298 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3299 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3300 | if(context) | 
|  | 3301 | { | 
|  | 3302 | es2::Texture *texture; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3303 |  | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 3304 | egl::GLint clientVersion = context->getClientVersion(); | 
|  | 3305 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3306 | switch(target) | 
|  | 3307 | { | 
|  | 3308 | case GL_TEXTURE_2D: | 
|  | 3309 | texture = context->getTexture2D(); | 
|  | 3310 | break; | 
|  | 3311 | case GL_TEXTURE_CUBE_MAP: | 
|  | 3312 | texture = context->getTextureCubeMap(); | 
|  | 3313 | break; | 
|  | 3314 | case GL_TEXTURE_EXTERNAL_OES: | 
|  | 3315 | texture = context->getTextureExternal(); | 
|  | 3316 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 3317 | case GL_TEXTURE_2D_ARRAY: | 
|  | 3318 | if(clientVersion < 3) | 
|  | 3319 | { | 
|  | 3320 | return error(GL_INVALID_ENUM); | 
|  | 3321 | } | 
|  | 3322 | else | 
|  | 3323 | { | 
|  | 3324 | UNIMPLEMENTED(); | 
|  | 3325 | texture = context->getTexture3D(); | 
|  | 3326 | break; | 
|  | 3327 | } | 
|  | 3328 | case GL_TEXTURE_3D_OES: | 
|  | 3329 | texture = context->getTexture3D(); | 
|  | 3330 | break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3331 | default: | 
|  | 3332 | return error(GL_INVALID_ENUM); | 
|  | 3333 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3334 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3335 | switch(pname) | 
|  | 3336 | { | 
|  | 3337 | case GL_TEXTURE_MAG_FILTER: | 
|  | 3338 | *params = texture->getMagFilter(); | 
|  | 3339 | break; | 
|  | 3340 | case GL_TEXTURE_MIN_FILTER: | 
|  | 3341 | *params = texture->getMinFilter(); | 
|  | 3342 | break; | 
|  | 3343 | case GL_TEXTURE_WRAP_S: | 
|  | 3344 | *params = texture->getWrapS(); | 
|  | 3345 | break; | 
|  | 3346 | case GL_TEXTURE_WRAP_T: | 
|  | 3347 | *params = texture->getWrapT(); | 
|  | 3348 | break; | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 3349 | case GL_TEXTURE_WRAP_R_OES: | 
|  | 3350 | *params = texture->getWrapR(); | 
|  | 3351 | break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3352 | case GL_TEXTURE_MAX_ANISOTROPY_EXT: | 
|  | 3353 | *params = (GLint)texture->getMaxAnisotropy(); | 
|  | 3354 | break; | 
|  | 3355 | case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES: | 
|  | 3356 | *params = 1; | 
|  | 3357 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 3358 | case GL_TEXTURE_BASE_LEVEL: | 
|  | 3359 | if(clientVersion >= 3) | 
|  | 3360 | { | 
|  | 3361 | *params = texture->getBaseLevel(); | 
|  | 3362 | break; | 
|  | 3363 | } | 
|  | 3364 | else return error(GL_INVALID_ENUM); | 
|  | 3365 | case GL_TEXTURE_COMPARE_FUNC: | 
|  | 3366 | if(clientVersion >= 3) | 
|  | 3367 | { | 
|  | 3368 | *params = (GLint)texture->getCompareFunc(); | 
|  | 3369 | break; | 
|  | 3370 | } | 
|  | 3371 | else return error(GL_INVALID_ENUM); | 
|  | 3372 | case GL_TEXTURE_COMPARE_MODE: | 
|  | 3373 | if(clientVersion >= 3) | 
|  | 3374 | { | 
|  | 3375 | *params = (GLint)texture->getCompareMode(); | 
|  | 3376 | break; | 
|  | 3377 | } | 
|  | 3378 | else return error(GL_INVALID_ENUM); | 
|  | 3379 | case GL_TEXTURE_IMMUTABLE_FORMAT: | 
|  | 3380 | if(clientVersion >= 3) | 
|  | 3381 | { | 
|  | 3382 | *params = (GLint)texture->getImmutableFormat(); | 
|  | 3383 | break; | 
|  | 3384 | } | 
|  | 3385 | else return error(GL_INVALID_ENUM); | 
|  | 3386 | case GL_TEXTURE_MAX_LEVEL: | 
|  | 3387 | if(clientVersion >= 3) | 
|  | 3388 | { | 
|  | 3389 | *params = texture->getMaxLevel(); | 
|  | 3390 | break; | 
|  | 3391 | } | 
|  | 3392 | else return error(GL_INVALID_ENUM); | 
|  | 3393 | case GL_TEXTURE_MAX_LOD: | 
|  | 3394 | if(clientVersion >= 3) | 
|  | 3395 | { | 
|  | 3396 | *params = (GLint)texture->getMaxLOD(); | 
|  | 3397 | break; | 
|  | 3398 | } | 
|  | 3399 | else return error(GL_INVALID_ENUM); | 
|  | 3400 | case GL_TEXTURE_MIN_LOD: | 
|  | 3401 | if(clientVersion >= 3) | 
|  | 3402 | { | 
|  | 3403 | *params = (GLint)texture->getMinLOD(); | 
|  | 3404 | break; | 
|  | 3405 | } | 
|  | 3406 | else return error(GL_INVALID_ENUM); | 
|  | 3407 | case GL_TEXTURE_SWIZZLE_R: | 
|  | 3408 | if(clientVersion >= 3) | 
|  | 3409 | { | 
|  | 3410 | *params = (GLint)texture->getSwizzleR(); | 
|  | 3411 | break; | 
|  | 3412 | } | 
|  | 3413 | else return error(GL_INVALID_ENUM); | 
|  | 3414 | case GL_TEXTURE_SWIZZLE_G: | 
|  | 3415 | if(clientVersion >= 3) | 
|  | 3416 | { | 
|  | 3417 | *params = (GLint)texture->getSwizzleG(); | 
|  | 3418 | break; | 
|  | 3419 | } | 
|  | 3420 | else return error(GL_INVALID_ENUM); | 
|  | 3421 | case GL_TEXTURE_SWIZZLE_B: | 
|  | 3422 | if(clientVersion >= 3) | 
|  | 3423 | { | 
|  | 3424 | *params = (GLint)texture->getSwizzleB(); | 
|  | 3425 | break; | 
|  | 3426 | } | 
|  | 3427 | else return error(GL_INVALID_ENUM); | 
|  | 3428 | case GL_TEXTURE_SWIZZLE_A: | 
|  | 3429 | if(clientVersion >= 3) | 
|  | 3430 | { | 
|  | 3431 | *params = (GLint)texture->getSwizzleA(); | 
|  | 3432 | break; | 
|  | 3433 | } | 
|  | 3434 | else return error(GL_INVALID_ENUM); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3435 | default: | 
|  | 3436 | return error(GL_INVALID_ENUM); | 
|  | 3437 | } | 
|  | 3438 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3439 | } | 
|  | 3440 |  | 
|  | 3441 | void GL_APIENTRY glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params) | 
|  | 3442 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3443 | TRACE("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)", | 
|  | 3444 | program, location, bufSize, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3445 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3446 | if(bufSize < 0) | 
|  | 3447 | { | 
|  | 3448 | return error(GL_INVALID_VALUE); | 
|  | 3449 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3450 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3451 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3452 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3453 | if(context) | 
|  | 3454 | { | 
|  | 3455 | if(program == 0) | 
|  | 3456 | { | 
|  | 3457 | return error(GL_INVALID_VALUE); | 
|  | 3458 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3459 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3460 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3461 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3462 | if(!programObject || !programObject->isLinked()) | 
|  | 3463 | { | 
|  | 3464 | return error(GL_INVALID_OPERATION); | 
|  | 3465 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3466 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3467 | if(!programObject->getUniformfv(location, &bufSize, params)) | 
|  | 3468 | { | 
|  | 3469 | return error(GL_INVALID_OPERATION); | 
|  | 3470 | } | 
|  | 3471 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3472 | } | 
|  | 3473 |  | 
|  | 3474 | void GL_APIENTRY glGetUniformfv(GLuint program, GLint location, GLfloat* params) | 
|  | 3475 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3476 | TRACE("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3477 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3478 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3479 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3480 | if(context) | 
|  | 3481 | { | 
|  | 3482 | if(program == 0) | 
|  | 3483 | { | 
|  | 3484 | return error(GL_INVALID_VALUE); | 
|  | 3485 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3486 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3487 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3488 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3489 | if(!programObject || !programObject->isLinked()) | 
|  | 3490 | { | 
|  | 3491 | return error(GL_INVALID_OPERATION); | 
|  | 3492 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3493 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3494 | if(!programObject->getUniformfv(location, NULL, params)) | 
|  | 3495 | { | 
|  | 3496 | return error(GL_INVALID_OPERATION); | 
|  | 3497 | } | 
|  | 3498 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3499 | } | 
|  | 3500 |  | 
|  | 3501 | void GL_APIENTRY glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params) | 
|  | 3502 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3503 | TRACE("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)", | 
|  | 3504 | program, location, bufSize, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3505 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3506 | if(bufSize < 0) | 
|  | 3507 | { | 
|  | 3508 | return error(GL_INVALID_VALUE); | 
|  | 3509 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3510 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3511 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3512 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3513 | if(context) | 
|  | 3514 | { | 
|  | 3515 | if(program == 0) | 
|  | 3516 | { | 
|  | 3517 | return error(GL_INVALID_VALUE); | 
|  | 3518 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3519 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3520 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3521 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3522 | if(!programObject || !programObject->isLinked()) | 
|  | 3523 | { | 
|  | 3524 | return error(GL_INVALID_OPERATION); | 
|  | 3525 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3526 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3527 | if(!programObject) | 
|  | 3528 | { | 
|  | 3529 | return error(GL_INVALID_OPERATION); | 
|  | 3530 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3531 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3532 | if(!programObject->getUniformiv(location, &bufSize, params)) | 
|  | 3533 | { | 
|  | 3534 | return error(GL_INVALID_OPERATION); | 
|  | 3535 | } | 
|  | 3536 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3537 | } | 
|  | 3538 |  | 
|  | 3539 | void GL_APIENTRY glGetUniformiv(GLuint program, GLint location, GLint* params) | 
|  | 3540 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3541 | TRACE("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3542 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3543 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3544 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3545 | if(context) | 
|  | 3546 | { | 
|  | 3547 | if(program == 0) | 
|  | 3548 | { | 
|  | 3549 | return error(GL_INVALID_VALUE); | 
|  | 3550 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3551 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3552 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3553 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3554 | if(!programObject || !programObject->isLinked()) | 
|  | 3555 | { | 
|  | 3556 | return error(GL_INVALID_OPERATION); | 
|  | 3557 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3558 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3559 | if(!programObject) | 
|  | 3560 | { | 
|  | 3561 | return error(GL_INVALID_OPERATION); | 
|  | 3562 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3563 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3564 | if(!programObject->getUniformiv(location, NULL, params)) | 
|  | 3565 | { | 
|  | 3566 | return error(GL_INVALID_OPERATION); | 
|  | 3567 | } | 
|  | 3568 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3569 | } | 
|  | 3570 |  | 
|  | 3571 | int GL_APIENTRY glGetUniformLocation(GLuint program, const GLchar* name) | 
|  | 3572 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3573 | TRACE("(GLuint program = %d, const GLchar* name = %s)", program, name); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3574 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3575 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3576 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3577 | if(strstr(name, "gl_") == name) | 
|  | 3578 | { | 
|  | 3579 | return -1; | 
|  | 3580 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3581 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3582 | if(context) | 
|  | 3583 | { | 
|  | 3584 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3585 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3586 | if(!programObject) | 
|  | 3587 | { | 
|  | 3588 | if(context->getShader(program)) | 
|  | 3589 | { | 
|  | 3590 | return error(GL_INVALID_OPERATION, -1); | 
|  | 3591 | } | 
|  | 3592 | else | 
|  | 3593 | { | 
|  | 3594 | return error(GL_INVALID_VALUE, -1); | 
|  | 3595 | } | 
|  | 3596 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3597 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3598 | if(!programObject->isLinked()) | 
|  | 3599 | { | 
|  | 3600 | return error(GL_INVALID_OPERATION, -1); | 
|  | 3601 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3602 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3603 | return programObject->getUniformLocation(name); | 
|  | 3604 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3605 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3606 | return -1; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3607 | } | 
|  | 3608 |  | 
|  | 3609 | void GL_APIENTRY glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) | 
|  | 3610 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3611 | TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3612 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3613 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3614 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3615 | if(context) | 
|  | 3616 | { | 
|  | 3617 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 3618 | { | 
|  | 3619 | return error(GL_INVALID_VALUE); | 
|  | 3620 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3621 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3622 | const es2::VertexAttribute &attribState = context->getVertexAttribState(index); | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 3623 |  | 
|  | 3624 | egl::GLint clientVersion = context->getClientVersion(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3625 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3626 | switch(pname) | 
|  | 3627 | { | 
|  | 3628 | case GL_VERTEX_ATTRIB_ARRAY_ENABLED: | 
|  | 3629 | *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE); | 
|  | 3630 | break; | 
|  | 3631 | case GL_VERTEX_ATTRIB_ARRAY_SIZE: | 
|  | 3632 | *params = (GLfloat)attribState.mSize; | 
|  | 3633 | break; | 
|  | 3634 | case GL_VERTEX_ATTRIB_ARRAY_STRIDE: | 
|  | 3635 | *params = (GLfloat)attribState.mStride; | 
|  | 3636 | break; | 
|  | 3637 | case GL_VERTEX_ATTRIB_ARRAY_TYPE: | 
|  | 3638 | *params = (GLfloat)attribState.mType; | 
|  | 3639 | break; | 
|  | 3640 | case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: | 
|  | 3641 | *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE); | 
|  | 3642 | break; | 
|  | 3643 | case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 3644 | *params = (GLfloat)attribState.mBoundBuffer.name(); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3645 | break; | 
|  | 3646 | case GL_CURRENT_VERTEX_ATTRIB: | 
|  | 3647 | for(int i = 0; i < 4; ++i) | 
|  | 3648 | { | 
|  | 3649 | params[i] = attribState.mCurrentValue[i]; | 
|  | 3650 | } | 
|  | 3651 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 3652 | case GL_VERTEX_ATTRIB_ARRAY_INTEGER: | 
|  | 3653 | if(clientVersion >= 3) | 
|  | 3654 | { | 
|  | 3655 | switch(attribState.mType) | 
|  | 3656 | { | 
|  | 3657 | case GL_BYTE: | 
|  | 3658 | case GL_UNSIGNED_BYTE: | 
|  | 3659 | case GL_SHORT: | 
|  | 3660 | case GL_UNSIGNED_SHORT: | 
|  | 3661 | case GL_INT: | 
|  | 3662 | case GL_INT_2_10_10_10_REV: | 
|  | 3663 | case GL_UNSIGNED_INT: | 
|  | 3664 | case GL_FIXED: | 
|  | 3665 | *params = (GLfloat)GL_TRUE; | 
|  | 3666 | break; | 
|  | 3667 | default: | 
|  | 3668 | *params = (GLfloat)GL_FALSE; | 
|  | 3669 | break; | 
|  | 3670 | } | 
|  | 3671 | break; | 
|  | 3672 | } | 
|  | 3673 | else return error(GL_INVALID_ENUM); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3674 | default: return error(GL_INVALID_ENUM); | 
|  | 3675 | } | 
|  | 3676 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3677 | } | 
|  | 3678 |  | 
|  | 3679 | void GL_APIENTRY glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params) | 
|  | 3680 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3681 | TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3682 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3683 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3684 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3685 | if(context) | 
|  | 3686 | { | 
|  | 3687 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 3688 | { | 
|  | 3689 | return error(GL_INVALID_VALUE); | 
|  | 3690 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3691 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3692 | const es2::VertexAttribute &attribState = context->getVertexAttribState(index); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3693 |  | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 3694 | egl::GLint clientVersion = context->getClientVersion(); | 
|  | 3695 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3696 | switch(pname) | 
|  | 3697 | { | 
|  | 3698 | case GL_VERTEX_ATTRIB_ARRAY_ENABLED: | 
|  | 3699 | *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE); | 
|  | 3700 | break; | 
|  | 3701 | case GL_VERTEX_ATTRIB_ARRAY_SIZE: | 
|  | 3702 | *params = attribState.mSize; | 
|  | 3703 | break; | 
|  | 3704 | case GL_VERTEX_ATTRIB_ARRAY_STRIDE: | 
|  | 3705 | *params = attribState.mStride; | 
|  | 3706 | break; | 
|  | 3707 | case GL_VERTEX_ATTRIB_ARRAY_TYPE: | 
|  | 3708 | *params = attribState.mType; | 
|  | 3709 | break; | 
|  | 3710 | case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: | 
|  | 3711 | *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE); | 
|  | 3712 | break; | 
|  | 3713 | case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 3714 | *params = attribState.mBoundBuffer.name(); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3715 | break; | 
|  | 3716 | case GL_CURRENT_VERTEX_ATTRIB: | 
|  | 3717 | for(int i = 0; i < 4; ++i) | 
|  | 3718 | { | 
|  | 3719 | float currentValue = attribState.mCurrentValue[i]; | 
|  | 3720 | params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f)); | 
|  | 3721 | } | 
|  | 3722 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 3723 | case GL_VERTEX_ATTRIB_ARRAY_INTEGER: | 
|  | 3724 | if(clientVersion >= 3) | 
|  | 3725 | { | 
|  | 3726 | switch(attribState.mType) | 
|  | 3727 | { | 
|  | 3728 | case GL_BYTE: | 
|  | 3729 | case GL_UNSIGNED_BYTE: | 
|  | 3730 | case GL_SHORT: | 
|  | 3731 | case GL_UNSIGNED_SHORT: | 
|  | 3732 | case GL_INT: | 
|  | 3733 | case GL_INT_2_10_10_10_REV: | 
|  | 3734 | case GL_UNSIGNED_INT: | 
|  | 3735 | case GL_FIXED: | 
|  | 3736 | *params = GL_TRUE; | 
|  | 3737 | break; | 
|  | 3738 | default: | 
|  | 3739 | *params = GL_FALSE; | 
|  | 3740 | break; | 
|  | 3741 | } | 
|  | 3742 | break; | 
|  | 3743 | } | 
|  | 3744 | else return error(GL_INVALID_ENUM); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3745 | default: return error(GL_INVALID_ENUM); | 
|  | 3746 | } | 
|  | 3747 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3748 | } | 
|  | 3749 |  | 
|  | 3750 | void GL_APIENTRY glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer) | 
|  | 3751 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3752 | TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3753 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3754 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3755 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3756 | if(context) | 
|  | 3757 | { | 
|  | 3758 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 3759 | { | 
|  | 3760 | return error(GL_INVALID_VALUE); | 
|  | 3761 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3762 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3763 | if(pname != GL_VERTEX_ATTRIB_ARRAY_POINTER) | 
|  | 3764 | { | 
|  | 3765 | return error(GL_INVALID_ENUM); | 
|  | 3766 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3767 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3768 | *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index)); | 
|  | 3769 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3770 | } | 
|  | 3771 |  | 
|  | 3772 | void GL_APIENTRY glHint(GLenum target, GLenum mode) | 
|  | 3773 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3774 | TRACE("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3775 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3776 | switch(mode) | 
|  | 3777 | { | 
|  | 3778 | case GL_FASTEST: | 
|  | 3779 | case GL_NICEST: | 
|  | 3780 | case GL_DONT_CARE: | 
|  | 3781 | break; | 
|  | 3782 | default: | 
|  | 3783 | return error(GL_INVALID_ENUM); | 
|  | 3784 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3785 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3786 | es2::Context *context = es2::getContext(); | 
|  | 3787 | switch(target) | 
|  | 3788 | { | 
|  | 3789 | case GL_GENERATE_MIPMAP_HINT: | 
|  | 3790 | if(context) context->setGenerateMipmapHint(mode); | 
|  | 3791 | break; | 
|  | 3792 | case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: | 
|  | 3793 | if(context) context->setFragmentShaderDerivativeHint(mode); | 
|  | 3794 | break; | 
|  | 3795 | default: | 
|  | 3796 | return error(GL_INVALID_ENUM); | 
|  | 3797 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3798 | } | 
|  | 3799 |  | 
|  | 3800 | GLboolean GL_APIENTRY glIsBuffer(GLuint buffer) | 
|  | 3801 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3802 | TRACE("(GLuint buffer = %d)", buffer); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3803 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3804 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3805 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3806 | if(context && buffer) | 
|  | 3807 | { | 
|  | 3808 | es2::Buffer *bufferObject = context->getBuffer(buffer); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3809 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3810 | if(bufferObject) | 
|  | 3811 | { | 
|  | 3812 | return GL_TRUE; | 
|  | 3813 | } | 
|  | 3814 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3815 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3816 | return GL_FALSE; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3817 | } | 
|  | 3818 |  | 
|  | 3819 | GLboolean GL_APIENTRY glIsEnabled(GLenum cap) | 
|  | 3820 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3821 | TRACE("(GLenum cap = 0x%X)", cap); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3822 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3823 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3824 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3825 | if(context) | 
|  | 3826 | { | 
|  | 3827 | switch(cap) | 
|  | 3828 | { | 
|  | 3829 | case GL_CULL_FACE:                return context->isCullFaceEnabled(); | 
|  | 3830 | case GL_POLYGON_OFFSET_FILL:      return context->isPolygonOffsetFillEnabled(); | 
|  | 3831 | case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled(); | 
|  | 3832 | case GL_SAMPLE_COVERAGE:          return context->isSampleCoverageEnabled(); | 
|  | 3833 | case GL_SCISSOR_TEST:             return context->isScissorTestEnabled(); | 
|  | 3834 | case GL_STENCIL_TEST:             return context->isStencilTestEnabled(); | 
|  | 3835 | case GL_DEPTH_TEST:               return context->isDepthTestEnabled(); | 
|  | 3836 | case GL_BLEND:                    return context->isBlendEnabled(); | 
|  | 3837 | case GL_DITHER:                   return context->isDitherEnabled(); | 
|  | 3838 | default: | 
|  | 3839 | return error(GL_INVALID_ENUM, false); | 
|  | 3840 | } | 
|  | 3841 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3842 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3843 | return false; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3844 | } | 
|  | 3845 |  | 
|  | 3846 | GLboolean GL_APIENTRY glIsFenceNV(GLuint fence) | 
|  | 3847 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3848 | TRACE("(GLuint fence = %d)", fence); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3849 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3850 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3851 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3852 | if(context) | 
|  | 3853 | { | 
|  | 3854 | es2::Fence *fenceObject = context->getFence(fence); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3855 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3856 | if(fenceObject == NULL) | 
|  | 3857 | { | 
|  | 3858 | return GL_FALSE; | 
|  | 3859 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3860 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3861 | return fenceObject->isFence(); | 
|  | 3862 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3863 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3864 | return GL_FALSE; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3865 | } | 
|  | 3866 |  | 
|  | 3867 | GLboolean GL_APIENTRY glIsFramebuffer(GLuint framebuffer) | 
|  | 3868 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3869 | TRACE("(GLuint framebuffer = %d)", framebuffer); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3870 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3871 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3872 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3873 | if(context && framebuffer) | 
|  | 3874 | { | 
|  | 3875 | es2::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3876 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3877 | if(framebufferObject) | 
|  | 3878 | { | 
|  | 3879 | return GL_TRUE; | 
|  | 3880 | } | 
|  | 3881 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3882 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3883 | return GL_FALSE; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3884 | } | 
|  | 3885 |  | 
|  | 3886 | GLboolean GL_APIENTRY glIsProgram(GLuint program) | 
|  | 3887 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3888 | TRACE("(GLuint program = %d)", program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3889 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3890 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3891 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3892 | if(context && program) | 
|  | 3893 | { | 
|  | 3894 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3895 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3896 | if(programObject) | 
|  | 3897 | { | 
|  | 3898 | return GL_TRUE; | 
|  | 3899 | } | 
|  | 3900 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3901 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3902 | return GL_FALSE; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3903 | } | 
|  | 3904 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 3905 | GLboolean GL_APIENTRY glIsQueryEXT(GLuint name) | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3906 | { | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 3907 | TRACE("(GLuint name = %d)", name); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3908 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 3909 | if(name == 0) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3910 | { | 
|  | 3911 | return GL_FALSE; | 
|  | 3912 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3913 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3914 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3915 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3916 | if(context) | 
|  | 3917 | { | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 3918 | es2::Query *queryObject = context->getQuery(name, false, GL_NONE); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3919 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3920 | if(queryObject) | 
|  | 3921 | { | 
|  | 3922 | return GL_TRUE; | 
|  | 3923 | } | 
|  | 3924 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3925 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3926 | return GL_FALSE; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3927 | } | 
|  | 3928 |  | 
|  | 3929 | GLboolean GL_APIENTRY glIsRenderbuffer(GLuint renderbuffer) | 
|  | 3930 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3931 | TRACE("(GLuint renderbuffer = %d)", renderbuffer); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3932 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3933 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3934 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3935 | if(context && renderbuffer) | 
|  | 3936 | { | 
|  | 3937 | es2::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3938 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3939 | if(renderbufferObject) | 
|  | 3940 | { | 
|  | 3941 | return GL_TRUE; | 
|  | 3942 | } | 
|  | 3943 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3944 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3945 | return GL_FALSE; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3946 | } | 
|  | 3947 |  | 
|  | 3948 | GLboolean GL_APIENTRY glIsShader(GLuint shader) | 
|  | 3949 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3950 | TRACE("(GLuint shader = %d)", shader); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3951 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3952 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3953 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3954 | if(context && shader) | 
|  | 3955 | { | 
|  | 3956 | es2::Shader *shaderObject = context->getShader(shader); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3957 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3958 | if(shaderObject) | 
|  | 3959 | { | 
|  | 3960 | return GL_TRUE; | 
|  | 3961 | } | 
|  | 3962 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3963 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3964 | return GL_FALSE; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3965 | } | 
|  | 3966 |  | 
|  | 3967 | GLboolean GL_APIENTRY glIsTexture(GLuint texture) | 
|  | 3968 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3969 | TRACE("(GLuint texture = %d)", texture); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3970 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3971 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3972 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3973 | if(context && texture) | 
|  | 3974 | { | 
|  | 3975 | es2::Texture *textureObject = context->getTexture(texture); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3976 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3977 | if(textureObject) | 
|  | 3978 | { | 
|  | 3979 | return GL_TRUE; | 
|  | 3980 | } | 
|  | 3981 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3982 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3983 | return GL_FALSE; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3984 | } | 
|  | 3985 |  | 
|  | 3986 | void GL_APIENTRY glLineWidth(GLfloat width) | 
|  | 3987 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3988 | TRACE("(GLfloat width = %f)", width); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3989 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3990 | if(width <= 0.0f) | 
|  | 3991 | { | 
|  | 3992 | return error(GL_INVALID_VALUE); | 
|  | 3993 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3994 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3995 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 3996 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 3997 | if(context) | 
|  | 3998 | { | 
|  | 3999 | context->setLineWidth(width); | 
|  | 4000 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4001 | } | 
|  | 4002 |  | 
|  | 4003 | void GL_APIENTRY glLinkProgram(GLuint program) | 
|  | 4004 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4005 | TRACE("(GLuint program = %d)", program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4006 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4007 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4008 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4009 | if(context) | 
|  | 4010 | { | 
|  | 4011 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4012 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4013 | if(!programObject) | 
|  | 4014 | { | 
|  | 4015 | if(context->getShader(program)) | 
|  | 4016 | { | 
|  | 4017 | return error(GL_INVALID_OPERATION); | 
|  | 4018 | } | 
|  | 4019 | else | 
|  | 4020 | { | 
|  | 4021 | return error(GL_INVALID_VALUE); | 
|  | 4022 | } | 
|  | 4023 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4024 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4025 | programObject->link(); | 
|  | 4026 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4027 | } | 
|  | 4028 |  | 
|  | 4029 | void GL_APIENTRY glPixelStorei(GLenum pname, GLint param) | 
|  | 4030 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4031 | TRACE("(GLenum pname = 0x%X, GLint param = %d)", pname, param); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4032 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4033 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4034 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4035 | if(context) | 
|  | 4036 | { | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 4037 | egl::GLint clientVersion = context->getClientVersion(); | 
|  | 4038 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4039 | switch(pname) | 
|  | 4040 | { | 
|  | 4041 | case GL_UNPACK_ALIGNMENT: | 
|  | 4042 | if(param != 1 && param != 2 && param != 4 && param != 8) | 
|  | 4043 | { | 
|  | 4044 | return error(GL_INVALID_VALUE); | 
|  | 4045 | } | 
|  | 4046 | context->setUnpackAlignment(param); | 
|  | 4047 | break; | 
|  | 4048 | case GL_PACK_ALIGNMENT: | 
|  | 4049 | if(param != 1 && param != 2 && param != 4 && param != 8) | 
|  | 4050 | { | 
|  | 4051 | return error(GL_INVALID_VALUE); | 
|  | 4052 | } | 
|  | 4053 | context->setPackAlignment(param); | 
|  | 4054 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 4055 | case GL_PACK_ROW_LENGTH: | 
|  | 4056 | case GL_PACK_SKIP_PIXELS: | 
|  | 4057 | case GL_PACK_SKIP_ROWS: | 
|  | 4058 | case GL_UNPACK_ROW_LENGTH: | 
|  | 4059 | case GL_UNPACK_IMAGE_HEIGHT: | 
|  | 4060 | case GL_UNPACK_SKIP_PIXELS: | 
|  | 4061 | case GL_UNPACK_SKIP_ROWS: | 
|  | 4062 | case GL_UNPACK_SKIP_IMAGES: | 
|  | 4063 | if(clientVersion >= 3) | 
|  | 4064 | { | 
|  | 4065 | UNIMPLEMENTED(); | 
|  | 4066 | break; | 
|  | 4067 | } | 
|  | 4068 | else return error(GL_INVALID_ENUM); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4069 | default: | 
|  | 4070 | return error(GL_INVALID_ENUM); | 
|  | 4071 | } | 
|  | 4072 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4073 | } | 
|  | 4074 |  | 
|  | 4075 | void GL_APIENTRY glPolygonOffset(GLfloat factor, GLfloat units) | 
|  | 4076 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4077 | TRACE("(GLfloat factor = %f, GLfloat units = %f)", factor, units); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4078 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4079 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4080 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4081 | if(context) | 
|  | 4082 | { | 
|  | 4083 | context->setPolygonOffsetParams(factor, units); | 
|  | 4084 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4085 | } | 
|  | 4086 |  | 
|  | 4087 | void GL_APIENTRY glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height, | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4088 | GLenum format, GLenum type, GLsizei bufSize, GLvoid *data) | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4089 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4090 | TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, " | 
|  | 4091 | "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)", | 
|  | 4092 | x, y, width, height, format, type, bufSize, data); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4093 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4094 | if(width < 0 || height < 0 || bufSize < 0) | 
|  | 4095 | { | 
|  | 4096 | return error(GL_INVALID_VALUE); | 
|  | 4097 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4098 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4099 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4100 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4101 | if(context) | 
|  | 4102 | { | 
|  | 4103 | context->readPixels(x, y, width, height, format, type, &bufSize, data); | 
|  | 4104 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4105 | } | 
|  | 4106 |  | 
|  | 4107 | void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels) | 
|  | 4108 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4109 | TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, " | 
|  | 4110 | "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)", | 
|  | 4111 | x, y, width, height, format, type,  pixels); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4112 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4113 | if(width < 0 || height < 0) | 
|  | 4114 | { | 
|  | 4115 | return error(GL_INVALID_VALUE); | 
|  | 4116 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4117 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4118 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4119 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4120 | if(context) | 
|  | 4121 | { | 
|  | 4122 | context->readPixels(x, y, width, height, format, type, NULL, pixels); | 
|  | 4123 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4124 | } | 
|  | 4125 |  | 
|  | 4126 | void GL_APIENTRY glReleaseShaderCompiler(void) | 
|  | 4127 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4128 | TRACE("()"); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4129 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4130 | es2::Shader::releaseCompiler(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4131 | } | 
|  | 4132 |  | 
|  | 4133 | void GL_APIENTRY glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) | 
|  | 4134 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4135 | TRACE("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)", | 
|  | 4136 | target, samples, internalformat, width, height); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4137 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4138 | switch(target) | 
|  | 4139 | { | 
|  | 4140 | case GL_RENDERBUFFER: | 
|  | 4141 | break; | 
|  | 4142 | default: | 
|  | 4143 | return error(GL_INVALID_ENUM); | 
|  | 4144 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4145 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4146 | if(!es2::IsColorRenderable(internalformat) && !es2::IsDepthRenderable(internalformat) && !es2::IsStencilRenderable(internalformat)) | 
|  | 4147 | { | 
|  | 4148 | return error(GL_INVALID_ENUM); | 
|  | 4149 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4150 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4151 | if(width < 0 || height < 0 || samples < 0) | 
|  | 4152 | { | 
|  | 4153 | return error(GL_INVALID_VALUE); | 
|  | 4154 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4155 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4156 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4157 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4158 | if(context) | 
|  | 4159 | { | 
|  | 4160 | if(width > es2::IMPLEMENTATION_MAX_RENDERBUFFER_SIZE || | 
|  | 4161 | height > es2::IMPLEMENTATION_MAX_RENDERBUFFER_SIZE || | 
|  | 4162 | samples > es2::IMPLEMENTATION_MAX_SAMPLES) | 
|  | 4163 | { | 
|  | 4164 | return error(GL_INVALID_VALUE); | 
|  | 4165 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4166 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 4167 | GLuint handle = context->getRenderbufferName(); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4168 | if(handle == 0) | 
|  | 4169 | { | 
|  | 4170 | return error(GL_INVALID_OPERATION); | 
|  | 4171 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4172 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4173 | switch(internalformat) | 
|  | 4174 | { | 
|  | 4175 | case GL_DEPTH_COMPONENT16: | 
|  | 4176 | context->setRenderbufferStorage(new es2::Depthbuffer(width, height, samples)); | 
|  | 4177 | break; | 
|  | 4178 | case GL_RGBA4: | 
|  | 4179 | case GL_RGB5_A1: | 
|  | 4180 | case GL_RGB565: | 
|  | 4181 | case GL_RGB8_OES: | 
|  | 4182 | case GL_RGBA8_OES: | 
|  | 4183 | context->setRenderbufferStorage(new es2::Colorbuffer(width, height, internalformat, samples)); | 
|  | 4184 | break; | 
|  | 4185 | case GL_STENCIL_INDEX8: | 
|  | 4186 | context->setRenderbufferStorage(new es2::Stencilbuffer(width, height, samples)); | 
|  | 4187 | break; | 
|  | 4188 | case GL_DEPTH24_STENCIL8_OES: | 
|  | 4189 | context->setRenderbufferStorage(new es2::DepthStencilbuffer(width, height, samples)); | 
|  | 4190 | break; | 
|  | 4191 | default: | 
|  | 4192 | return error(GL_INVALID_ENUM); | 
|  | 4193 | } | 
|  | 4194 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4195 | } | 
|  | 4196 |  | 
|  | 4197 | void GL_APIENTRY glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) | 
|  | 4198 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4199 | glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4200 | } | 
|  | 4201 |  | 
|  | 4202 | void GL_APIENTRY glSampleCoverage(GLclampf value, GLboolean invert) | 
|  | 4203 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4204 | TRACE("(GLclampf value = %f, GLboolean invert = %d)", value, invert); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4205 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4206 | es2::Context* context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4207 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4208 | if(context) | 
|  | 4209 | { | 
|  | 4210 | context->setSampleCoverageParams(es2::clamp01(value), invert == GL_TRUE); | 
|  | 4211 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4212 | } | 
|  | 4213 |  | 
|  | 4214 | void GL_APIENTRY glSetFenceNV(GLuint fence, GLenum condition) | 
|  | 4215 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4216 | TRACE("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4217 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4218 | if(condition != GL_ALL_COMPLETED_NV) | 
|  | 4219 | { | 
|  | 4220 | return error(GL_INVALID_ENUM); | 
|  | 4221 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4222 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4223 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4224 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4225 | if(context) | 
|  | 4226 | { | 
|  | 4227 | es2::Fence *fenceObject = context->getFence(fence); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4228 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4229 | if(fenceObject == NULL) | 
|  | 4230 | { | 
|  | 4231 | return error(GL_INVALID_OPERATION); | 
|  | 4232 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4233 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4234 | fenceObject->setFence(condition); | 
|  | 4235 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4236 | } | 
|  | 4237 |  | 
|  | 4238 | void GL_APIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height) | 
|  | 4239 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4240 | TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4241 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4242 | if(width < 0 || height < 0) | 
|  | 4243 | { | 
|  | 4244 | return error(GL_INVALID_VALUE); | 
|  | 4245 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4246 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4247 | es2::Context* context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4248 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4249 | if(context) | 
|  | 4250 | { | 
|  | 4251 | context->setScissorParams(x, y, width, height); | 
|  | 4252 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4253 | } | 
|  | 4254 |  | 
|  | 4255 | void GL_APIENTRY glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length) | 
|  | 4256 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4257 | TRACE("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, " | 
|  | 4258 | "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)", | 
|  | 4259 | n, shaders, binaryformat, binary, length); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4260 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4261 | // No binary shader formats are supported. | 
|  | 4262 | return error(GL_INVALID_ENUM); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4263 | } | 
|  | 4264 |  | 
| Nicolas Capens | b0e9355 | 2014-10-28 11:54:43 -0400 | [diff] [blame] | 4265 | void GL_APIENTRY glShaderSource(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length) | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4266 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4267 | TRACE("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = 0x%0.8p, const GLint* length = 0x%0.8p)", | 
|  | 4268 | shader, count, string, length); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4269 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4270 | if(count < 0) | 
|  | 4271 | { | 
|  | 4272 | return error(GL_INVALID_VALUE); | 
|  | 4273 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4274 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4275 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4276 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4277 | if(context) | 
|  | 4278 | { | 
|  | 4279 | es2::Shader *shaderObject = context->getShader(shader); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4280 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4281 | if(!shaderObject) | 
|  | 4282 | { | 
|  | 4283 | if(context->getProgram(shader)) | 
|  | 4284 | { | 
|  | 4285 | return error(GL_INVALID_OPERATION); | 
|  | 4286 | } | 
|  | 4287 | else | 
|  | 4288 | { | 
|  | 4289 | return error(GL_INVALID_VALUE); | 
|  | 4290 | } | 
|  | 4291 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4292 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4293 | shaderObject->setSource(count, string, length); | 
|  | 4294 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4295 | } | 
|  | 4296 |  | 
|  | 4297 | void GL_APIENTRY glStencilFunc(GLenum func, GLint ref, GLuint mask) | 
|  | 4298 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4299 | glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4300 | } | 
|  | 4301 |  | 
|  | 4302 | void GL_APIENTRY glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) | 
|  | 4303 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4304 | TRACE("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4305 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4306 | switch(face) | 
|  | 4307 | { | 
|  | 4308 | case GL_FRONT: | 
|  | 4309 | case GL_BACK: | 
|  | 4310 | case GL_FRONT_AND_BACK: | 
|  | 4311 | break; | 
|  | 4312 | default: | 
|  | 4313 | return error(GL_INVALID_ENUM); | 
|  | 4314 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4315 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4316 | switch(func) | 
|  | 4317 | { | 
|  | 4318 | case GL_NEVER: | 
|  | 4319 | case GL_ALWAYS: | 
|  | 4320 | case GL_LESS: | 
|  | 4321 | case GL_LEQUAL: | 
|  | 4322 | case GL_EQUAL: | 
|  | 4323 | case GL_GEQUAL: | 
|  | 4324 | case GL_GREATER: | 
|  | 4325 | case GL_NOTEQUAL: | 
|  | 4326 | break; | 
|  | 4327 | default: | 
|  | 4328 | return error(GL_INVALID_ENUM); | 
|  | 4329 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4330 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4331 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4332 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4333 | if(context) | 
|  | 4334 | { | 
|  | 4335 | if(face == GL_FRONT || face == GL_FRONT_AND_BACK) | 
|  | 4336 | { | 
|  | 4337 | context->setStencilParams(func, ref, mask); | 
|  | 4338 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4339 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4340 | if(face == GL_BACK || face == GL_FRONT_AND_BACK) | 
|  | 4341 | { | 
|  | 4342 | context->setStencilBackParams(func, ref, mask); | 
|  | 4343 | } | 
|  | 4344 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4345 | } | 
|  | 4346 |  | 
|  | 4347 | void GL_APIENTRY glStencilMask(GLuint mask) | 
|  | 4348 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4349 | glStencilMaskSeparate(GL_FRONT_AND_BACK, mask); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4350 | } | 
|  | 4351 |  | 
|  | 4352 | void GL_APIENTRY glStencilMaskSeparate(GLenum face, GLuint mask) | 
|  | 4353 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4354 | TRACE("(GLenum face = 0x%X, GLuint mask = %d)", face, mask); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4355 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4356 | switch(face) | 
|  | 4357 | { | 
|  | 4358 | case GL_FRONT: | 
|  | 4359 | case GL_BACK: | 
|  | 4360 | case GL_FRONT_AND_BACK: | 
|  | 4361 | break; | 
|  | 4362 | default: | 
|  | 4363 | return error(GL_INVALID_ENUM); | 
|  | 4364 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4365 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4366 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4367 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4368 | if(context) | 
|  | 4369 | { | 
|  | 4370 | if(face == GL_FRONT || face == GL_FRONT_AND_BACK) | 
|  | 4371 | { | 
|  | 4372 | context->setStencilWritemask(mask); | 
|  | 4373 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4374 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4375 | if(face == GL_BACK || face == GL_FRONT_AND_BACK) | 
|  | 4376 | { | 
|  | 4377 | context->setStencilBackWritemask(mask); | 
|  | 4378 | } | 
|  | 4379 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4380 | } | 
|  | 4381 |  | 
|  | 4382 | void GL_APIENTRY glStencilOp(GLenum fail, GLenum zfail, GLenum zpass) | 
|  | 4383 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4384 | glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4385 | } | 
|  | 4386 |  | 
|  | 4387 | void GL_APIENTRY glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass) | 
|  | 4388 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4389 | TRACE("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)", | 
|  | 4390 | face, fail, zfail, zpass); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4391 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4392 | switch(face) | 
|  | 4393 | { | 
|  | 4394 | case GL_FRONT: | 
|  | 4395 | case GL_BACK: | 
|  | 4396 | case GL_FRONT_AND_BACK: | 
|  | 4397 | break; | 
|  | 4398 | default: | 
|  | 4399 | return error(GL_INVALID_ENUM); | 
|  | 4400 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4401 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4402 | switch(fail) | 
|  | 4403 | { | 
|  | 4404 | case GL_ZERO: | 
|  | 4405 | case GL_KEEP: | 
|  | 4406 | case GL_REPLACE: | 
|  | 4407 | case GL_INCR: | 
|  | 4408 | case GL_DECR: | 
|  | 4409 | case GL_INVERT: | 
|  | 4410 | case GL_INCR_WRAP: | 
|  | 4411 | case GL_DECR_WRAP: | 
|  | 4412 | break; | 
|  | 4413 | default: | 
|  | 4414 | return error(GL_INVALID_ENUM); | 
|  | 4415 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4416 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4417 | switch(zfail) | 
|  | 4418 | { | 
|  | 4419 | case GL_ZERO: | 
|  | 4420 | case GL_KEEP: | 
|  | 4421 | case GL_REPLACE: | 
|  | 4422 | case GL_INCR: | 
|  | 4423 | case GL_DECR: | 
|  | 4424 | case GL_INVERT: | 
|  | 4425 | case GL_INCR_WRAP: | 
|  | 4426 | case GL_DECR_WRAP: | 
|  | 4427 | break; | 
|  | 4428 | default: | 
|  | 4429 | return error(GL_INVALID_ENUM); | 
|  | 4430 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4431 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4432 | switch(zpass) | 
|  | 4433 | { | 
|  | 4434 | case GL_ZERO: | 
|  | 4435 | case GL_KEEP: | 
|  | 4436 | case GL_REPLACE: | 
|  | 4437 | case GL_INCR: | 
|  | 4438 | case GL_DECR: | 
|  | 4439 | case GL_INVERT: | 
|  | 4440 | case GL_INCR_WRAP: | 
|  | 4441 | case GL_DECR_WRAP: | 
|  | 4442 | break; | 
|  | 4443 | default: | 
|  | 4444 | return error(GL_INVALID_ENUM); | 
|  | 4445 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4446 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4447 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4448 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4449 | if(context) | 
|  | 4450 | { | 
|  | 4451 | if(face == GL_FRONT || face == GL_FRONT_AND_BACK) | 
|  | 4452 | { | 
|  | 4453 | context->setStencilOperations(fail, zfail, zpass); | 
|  | 4454 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4455 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4456 | if(face == GL_BACK || face == GL_FRONT_AND_BACK) | 
|  | 4457 | { | 
|  | 4458 | context->setStencilBackOperations(fail, zfail, zpass); | 
|  | 4459 | } | 
|  | 4460 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4461 | } | 
|  | 4462 |  | 
|  | 4463 | GLboolean GL_APIENTRY glTestFenceNV(GLuint fence) | 
|  | 4464 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4465 | TRACE("(GLuint fence = %d)", fence); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4466 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4467 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4468 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4469 | if(context) | 
|  | 4470 | { | 
|  | 4471 | es2::Fence *fenceObject = context->getFence(fence); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4472 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4473 | if(fenceObject == NULL) | 
|  | 4474 | { | 
|  | 4475 | return error(GL_INVALID_OPERATION, GL_TRUE); | 
|  | 4476 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4477 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4478 | return fenceObject->testFence(); | 
|  | 4479 | } | 
| Nicolas Capens | 08e90f0 | 2014-11-21 12:49:12 -0500 | [diff] [blame] | 4480 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4481 | return GL_TRUE; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4482 | } | 
|  | 4483 |  | 
|  | 4484 | void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, | 
|  | 4485 | GLint border, GLenum format, GLenum type, const GLvoid* pixels) | 
|  | 4486 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4487 | TRACE("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, " | 
|  | 4488 | "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels =  0x%0.8p)", | 
|  | 4489 | target, level, internalformat, width, height, border, format, type, pixels); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4490 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4491 | if(!validImageSize(level, width, height)) | 
|  | 4492 | { | 
|  | 4493 | return error(GL_INVALID_VALUE); | 
|  | 4494 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 4495 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 4496 | es2::Context *context = es2::getContext(); | 
|  | 4497 |  | 
|  | 4498 | if(context) | 
|  | 4499 | { | 
| Nicolas Capens | b97ad2e | 2015-02-11 17:40:30 -0500 | [diff] [blame] | 4500 | if(context->getClientVersion() < 3) | 
|  | 4501 | { | 
|  | 4502 | if(internalformat != format) | 
|  | 4503 | { | 
|  | 4504 | return error(GL_INVALID_OPERATION); | 
|  | 4505 | } | 
|  | 4506 | } | 
|  | 4507 |  | 
|  | 4508 | switch(format) | 
|  | 4509 | { | 
|  | 4510 | case GL_ALPHA: | 
|  | 4511 | case GL_LUMINANCE: | 
|  | 4512 | case GL_LUMINANCE_ALPHA: | 
|  | 4513 | switch(type) | 
|  | 4514 | { | 
|  | 4515 | case GL_UNSIGNED_BYTE: | 
|  | 4516 | case GL_FLOAT: | 
|  | 4517 | case GL_HALF_FLOAT_OES: | 
|  | 4518 | break; | 
|  | 4519 | default: | 
|  | 4520 | return error(GL_INVALID_ENUM); | 
|  | 4521 | } | 
|  | 4522 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 4523 | case GL_RED: | 
|  | 4524 | switch(internalformat) | 
| Nicolas Capens | b97ad2e | 2015-02-11 17:40:30 -0500 | [diff] [blame] | 4525 | { | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 4526 | case GL_R8: | 
|  | 4527 | switch(type) | 
|  | 4528 | { | 
|  | 4529 | case GL_UNSIGNED_BYTE: | 
|  | 4530 | break; | 
|  | 4531 | default: | 
|  | 4532 | return error(GL_INVALID_ENUM); | 
|  | 4533 | } | 
|  | 4534 | break; | 
|  | 4535 | case GL_R8_SNORM: | 
|  | 4536 | switch(type) | 
|  | 4537 | { | 
|  | 4538 | case GL_BYTE: | 
|  | 4539 | break; | 
|  | 4540 | default: | 
|  | 4541 | return error(GL_INVALID_ENUM); | 
|  | 4542 | } | 
|  | 4543 | break; | 
|  | 4544 | case GL_R16F: | 
|  | 4545 | switch(type) | 
|  | 4546 | { | 
|  | 4547 | case GL_FLOAT: | 
|  | 4548 | case GL_HALF_FLOAT: | 
|  | 4549 | break; | 
|  | 4550 | default: | 
|  | 4551 | return error(GL_INVALID_ENUM); | 
|  | 4552 | } | 
|  | 4553 | break; | 
|  | 4554 | case GL_R32F: | 
|  | 4555 | switch(type) | 
|  | 4556 | { | 
|  | 4557 | case GL_FLOAT: | 
|  | 4558 | break; | 
|  | 4559 | default: | 
|  | 4560 | return error(GL_INVALID_ENUM); | 
|  | 4561 | } | 
| Nicolas Capens | b97ad2e | 2015-02-11 17:40:30 -0500 | [diff] [blame] | 4562 | break; | 
|  | 4563 | default: | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 4564 | return error(GL_INVALID_VALUE); | 
|  | 4565 | } | 
|  | 4566 | break; | 
|  | 4567 | case GL_RED_INTEGER: | 
|  | 4568 | switch(internalformat) | 
|  | 4569 | { | 
|  | 4570 | case GL_R8UI: | 
|  | 4571 | switch(type) | 
|  | 4572 | { | 
|  | 4573 | case GL_UNSIGNED_BYTE: | 
|  | 4574 | break; | 
|  | 4575 | default: | 
|  | 4576 | return error(GL_INVALID_ENUM); | 
|  | 4577 | } | 
|  | 4578 | break; | 
|  | 4579 | case GL_R8I: | 
|  | 4580 | switch(type) | 
|  | 4581 | { | 
|  | 4582 | case GL_BYTE: | 
|  | 4583 | break; | 
|  | 4584 | default: | 
|  | 4585 | return error(GL_INVALID_ENUM); | 
|  | 4586 | } | 
|  | 4587 | break; | 
|  | 4588 | case GL_R16UI: | 
|  | 4589 | switch(type) | 
|  | 4590 | { | 
|  | 4591 | case GL_UNSIGNED_SHORT: | 
|  | 4592 | break; | 
|  | 4593 | default: | 
|  | 4594 | return error(GL_INVALID_ENUM); | 
|  | 4595 | } | 
|  | 4596 | break; | 
|  | 4597 | case GL_R16I: | 
|  | 4598 | switch(type) | 
|  | 4599 | { | 
|  | 4600 | case GL_SHORT: | 
|  | 4601 | break; | 
|  | 4602 | default: | 
|  | 4603 | return error(GL_INVALID_ENUM); | 
|  | 4604 | } | 
|  | 4605 | break; | 
|  | 4606 | case GL_R32UI: | 
|  | 4607 | switch(type) | 
|  | 4608 | { | 
|  | 4609 | case GL_UNSIGNED_INT: | 
|  | 4610 | break; | 
|  | 4611 | default: | 
|  | 4612 | return error(GL_INVALID_ENUM); | 
|  | 4613 | } | 
|  | 4614 | break; | 
|  | 4615 | case GL_R32I: | 
|  | 4616 | switch(type) | 
|  | 4617 | { | 
|  | 4618 | case GL_INT: | 
|  | 4619 | break; | 
|  | 4620 | default: | 
|  | 4621 | return error(GL_INVALID_ENUM); | 
|  | 4622 | } | 
|  | 4623 | break; | 
|  | 4624 | default: | 
|  | 4625 | return error(GL_INVALID_VALUE); | 
|  | 4626 | } | 
|  | 4627 | break; | 
|  | 4628 | case GL_RG_INTEGER: | 
|  | 4629 | switch(internalformat) | 
|  | 4630 | { | 
|  | 4631 | case GL_RG8UI: | 
|  | 4632 | switch(type) | 
|  | 4633 | { | 
|  | 4634 | case GL_UNSIGNED_BYTE: | 
|  | 4635 | break; | 
|  | 4636 | default: | 
|  | 4637 | return error(GL_INVALID_ENUM); | 
|  | 4638 | } | 
|  | 4639 | break; | 
|  | 4640 | case GL_RG8I: | 
|  | 4641 | switch(type) | 
|  | 4642 | { | 
|  | 4643 | case GL_BYTE: | 
|  | 4644 | break; | 
|  | 4645 | default: | 
|  | 4646 | return error(GL_INVALID_ENUM); | 
|  | 4647 | } | 
|  | 4648 | break; | 
|  | 4649 | case GL_RG16UI: | 
|  | 4650 | switch(type) | 
|  | 4651 | { | 
|  | 4652 | case GL_UNSIGNED_SHORT: | 
|  | 4653 | break; | 
|  | 4654 | default: | 
|  | 4655 | return error(GL_INVALID_ENUM); | 
|  | 4656 | } | 
|  | 4657 | break; | 
|  | 4658 | case GL_RG16I: | 
|  | 4659 | switch(type) | 
|  | 4660 | { | 
|  | 4661 | case GL_SHORT: | 
|  | 4662 | break; | 
|  | 4663 | default: | 
|  | 4664 | return error(GL_INVALID_ENUM); | 
|  | 4665 | } | 
|  | 4666 | break; | 
|  | 4667 | case GL_RG32UI: | 
|  | 4668 | switch(type) | 
|  | 4669 | { | 
|  | 4670 | case GL_UNSIGNED_INT: | 
|  | 4671 | break; | 
|  | 4672 | default: | 
|  | 4673 | return error(GL_INVALID_ENUM); | 
|  | 4674 | } | 
|  | 4675 | break; | 
|  | 4676 | case GL_RG32I: | 
|  | 4677 | switch(type) | 
|  | 4678 | { | 
|  | 4679 | case GL_INT: | 
|  | 4680 | break; | 
|  | 4681 | default: | 
|  | 4682 | return error(GL_INVALID_ENUM); | 
|  | 4683 | } | 
|  | 4684 | break; | 
|  | 4685 | default: | 
|  | 4686 | return error(GL_INVALID_VALUE); | 
|  | 4687 | } | 
|  | 4688 | break; | 
|  | 4689 | case GL_RGB_INTEGER: | 
|  | 4690 | switch(internalformat) | 
|  | 4691 | { | 
|  | 4692 | case GL_RGB8UI: | 
|  | 4693 | switch(type) | 
|  | 4694 | { | 
|  | 4695 | case GL_UNSIGNED_BYTE: | 
|  | 4696 | break; | 
|  | 4697 | default: | 
|  | 4698 | return error(GL_INVALID_ENUM); | 
|  | 4699 | } | 
|  | 4700 | break; | 
|  | 4701 | case GL_RGB8I: | 
|  | 4702 | switch(type) | 
|  | 4703 | { | 
|  | 4704 | case GL_BYTE: | 
|  | 4705 | break; | 
|  | 4706 | default: | 
|  | 4707 | return error(GL_INVALID_ENUM); | 
|  | 4708 | } | 
|  | 4709 | break; | 
|  | 4710 | case GL_RGB16UI: | 
|  | 4711 | switch(type) | 
|  | 4712 | { | 
|  | 4713 | case GL_UNSIGNED_SHORT: | 
|  | 4714 | break; | 
|  | 4715 | default: | 
|  | 4716 | return error(GL_INVALID_ENUM); | 
|  | 4717 | } | 
|  | 4718 | break; | 
|  | 4719 | case GL_RGB16I: | 
|  | 4720 | switch(type) | 
|  | 4721 | { | 
|  | 4722 | case GL_SHORT: | 
|  | 4723 | break; | 
|  | 4724 | default: | 
|  | 4725 | return error(GL_INVALID_ENUM); | 
|  | 4726 | } | 
|  | 4727 | break; | 
|  | 4728 | case GL_RGB32UI: | 
|  | 4729 | switch(type) | 
|  | 4730 | { | 
|  | 4731 | case GL_UNSIGNED_INT: | 
|  | 4732 | break; | 
|  | 4733 | default: | 
|  | 4734 | return error(GL_INVALID_ENUM); | 
|  | 4735 | } | 
|  | 4736 | break; | 
|  | 4737 | case GL_RGB32I: | 
|  | 4738 | switch(type) | 
|  | 4739 | { | 
|  | 4740 | case GL_INT: | 
|  | 4741 | break; | 
|  | 4742 | default: | 
|  | 4743 | return error(GL_INVALID_ENUM); | 
|  | 4744 | } | 
|  | 4745 | break; | 
|  | 4746 | default: | 
|  | 4747 | return error(GL_INVALID_VALUE); | 
|  | 4748 | } | 
|  | 4749 | break; | 
|  | 4750 | case GL_RGBA_INTEGER: | 
|  | 4751 | switch(internalformat) | 
|  | 4752 | { | 
|  | 4753 | case GL_RGBA8UI: | 
|  | 4754 | switch(type) | 
|  | 4755 | { | 
|  | 4756 | case GL_UNSIGNED_BYTE: | 
|  | 4757 | break; | 
|  | 4758 | default: | 
|  | 4759 | return error(GL_INVALID_ENUM); | 
|  | 4760 | } | 
|  | 4761 | break; | 
|  | 4762 | case GL_RGBA8I: | 
|  | 4763 | switch(type) | 
|  | 4764 | { | 
|  | 4765 | case GL_BYTE: | 
|  | 4766 | break; | 
|  | 4767 | default: | 
|  | 4768 | return error(GL_INVALID_ENUM); | 
|  | 4769 | } | 
|  | 4770 | break; | 
|  | 4771 | case GL_RGB10_A2UI: | 
|  | 4772 | switch(type) | 
|  | 4773 | { | 
|  | 4774 | case GL_UNSIGNED_INT_2_10_10_10_REV: | 
|  | 4775 | break; | 
|  | 4776 | default: | 
|  | 4777 | return error(GL_INVALID_ENUM); | 
|  | 4778 | } | 
|  | 4779 | break; | 
|  | 4780 | case GL_RGBA16UI: | 
|  | 4781 | switch(type) | 
|  | 4782 | { | 
|  | 4783 | case GL_UNSIGNED_SHORT: | 
|  | 4784 | break; | 
|  | 4785 | default: | 
|  | 4786 | return error(GL_INVALID_ENUM); | 
|  | 4787 | } | 
|  | 4788 | break; | 
|  | 4789 | case GL_RGBA16I: | 
|  | 4790 | switch(type) | 
|  | 4791 | { | 
|  | 4792 | case GL_SHORT: | 
|  | 4793 | break; | 
|  | 4794 | default: | 
|  | 4795 | return error(GL_INVALID_ENUM); | 
|  | 4796 | } | 
|  | 4797 | break; | 
|  | 4798 | case GL_RGBA32UI: | 
|  | 4799 | switch(type) | 
|  | 4800 | { | 
|  | 4801 | case GL_INT: | 
|  | 4802 | break; | 
|  | 4803 | default: | 
|  | 4804 | return error(GL_INVALID_ENUM); | 
|  | 4805 | } | 
|  | 4806 | break; | 
|  | 4807 | case GL_RGBA32I: | 
|  | 4808 | switch(type) | 
|  | 4809 | { | 
|  | 4810 | case GL_UNSIGNED_INT: | 
|  | 4811 | break; | 
|  | 4812 | default: | 
|  | 4813 | return error(GL_INVALID_ENUM); | 
|  | 4814 | } | 
|  | 4815 | break; | 
|  | 4816 | default: | 
|  | 4817 | return error(GL_INVALID_VALUE); | 
|  | 4818 | } | 
|  | 4819 | break; | 
|  | 4820 | case GL_RG: | 
|  | 4821 | switch(internalformat) | 
|  | 4822 | { | 
|  | 4823 | case GL_RG8: | 
|  | 4824 | switch(type) | 
|  | 4825 | { | 
|  | 4826 | case GL_UNSIGNED_BYTE: | 
|  | 4827 | break; | 
|  | 4828 | default: | 
|  | 4829 | return error(GL_INVALID_ENUM); | 
|  | 4830 | } | 
|  | 4831 | break; | 
|  | 4832 | case GL_RG8_SNORM: | 
|  | 4833 | switch(type) | 
|  | 4834 | { | 
|  | 4835 | case GL_BYTE: | 
|  | 4836 | break; | 
|  | 4837 | default: | 
|  | 4838 | return error(GL_INVALID_ENUM); | 
|  | 4839 | } | 
|  | 4840 | break; | 
|  | 4841 | case GL_RG16F: | 
|  | 4842 | switch(type) | 
|  | 4843 | { | 
|  | 4844 | case GL_FLOAT: | 
|  | 4845 | case GL_HALF_FLOAT: | 
|  | 4846 | break; | 
|  | 4847 | default: | 
|  | 4848 | return error(GL_INVALID_ENUM); | 
|  | 4849 | } | 
|  | 4850 | break; | 
|  | 4851 | case GL_RG32F: | 
|  | 4852 | switch(type) | 
|  | 4853 | { | 
|  | 4854 | case GL_FLOAT: | 
|  | 4855 | break; | 
|  | 4856 | default: | 
|  | 4857 | return error(GL_INVALID_ENUM); | 
|  | 4858 | } | 
|  | 4859 | break; | 
|  | 4860 | default: | 
|  | 4861 | return error(GL_INVALID_VALUE); | 
|  | 4862 | } | 
|  | 4863 | break; | 
|  | 4864 | case GL_RGB: | 
|  | 4865 | switch(internalformat) | 
|  | 4866 | { | 
|  | 4867 | case GL_RGB: | 
|  | 4868 | switch(type) | 
|  | 4869 | { | 
|  | 4870 | case GL_UNSIGNED_BYTE: | 
|  | 4871 | case GL_UNSIGNED_SHORT_5_6_5: | 
|  | 4872 | case GL_FLOAT: | 
|  | 4873 | case GL_HALF_FLOAT_OES: | 
|  | 4874 | break; | 
|  | 4875 | default: | 
|  | 4876 | return error(GL_INVALID_ENUM); | 
|  | 4877 | } | 
|  | 4878 | break; | 
|  | 4879 | case GL_RGB8: | 
|  | 4880 | switch(type) | 
|  | 4881 | { | 
|  | 4882 | case GL_UNSIGNED_BYTE: | 
|  | 4883 | break; | 
|  | 4884 | default: | 
|  | 4885 | return error(GL_INVALID_ENUM); | 
|  | 4886 | } | 
|  | 4887 | break; | 
|  | 4888 | case GL_SRGB8: | 
|  | 4889 | switch(type) | 
|  | 4890 | { | 
|  | 4891 | case GL_UNSIGNED_BYTE: | 
|  | 4892 | break; | 
|  | 4893 | default: | 
|  | 4894 | return error(GL_INVALID_ENUM); | 
|  | 4895 | } | 
|  | 4896 | break; | 
|  | 4897 | case GL_RGB565: | 
|  | 4898 | switch(type) | 
|  | 4899 | { | 
|  | 4900 | case GL_UNSIGNED_BYTE: | 
|  | 4901 | case GL_UNSIGNED_SHORT_5_6_5: | 
|  | 4902 | break; | 
|  | 4903 | default: | 
|  | 4904 | return error(GL_INVALID_ENUM); | 
|  | 4905 | } | 
|  | 4906 | break; | 
|  | 4907 | case GL_RGB8_SNORM: | 
|  | 4908 | switch(type) | 
|  | 4909 | { | 
|  | 4910 | case GL_BYTE: | 
|  | 4911 | break; | 
|  | 4912 | default: | 
|  | 4913 | return error(GL_INVALID_ENUM); | 
|  | 4914 | } | 
|  | 4915 | break; | 
|  | 4916 | case GL_R11F_G11F_B10F: | 
|  | 4917 | switch(type) | 
|  | 4918 | { | 
|  | 4919 | case GL_UNSIGNED_INT_10F_11F_11F_REV: | 
|  | 4920 | case GL_FLOAT: | 
|  | 4921 | case GL_HALF_FLOAT: | 
|  | 4922 | break; | 
|  | 4923 | default: | 
|  | 4924 | return error(GL_INVALID_ENUM); | 
|  | 4925 | } | 
|  | 4926 | break; | 
|  | 4927 | case GL_RGB9_E5: | 
|  | 4928 | switch(type) | 
|  | 4929 | { | 
|  | 4930 | case GL_UNSIGNED_INT_5_9_9_9_REV: | 
|  | 4931 | case GL_FLOAT: | 
|  | 4932 | case GL_HALF_FLOAT: | 
|  | 4933 | break; | 
|  | 4934 | default: | 
|  | 4935 | return error(GL_INVALID_ENUM); | 
|  | 4936 | } | 
|  | 4937 | break; | 
|  | 4938 | case GL_RGB16F: | 
|  | 4939 | switch(type) | 
|  | 4940 | { | 
|  | 4941 | case GL_FLOAT: | 
|  | 4942 | case GL_HALF_FLOAT: | 
|  | 4943 | break; | 
|  | 4944 | default: | 
|  | 4945 | return error(GL_INVALID_ENUM); | 
|  | 4946 | } | 
|  | 4947 | break; | 
|  | 4948 | case GL_RGB32F: | 
|  | 4949 | switch(type) | 
|  | 4950 | { | 
|  | 4951 | case GL_FLOAT: | 
|  | 4952 | break; | 
|  | 4953 | default: | 
|  | 4954 | return error(GL_INVALID_ENUM); | 
|  | 4955 | } | 
|  | 4956 | break; | 
|  | 4957 | default: | 
|  | 4958 | return error(GL_INVALID_VALUE); | 
| Nicolas Capens | b97ad2e | 2015-02-11 17:40:30 -0500 | [diff] [blame] | 4959 | } | 
|  | 4960 | break; | 
|  | 4961 | case GL_RGBA: | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 4962 | switch(internalformat) | 
| Nicolas Capens | b97ad2e | 2015-02-11 17:40:30 -0500 | [diff] [blame] | 4963 | { | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 4964 | case GL_RGBA: | 
|  | 4965 | switch(type) | 
|  | 4966 | { | 
|  | 4967 | case GL_UNSIGNED_BYTE: | 
|  | 4968 | case GL_UNSIGNED_SHORT_4_4_4_4: | 
|  | 4969 | case GL_UNSIGNED_SHORT_5_5_5_1: | 
|  | 4970 | case GL_FLOAT: | 
|  | 4971 | case GL_HALF_FLOAT_OES: | 
|  | 4972 | break; | 
|  | 4973 | default: | 
|  | 4974 | return error(GL_INVALID_ENUM); | 
|  | 4975 | } | 
|  | 4976 | break; | 
|  | 4977 | case GL_RGBA8: | 
|  | 4978 | switch(type) | 
|  | 4979 | { | 
|  | 4980 | case GL_UNSIGNED_BYTE: | 
|  | 4981 | break; | 
|  | 4982 | default: | 
|  | 4983 | return error(GL_INVALID_ENUM); | 
|  | 4984 | } | 
|  | 4985 | break; | 
|  | 4986 | case GL_SRGB8_ALPHA8: | 
|  | 4987 | switch(type) | 
|  | 4988 | { | 
|  | 4989 | case GL_UNSIGNED_BYTE: | 
|  | 4990 | break; | 
|  | 4991 | default: | 
|  | 4992 | return error(GL_INVALID_ENUM); | 
|  | 4993 | } | 
|  | 4994 | break; | 
|  | 4995 | case GL_RGB5_A1: | 
|  | 4996 | switch(type) | 
|  | 4997 | { | 
|  | 4998 | case GL_UNSIGNED_BYTE: | 
|  | 4999 | case GL_UNSIGNED_SHORT_5_5_5_1: | 
|  | 5000 | case GL_UNSIGNED_INT_2_10_10_10_REV: | 
|  | 5001 | break; | 
|  | 5002 | default: | 
|  | 5003 | return error(GL_INVALID_ENUM); | 
|  | 5004 | } | 
|  | 5005 | break; | 
|  | 5006 | case GL_RGBA8_SNORM: | 
|  | 5007 | switch(type) | 
|  | 5008 | { | 
|  | 5009 | case GL_BYTE: | 
|  | 5010 | break; | 
|  | 5011 | default: | 
|  | 5012 | return error(GL_INVALID_ENUM); | 
|  | 5013 | } | 
|  | 5014 | break; | 
|  | 5015 | case GL_RGBA4: | 
|  | 5016 | switch(type) | 
|  | 5017 | { | 
|  | 5018 | case GL_UNSIGNED_BYTE: | 
|  | 5019 | case GL_UNSIGNED_SHORT_4_4_4_4: | 
|  | 5020 | break; | 
|  | 5021 | default: | 
|  | 5022 | return error(GL_INVALID_ENUM); | 
|  | 5023 | } | 
|  | 5024 | break; | 
|  | 5025 | case GL_RGB10_A2: | 
|  | 5026 | switch(type) | 
|  | 5027 | { | 
|  | 5028 | case GL_UNSIGNED_INT_2_10_10_10_REV: | 
|  | 5029 | break; | 
|  | 5030 | default: | 
|  | 5031 | return error(GL_INVALID_ENUM); | 
|  | 5032 | } | 
|  | 5033 | break; | 
|  | 5034 | case GL_RGBA16F: | 
|  | 5035 | switch(type) | 
|  | 5036 | { | 
|  | 5037 | case GL_FLOAT: | 
|  | 5038 | case GL_HALF_FLOAT: | 
|  | 5039 | break; | 
|  | 5040 | default: | 
|  | 5041 | return error(GL_INVALID_ENUM); | 
|  | 5042 | } | 
|  | 5043 | break; | 
|  | 5044 | case GL_RGBA32F: | 
|  | 5045 | switch(type) | 
|  | 5046 | { | 
|  | 5047 | case GL_FLOAT: | 
|  | 5048 | break; | 
|  | 5049 | default: | 
|  | 5050 | return error(GL_INVALID_ENUM); | 
|  | 5051 | } | 
| Nicolas Capens | b97ad2e | 2015-02-11 17:40:30 -0500 | [diff] [blame] | 5052 | break; | 
|  | 5053 | default: | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 5054 | return error(GL_INVALID_VALUE); | 
| Nicolas Capens | b97ad2e | 2015-02-11 17:40:30 -0500 | [diff] [blame] | 5055 | } | 
|  | 5056 | break; | 
|  | 5057 | case GL_BGRA_EXT: | 
|  | 5058 | switch(type) | 
|  | 5059 | { | 
|  | 5060 | case GL_UNSIGNED_BYTE: | 
|  | 5061 | break; | 
|  | 5062 | default: | 
|  | 5063 | return error(GL_INVALID_ENUM); | 
|  | 5064 | } | 
|  | 5065 | break; | 
|  | 5066 | case GL_ETC1_RGB8_OES: | 
|  | 5067 | return error(GL_INVALID_OPERATION); | 
|  | 5068 | case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: | 
|  | 5069 | case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: | 
|  | 5070 | case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: | 
|  | 5071 | case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: | 
|  | 5072 | if(S3TC_SUPPORT) | 
|  | 5073 | { | 
|  | 5074 | return error(GL_INVALID_OPERATION); | 
|  | 5075 | } | 
|  | 5076 | else | 
|  | 5077 | { | 
|  | 5078 | return error(GL_INVALID_ENUM); | 
|  | 5079 | } | 
|  | 5080 | case GL_DEPTH_COMPONENT: | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 5081 | switch(internalformat) | 
| Nicolas Capens | b97ad2e | 2015-02-11 17:40:30 -0500 | [diff] [blame] | 5082 | { | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 5083 | case GL_DEPTH_COMPONENT: | 
|  | 5084 | case GL_DEPTH_COMPONENT16: | 
|  | 5085 | switch(type) | 
|  | 5086 | { | 
|  | 5087 | case GL_UNSIGNED_SHORT: | 
|  | 5088 | case GL_UNSIGNED_INT: | 
|  | 5089 | break; | 
|  | 5090 | default: | 
|  | 5091 | return error(GL_INVALID_ENUM); | 
|  | 5092 | } | 
|  | 5093 | break; | 
|  | 5094 | case GL_DEPTH_COMPONENT24: | 
|  | 5095 | switch(type) | 
|  | 5096 | { | 
|  | 5097 | case GL_UNSIGNED_INT: | 
|  | 5098 | break; | 
|  | 5099 | default: | 
|  | 5100 | return error(GL_INVALID_ENUM); | 
|  | 5101 | } | 
|  | 5102 | break; | 
|  | 5103 | case GL_DEPTH_COMPONENT32F: | 
|  | 5104 | switch(type) | 
|  | 5105 | { | 
|  | 5106 | case GL_UNSIGNED_INT: | 
|  | 5107 | break; | 
|  | 5108 | default: | 
|  | 5109 | return error(GL_INVALID_ENUM); | 
|  | 5110 | } | 
| Nicolas Capens | b97ad2e | 2015-02-11 17:40:30 -0500 | [diff] [blame] | 5111 | break; | 
|  | 5112 | default: | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 5113 | return error(GL_INVALID_VALUE); | 
| Nicolas Capens | b97ad2e | 2015-02-11 17:40:30 -0500 | [diff] [blame] | 5114 | } | 
|  | 5115 | break; | 
|  | 5116 | case GL_DEPTH_STENCIL_OES: | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 5117 | switch(internalformat) | 
| Nicolas Capens | b97ad2e | 2015-02-11 17:40:30 -0500 | [diff] [blame] | 5118 | { | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 5119 | case GL_DEPTH_STENCIL_OES: | 
|  | 5120 | case GL_DEPTH24_STENCIL8: | 
|  | 5121 | switch(type) | 
|  | 5122 | { | 
|  | 5123 | case GL_UNSIGNED_INT_24_8_OES: | 
|  | 5124 | break; | 
|  | 5125 | default: | 
|  | 5126 | return error(GL_INVALID_ENUM); | 
|  | 5127 | } | 
|  | 5128 | break; | 
|  | 5129 | case GL_DEPTH32F_STENCIL8: | 
|  | 5130 | switch(type) | 
|  | 5131 | { | 
|  | 5132 | case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: | 
|  | 5133 | break; | 
|  | 5134 | default: | 
|  | 5135 | return error(GL_INVALID_ENUM); | 
|  | 5136 | } | 
| Nicolas Capens | b97ad2e | 2015-02-11 17:40:30 -0500 | [diff] [blame] | 5137 | break; | 
|  | 5138 | default: | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 5139 | return error(GL_INVALID_VALUE); | 
| Nicolas Capens | b97ad2e | 2015-02-11 17:40:30 -0500 | [diff] [blame] | 5140 | } | 
|  | 5141 | break; | 
|  | 5142 | default: | 
|  | 5143 | return error(GL_INVALID_VALUE); | 
|  | 5144 | } | 
|  | 5145 |  | 
|  | 5146 | if(border != 0) | 
|  | 5147 | { | 
|  | 5148 | return error(GL_INVALID_VALUE); | 
|  | 5149 | } | 
|  | 5150 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5151 | switch(target) | 
|  | 5152 | { | 
| Nicolas Capens | 2265824 | 2014-11-29 00:31:41 -0500 | [diff] [blame] | 5153 | case GL_TEXTURE_2D: | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5154 | if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) || | 
|  | 5155 | height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level)) | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5156 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5157 | return error(GL_INVALID_VALUE); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5158 | } | 
|  | 5159 | break; | 
| Nicolas Capens | 2265824 | 2014-11-29 00:31:41 -0500 | [diff] [blame] | 5160 | case GL_TEXTURE_CUBE_MAP_POSITIVE_X: | 
|  | 5161 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: | 
|  | 5162 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: | 
|  | 5163 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: | 
|  | 5164 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: | 
|  | 5165 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5166 | if(width != height) | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5167 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5168 | return error(GL_INVALID_VALUE); | 
|  | 5169 | } | 
|  | 5170 |  | 
|  | 5171 | if(width > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) || | 
|  | 5172 | height > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level)) | 
|  | 5173 | { | 
|  | 5174 | return error(GL_INVALID_VALUE); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5175 | } | 
|  | 5176 | break; | 
| Nicolas Capens | 2265824 | 2014-11-29 00:31:41 -0500 | [diff] [blame] | 5177 | default: | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5178 | return error(GL_INVALID_ENUM); | 
|  | 5179 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5180 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5181 | if(target == GL_TEXTURE_2D) | 
|  | 5182 | { | 
|  | 5183 | es2::Texture2D *texture = context->getTexture2D(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5184 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5185 | if(!texture) | 
|  | 5186 | { | 
|  | 5187 | return error(GL_INVALID_OPERATION); | 
|  | 5188 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5189 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5190 | texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels); | 
|  | 5191 | } | 
|  | 5192 | else | 
|  | 5193 | { | 
|  | 5194 | es2::TextureCubeMap *texture = context->getTextureCubeMap(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5195 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5196 | if(!texture) | 
|  | 5197 | { | 
|  | 5198 | return error(GL_INVALID_OPERATION); | 
|  | 5199 | } | 
| Nicolas Capens | 08e90f0 | 2014-11-21 12:49:12 -0500 | [diff] [blame] | 5200 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5201 | texture->setImage(target, level, width, height, format, type, context->getUnpackAlignment(), pixels); | 
|  | 5202 | } | 
|  | 5203 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5204 | } | 
|  | 5205 |  | 
|  | 5206 | void GL_APIENTRY glTexParameterf(GLenum target, GLenum pname, GLfloat param) | 
|  | 5207 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5208 | TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat param = %f)", target, pname, param); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5209 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5210 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5211 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5212 | if(context) | 
|  | 5213 | { | 
|  | 5214 | es2::Texture *texture; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5215 |  | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 5216 | egl::GLint clientVersion = context->getClientVersion(); | 
|  | 5217 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5218 | switch(target) | 
|  | 5219 | { | 
|  | 5220 | case GL_TEXTURE_2D: | 
|  | 5221 | texture = context->getTexture2D(); | 
|  | 5222 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 5223 | case GL_TEXTURE_2D_ARRAY: | 
|  | 5224 | if(clientVersion < 3) | 
|  | 5225 | { | 
|  | 5226 | return error(GL_INVALID_ENUM); | 
|  | 5227 | } | 
|  | 5228 | else | 
|  | 5229 | { | 
|  | 5230 | UNIMPLEMENTED(); | 
|  | 5231 | texture = context->getTexture3D(); | 
|  | 5232 | break; | 
|  | 5233 | } | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 5234 | case GL_TEXTURE_3D_OES: | 
|  | 5235 | texture = context->getTexture3D(); | 
|  | 5236 | break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5237 | case GL_TEXTURE_CUBE_MAP: | 
|  | 5238 | texture = context->getTextureCubeMap(); | 
|  | 5239 | break; | 
|  | 5240 | case GL_TEXTURE_EXTERNAL_OES: | 
|  | 5241 | texture = context->getTextureExternal(); | 
|  | 5242 | break; | 
|  | 5243 | default: | 
|  | 5244 | return error(GL_INVALID_ENUM); | 
|  | 5245 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5246 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5247 | switch(pname) | 
|  | 5248 | { | 
|  | 5249 | case GL_TEXTURE_WRAP_S: | 
|  | 5250 | if(!texture->setWrapS((GLenum)param)) | 
|  | 5251 | { | 
|  | 5252 | return error(GL_INVALID_ENUM); | 
|  | 5253 | } | 
|  | 5254 | break; | 
|  | 5255 | case GL_TEXTURE_WRAP_T: | 
|  | 5256 | if(!texture->setWrapT((GLenum)param)) | 
|  | 5257 | { | 
|  | 5258 | return error(GL_INVALID_ENUM); | 
|  | 5259 | } | 
|  | 5260 | break; | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 5261 | case GL_TEXTURE_WRAP_R_OES: | 
|  | 5262 | if(!texture->setWrapR((GLenum)param)) | 
|  | 5263 | { | 
|  | 5264 | return error(GL_INVALID_ENUM); | 
|  | 5265 | } | 
|  | 5266 | break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5267 | case GL_TEXTURE_MIN_FILTER: | 
|  | 5268 | if(!texture->setMinFilter((GLenum)param)) | 
|  | 5269 | { | 
|  | 5270 | return error(GL_INVALID_ENUM); | 
|  | 5271 | } | 
|  | 5272 | break; | 
|  | 5273 | case GL_TEXTURE_MAG_FILTER: | 
|  | 5274 | if(!texture->setMagFilter((GLenum)param)) | 
|  | 5275 | { | 
|  | 5276 | return error(GL_INVALID_ENUM); | 
|  | 5277 | } | 
|  | 5278 | break; | 
|  | 5279 | case GL_TEXTURE_MAX_ANISOTROPY_EXT: | 
|  | 5280 | if(!texture->setMaxAnisotropy(param)) | 
|  | 5281 | { | 
|  | 5282 | return error(GL_INVALID_VALUE); | 
|  | 5283 | } | 
|  | 5284 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 5285 | case GL_TEXTURE_BASE_LEVEL: | 
|  | 5286 | if(clientVersion < 3 || !texture->setBaseLevel((GLint)param)) | 
|  | 5287 | { | 
|  | 5288 | return error(GL_INVALID_VALUE); | 
|  | 5289 | } | 
|  | 5290 | break; | 
|  | 5291 | case GL_TEXTURE_COMPARE_FUNC: | 
|  | 5292 | if(clientVersion < 3 || !texture->setCompareFunc((GLenum)param)) | 
|  | 5293 | { | 
|  | 5294 | return error(GL_INVALID_VALUE); | 
|  | 5295 | } | 
|  | 5296 | break; | 
|  | 5297 | case GL_TEXTURE_COMPARE_MODE: | 
|  | 5298 | if(clientVersion < 3 || !texture->setCompareMode((GLenum)param)) | 
|  | 5299 | { | 
|  | 5300 | return error(GL_INVALID_VALUE); | 
|  | 5301 | } | 
|  | 5302 | break; | 
|  | 5303 | case GL_TEXTURE_IMMUTABLE_FORMAT: | 
|  | 5304 | if(clientVersion < 3 || !texture->setCompareMode((GLboolean)param)) | 
|  | 5305 | { | 
|  | 5306 | return error(GL_INVALID_VALUE); | 
|  | 5307 | } | 
|  | 5308 | break; | 
|  | 5309 | case GL_TEXTURE_MAX_LEVEL: | 
|  | 5310 | if(clientVersion < 3 || !texture->setMaxLevel((GLint)param)) | 
|  | 5311 | { | 
|  | 5312 | return error(GL_INVALID_VALUE); | 
|  | 5313 | } | 
|  | 5314 | break; | 
|  | 5315 | case GL_TEXTURE_MAX_LOD: | 
|  | 5316 | if(clientVersion < 3 || !texture->setMaxLOD(param)) | 
|  | 5317 | { | 
|  | 5318 | return error(GL_INVALID_VALUE); | 
|  | 5319 | } | 
|  | 5320 | break; | 
|  | 5321 | case GL_TEXTURE_MIN_LOD: | 
|  | 5322 | if(clientVersion < 3 || !texture->setMinLOD(param)) | 
|  | 5323 | { | 
|  | 5324 | return error(GL_INVALID_VALUE); | 
|  | 5325 | } | 
|  | 5326 | break; | 
|  | 5327 | case GL_TEXTURE_SWIZZLE_R: | 
|  | 5328 | if(clientVersion < 3 || !texture->setSwizzleR((GLenum)param)) | 
|  | 5329 | { | 
|  | 5330 | return error(GL_INVALID_VALUE); | 
|  | 5331 | } | 
|  | 5332 | break; | 
|  | 5333 | case GL_TEXTURE_SWIZZLE_G: | 
|  | 5334 | if(clientVersion < 3 || !texture->setSwizzleG((GLenum)param)) | 
|  | 5335 | { | 
|  | 5336 | return error(GL_INVALID_VALUE); | 
|  | 5337 | } | 
|  | 5338 | break; | 
|  | 5339 | case GL_TEXTURE_SWIZZLE_B: | 
|  | 5340 | if(clientVersion < 3 || !texture->setSwizzleB((GLenum)param)) | 
|  | 5341 | { | 
|  | 5342 | return error(GL_INVALID_VALUE); | 
|  | 5343 | } | 
|  | 5344 | break; | 
|  | 5345 | case GL_TEXTURE_SWIZZLE_A: | 
|  | 5346 | if(clientVersion < 3 || !texture->setSwizzleA((GLenum)param)) | 
|  | 5347 | { | 
|  | 5348 | return error(GL_INVALID_VALUE); | 
|  | 5349 | } | 
|  | 5350 | break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5351 | default: | 
|  | 5352 | return error(GL_INVALID_ENUM); | 
|  | 5353 | } | 
|  | 5354 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5355 | } | 
|  | 5356 |  | 
|  | 5357 | void GL_APIENTRY glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params) | 
|  | 5358 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5359 | glTexParameterf(target, pname, *params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5360 | } | 
|  | 5361 |  | 
|  | 5362 | void GL_APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param) | 
|  | 5363 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5364 | TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5365 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5366 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5367 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5368 | if(context) | 
|  | 5369 | { | 
|  | 5370 | es2::Texture *texture; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5371 |  | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 5372 | egl::GLint clientVersion = context->getClientVersion(); | 
|  | 5373 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5374 | switch(target) | 
|  | 5375 | { | 
|  | 5376 | case GL_TEXTURE_2D: | 
|  | 5377 | texture = context->getTexture2D(); | 
|  | 5378 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 5379 | case GL_TEXTURE_2D_ARRAY: | 
|  | 5380 | if(clientVersion < 3) | 
|  | 5381 | { | 
|  | 5382 | return error(GL_INVALID_ENUM); | 
|  | 5383 | } | 
|  | 5384 | else | 
|  | 5385 | { | 
|  | 5386 | UNIMPLEMENTED(); | 
|  | 5387 | texture = context->getTexture3D(); | 
|  | 5388 | break; | 
|  | 5389 | } | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 5390 | case GL_TEXTURE_3D_OES: | 
|  | 5391 | texture = context->getTexture3D(); | 
|  | 5392 | break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5393 | case GL_TEXTURE_CUBE_MAP: | 
|  | 5394 | texture = context->getTextureCubeMap(); | 
|  | 5395 | break; | 
|  | 5396 | case GL_TEXTURE_EXTERNAL_OES: | 
| Alexis Hetu | f7be67f | 2015-02-11 16:11:07 -0500 | [diff] [blame] | 5397 | texture = context->getTextureExternal(); | 
|  | 5398 | break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5399 | default: | 
|  | 5400 | return error(GL_INVALID_ENUM); | 
|  | 5401 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5402 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5403 | switch(pname) | 
|  | 5404 | { | 
|  | 5405 | case GL_TEXTURE_WRAP_S: | 
|  | 5406 | if(!texture->setWrapS((GLenum)param)) | 
|  | 5407 | { | 
|  | 5408 | return error(GL_INVALID_ENUM); | 
|  | 5409 | } | 
|  | 5410 | break; | 
|  | 5411 | case GL_TEXTURE_WRAP_T: | 
|  | 5412 | if(!texture->setWrapT((GLenum)param)) | 
|  | 5413 | { | 
|  | 5414 | return error(GL_INVALID_ENUM); | 
|  | 5415 | } | 
|  | 5416 | break; | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 5417 | case GL_TEXTURE_WRAP_R_OES: | 
|  | 5418 | if(!texture->setWrapR((GLenum)param)) | 
|  | 5419 | { | 
|  | 5420 | return error(GL_INVALID_ENUM); | 
|  | 5421 | } | 
|  | 5422 | break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5423 | case GL_TEXTURE_MIN_FILTER: | 
|  | 5424 | if(!texture->setMinFilter((GLenum)param)) | 
|  | 5425 | { | 
|  | 5426 | return error(GL_INVALID_ENUM); | 
|  | 5427 | } | 
|  | 5428 | break; | 
|  | 5429 | case GL_TEXTURE_MAG_FILTER: | 
|  | 5430 | if(!texture->setMagFilter((GLenum)param)) | 
|  | 5431 | { | 
|  | 5432 | return error(GL_INVALID_ENUM); | 
|  | 5433 | } | 
|  | 5434 | break; | 
|  | 5435 | case GL_TEXTURE_MAX_ANISOTROPY_EXT: | 
|  | 5436 | if(!texture->setMaxAnisotropy((GLfloat)param)) | 
|  | 5437 | { | 
|  | 5438 | return error(GL_INVALID_VALUE); | 
|  | 5439 | } | 
|  | 5440 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 5441 | case GL_TEXTURE_BASE_LEVEL: | 
|  | 5442 | if(clientVersion < 3 || !texture->setBaseLevel(param)) | 
|  | 5443 | { | 
|  | 5444 | return error(GL_INVALID_VALUE); | 
|  | 5445 | } | 
|  | 5446 | break; | 
|  | 5447 | case GL_TEXTURE_COMPARE_FUNC: | 
|  | 5448 | if(clientVersion < 3 || !texture->setCompareFunc((GLenum)param)) | 
|  | 5449 | { | 
|  | 5450 | return error(GL_INVALID_VALUE); | 
|  | 5451 | } | 
|  | 5452 | break; | 
|  | 5453 | case GL_TEXTURE_COMPARE_MODE: | 
|  | 5454 | if(clientVersion < 3 || !texture->setCompareMode((GLenum)param)) | 
|  | 5455 | { | 
|  | 5456 | return error(GL_INVALID_VALUE); | 
|  | 5457 | } | 
|  | 5458 | case GL_TEXTURE_IMMUTABLE_FORMAT: | 
|  | 5459 | if(clientVersion < 3 || !texture->setCompareMode((GLboolean)param)) | 
|  | 5460 | { | 
|  | 5461 | return error(GL_INVALID_VALUE); | 
|  | 5462 | } | 
|  | 5463 | break; | 
|  | 5464 | case GL_TEXTURE_MAX_LEVEL: | 
|  | 5465 | if(clientVersion < 3 || !texture->setMaxLevel(param)) | 
|  | 5466 | { | 
|  | 5467 | return error(GL_INVALID_VALUE); | 
|  | 5468 | } | 
|  | 5469 | break; | 
|  | 5470 | case GL_TEXTURE_MAX_LOD: | 
|  | 5471 | if(clientVersion < 3 || !texture->setMaxLOD((GLfloat)param)) | 
|  | 5472 | { | 
|  | 5473 | return error(GL_INVALID_VALUE); | 
|  | 5474 | } | 
|  | 5475 | break; | 
|  | 5476 | case GL_TEXTURE_MIN_LOD: | 
|  | 5477 | if(clientVersion < 3 || !texture->setMinLOD((GLfloat)param)) | 
|  | 5478 | { | 
|  | 5479 | return error(GL_INVALID_VALUE); | 
|  | 5480 | } | 
|  | 5481 | break; | 
|  | 5482 | case GL_TEXTURE_SWIZZLE_R: | 
|  | 5483 | if(clientVersion < 3 || !texture->setSwizzleR((GLenum)param)) | 
|  | 5484 | { | 
|  | 5485 | return error(GL_INVALID_VALUE); | 
|  | 5486 | } | 
|  | 5487 | break; | 
|  | 5488 | case GL_TEXTURE_SWIZZLE_G: | 
|  | 5489 | if(clientVersion < 3 || !texture->setSwizzleG((GLenum)param)) | 
|  | 5490 | { | 
|  | 5491 | return error(GL_INVALID_VALUE); | 
|  | 5492 | } | 
|  | 5493 | break; | 
|  | 5494 | case GL_TEXTURE_SWIZZLE_B: | 
|  | 5495 | if(clientVersion < 3 || !texture->setSwizzleB((GLenum)param)) | 
|  | 5496 | { | 
|  | 5497 | return error(GL_INVALID_VALUE); | 
|  | 5498 | } | 
|  | 5499 | break; | 
|  | 5500 | case GL_TEXTURE_SWIZZLE_A: | 
|  | 5501 | if(clientVersion < 3 || !texture->setSwizzleA((GLenum)param)) | 
|  | 5502 | { | 
|  | 5503 | return error(GL_INVALID_VALUE); | 
|  | 5504 | } | 
|  | 5505 | break; | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5506 | default: | 
|  | 5507 | return error(GL_INVALID_ENUM); | 
|  | 5508 | } | 
|  | 5509 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5510 | } | 
|  | 5511 |  | 
|  | 5512 | void GL_APIENTRY glTexParameteriv(GLenum target, GLenum pname, const GLint* params) | 
|  | 5513 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5514 | glTexParameteri(target, pname, *params); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5515 | } | 
|  | 5516 |  | 
|  | 5517 | void GL_APIENTRY glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5518 | GLenum format, GLenum type, const GLvoid* pixels) | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5519 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5520 | TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, " | 
|  | 5521 | "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, " | 
|  | 5522 | "const GLvoid* pixels = 0x%0.8p)", | 
|  | 5523 | target, level, xoffset, yoffset, width, height, format, type, pixels); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5524 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5525 | if(!es2::IsTextureTarget(target)) | 
|  | 5526 | { | 
|  | 5527 | return error(GL_INVALID_ENUM); | 
|  | 5528 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5529 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5530 | if(level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0) | 
|  | 5531 | { | 
|  | 5532 | return error(GL_INVALID_VALUE); | 
|  | 5533 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5534 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5535 | if(std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height) | 
|  | 5536 | { | 
|  | 5537 | return error(GL_INVALID_VALUE); | 
|  | 5538 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5539 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5540 | if(!es2::CheckTextureFormatType(format, type)) | 
|  | 5541 | { | 
|  | 5542 | return error(GL_INVALID_ENUM); | 
|  | 5543 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5544 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5545 | if(width == 0 || height == 0 || pixels == NULL) | 
|  | 5546 | { | 
|  | 5547 | return; | 
|  | 5548 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5549 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5550 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5551 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5552 | if(context) | 
|  | 5553 | { | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 5554 | if(level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5555 | { | 
|  | 5556 | return error(GL_INVALID_VALUE); | 
|  | 5557 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5558 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5559 | if(target == GL_TEXTURE_2D) | 
|  | 5560 | { | 
|  | 5561 | es2::Texture2D *texture = context->getTexture2D(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5562 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5563 | if(validateSubImageParams(false, width, height, xoffset, yoffset, target, level, format, texture)) | 
|  | 5564 | { | 
|  | 5565 | texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels); | 
|  | 5566 | } | 
|  | 5567 | } | 
|  | 5568 | else if(es2::IsCubemapTextureTarget(target)) | 
|  | 5569 | { | 
|  | 5570 | es2::TextureCubeMap *texture = context->getTextureCubeMap(); | 
| Nicolas Capens | 08e90f0 | 2014-11-21 12:49:12 -0500 | [diff] [blame] | 5571 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5572 | if(validateSubImageParams(false, width, height, xoffset, yoffset, target, level, format, texture)) | 
|  | 5573 | { | 
|  | 5574 | texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels); | 
|  | 5575 | } | 
|  | 5576 | } | 
|  | 5577 | else | 
|  | 5578 | { | 
|  | 5579 | UNREACHABLE(); | 
|  | 5580 | } | 
|  | 5581 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5582 | } | 
|  | 5583 |  | 
|  | 5584 | void GL_APIENTRY glUniform1f(GLint location, GLfloat x) | 
|  | 5585 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5586 | glUniform1fv(location, 1, &x); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5587 | } | 
|  | 5588 |  | 
|  | 5589 | void GL_APIENTRY glUniform1fv(GLint location, GLsizei count, const GLfloat* v) | 
|  | 5590 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5591 | TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5592 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5593 | if(count < 0) | 
|  | 5594 | { | 
|  | 5595 | return error(GL_INVALID_VALUE); | 
|  | 5596 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5597 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5598 | if(location == -1) | 
|  | 5599 | { | 
|  | 5600 | return; | 
|  | 5601 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5602 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5603 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5604 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5605 | if(context) | 
|  | 5606 | { | 
|  | 5607 | es2::Program *program = context->getCurrentProgram(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5608 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5609 | if(!program) | 
|  | 5610 | { | 
|  | 5611 | return error(GL_INVALID_OPERATION); | 
|  | 5612 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5613 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5614 | if(!program->setUniform1fv(location, count, v)) | 
|  | 5615 | { | 
|  | 5616 | return error(GL_INVALID_OPERATION); | 
|  | 5617 | } | 
|  | 5618 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5619 | } | 
|  | 5620 |  | 
|  | 5621 | void GL_APIENTRY glUniform1i(GLint location, GLint x) | 
|  | 5622 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5623 | glUniform1iv(location, 1, &x); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5624 | } | 
|  | 5625 |  | 
|  | 5626 | void GL_APIENTRY glUniform1iv(GLint location, GLsizei count, const GLint* v) | 
|  | 5627 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5628 | TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5629 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5630 | if(count < 0) | 
|  | 5631 | { | 
|  | 5632 | return error(GL_INVALID_VALUE); | 
|  | 5633 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5634 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5635 | if(location == -1) | 
|  | 5636 | { | 
|  | 5637 | return; | 
|  | 5638 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5639 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5640 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5641 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5642 | if(context) | 
|  | 5643 | { | 
|  | 5644 | es2::Program *program = context->getCurrentProgram(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5645 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5646 | if(!program) | 
|  | 5647 | { | 
|  | 5648 | return error(GL_INVALID_OPERATION); | 
|  | 5649 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5650 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5651 | if(!program->setUniform1iv(location, count, v)) | 
|  | 5652 | { | 
|  | 5653 | return error(GL_INVALID_OPERATION); | 
|  | 5654 | } | 
|  | 5655 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5656 | } | 
|  | 5657 |  | 
|  | 5658 | void GL_APIENTRY glUniform2f(GLint location, GLfloat x, GLfloat y) | 
|  | 5659 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5660 | GLfloat xy[2] = {x, y}; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5661 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5662 | glUniform2fv(location, 1, (GLfloat*)&xy); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5663 | } | 
|  | 5664 |  | 
|  | 5665 | void GL_APIENTRY glUniform2fv(GLint location, GLsizei count, const GLfloat* v) | 
|  | 5666 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5667 | TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5668 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5669 | if(count < 0) | 
|  | 5670 | { | 
|  | 5671 | return error(GL_INVALID_VALUE); | 
|  | 5672 | } | 
| Nicolas Capens | 08e90f0 | 2014-11-21 12:49:12 -0500 | [diff] [blame] | 5673 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5674 | if(location == -1) | 
|  | 5675 | { | 
|  | 5676 | return; | 
|  | 5677 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5678 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5679 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5680 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5681 | if(context) | 
|  | 5682 | { | 
|  | 5683 | es2::Program *program = context->getCurrentProgram(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5684 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5685 | if(!program) | 
|  | 5686 | { | 
|  | 5687 | return error(GL_INVALID_OPERATION); | 
|  | 5688 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5689 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5690 | if(!program->setUniform2fv(location, count, v)) | 
|  | 5691 | { | 
|  | 5692 | return error(GL_INVALID_OPERATION); | 
|  | 5693 | } | 
|  | 5694 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5695 | } | 
|  | 5696 |  | 
|  | 5697 | void GL_APIENTRY glUniform2i(GLint location, GLint x, GLint y) | 
|  | 5698 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5699 | GLint xy[4] = {x, y}; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5700 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5701 | glUniform2iv(location, 1, (GLint*)&xy); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5702 | } | 
|  | 5703 |  | 
|  | 5704 | void GL_APIENTRY glUniform2iv(GLint location, GLsizei count, const GLint* v) | 
|  | 5705 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5706 | TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5707 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5708 | if(count < 0) | 
|  | 5709 | { | 
|  | 5710 | return error(GL_INVALID_VALUE); | 
|  | 5711 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5712 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5713 | if(location == -1) | 
|  | 5714 | { | 
|  | 5715 | return; | 
|  | 5716 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5717 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5718 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5719 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5720 | if(context) | 
|  | 5721 | { | 
|  | 5722 | es2::Program *program = context->getCurrentProgram(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5723 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5724 | if(!program) | 
|  | 5725 | { | 
|  | 5726 | return error(GL_INVALID_OPERATION); | 
|  | 5727 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5728 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5729 | if(!program->setUniform2iv(location, count, v)) | 
|  | 5730 | { | 
|  | 5731 | return error(GL_INVALID_OPERATION); | 
|  | 5732 | } | 
|  | 5733 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5734 | } | 
|  | 5735 |  | 
|  | 5736 | void GL_APIENTRY glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) | 
|  | 5737 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5738 | GLfloat xyz[3] = {x, y, z}; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5739 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5740 | glUniform3fv(location, 1, (GLfloat*)&xyz); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5741 | } | 
|  | 5742 |  | 
|  | 5743 | void GL_APIENTRY glUniform3fv(GLint location, GLsizei count, const GLfloat* v) | 
|  | 5744 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5745 | TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5746 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5747 | if(count < 0) | 
|  | 5748 | { | 
|  | 5749 | return error(GL_INVALID_VALUE); | 
|  | 5750 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5751 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5752 | if(location == -1) | 
|  | 5753 | { | 
|  | 5754 | return; | 
|  | 5755 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5756 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5757 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5758 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5759 | if(context) | 
|  | 5760 | { | 
|  | 5761 | es2::Program *program = context->getCurrentProgram(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5762 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5763 | if(!program) | 
|  | 5764 | { | 
|  | 5765 | return error(GL_INVALID_OPERATION); | 
|  | 5766 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5767 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5768 | if(!program->setUniform3fv(location, count, v)) | 
|  | 5769 | { | 
|  | 5770 | return error(GL_INVALID_OPERATION); | 
|  | 5771 | } | 
|  | 5772 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5773 | } | 
|  | 5774 |  | 
|  | 5775 | void GL_APIENTRY glUniform3i(GLint location, GLint x, GLint y, GLint z) | 
|  | 5776 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5777 | GLint xyz[3] = {x, y, z}; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5778 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5779 | glUniform3iv(location, 1, (GLint*)&xyz); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5780 | } | 
|  | 5781 |  | 
|  | 5782 | void GL_APIENTRY glUniform3iv(GLint location, GLsizei count, const GLint* v) | 
|  | 5783 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5784 | TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5785 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5786 | if(count < 0) | 
|  | 5787 | { | 
|  | 5788 | return error(GL_INVALID_VALUE); | 
|  | 5789 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5790 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5791 | if(location == -1) | 
|  | 5792 | { | 
|  | 5793 | return; | 
|  | 5794 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5795 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5796 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5797 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5798 | if(context) | 
|  | 5799 | { | 
|  | 5800 | es2::Program *program = context->getCurrentProgram(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5801 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5802 | if(!program) | 
|  | 5803 | { | 
|  | 5804 | return error(GL_INVALID_OPERATION); | 
|  | 5805 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5806 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5807 | if(!program->setUniform3iv(location, count, v)) | 
|  | 5808 | { | 
|  | 5809 | return error(GL_INVALID_OPERATION); | 
|  | 5810 | } | 
|  | 5811 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5812 | } | 
|  | 5813 |  | 
|  | 5814 | void GL_APIENTRY glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) | 
|  | 5815 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5816 | GLfloat xyzw[4] = {x, y, z, w}; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5817 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5818 | glUniform4fv(location, 1, (GLfloat*)&xyzw); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5819 | } | 
|  | 5820 |  | 
|  | 5821 | void GL_APIENTRY glUniform4fv(GLint location, GLsizei count, const GLfloat* v) | 
|  | 5822 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5823 | TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5824 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5825 | if(count < 0) | 
|  | 5826 | { | 
|  | 5827 | return error(GL_INVALID_VALUE); | 
|  | 5828 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5829 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5830 | if(location == -1) | 
|  | 5831 | { | 
|  | 5832 | return; | 
|  | 5833 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5834 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5835 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5836 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5837 | if(context) | 
|  | 5838 | { | 
|  | 5839 | es2::Program *program = context->getCurrentProgram(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5840 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5841 | if(!program) | 
|  | 5842 | { | 
|  | 5843 | return error(GL_INVALID_OPERATION); | 
|  | 5844 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5845 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5846 | if(!program->setUniform4fv(location, count, v)) | 
|  | 5847 | { | 
|  | 5848 | return error(GL_INVALID_OPERATION); | 
|  | 5849 | } | 
|  | 5850 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5851 | } | 
|  | 5852 |  | 
|  | 5853 | void GL_APIENTRY glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) | 
|  | 5854 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5855 | GLint xyzw[4] = {x, y, z, w}; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5856 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5857 | glUniform4iv(location, 1, (GLint*)&xyzw); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5858 | } | 
|  | 5859 |  | 
|  | 5860 | void GL_APIENTRY glUniform4iv(GLint location, GLsizei count, const GLint* v) | 
|  | 5861 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5862 | TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5863 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5864 | if(count < 0) | 
|  | 5865 | { | 
|  | 5866 | return error(GL_INVALID_VALUE); | 
|  | 5867 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5868 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5869 | if(location == -1) | 
|  | 5870 | { | 
|  | 5871 | return; | 
|  | 5872 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5873 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5874 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5875 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5876 | if(context) | 
|  | 5877 | { | 
|  | 5878 | es2::Program *program = context->getCurrentProgram(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5879 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5880 | if(!program) | 
|  | 5881 | { | 
|  | 5882 | return error(GL_INVALID_OPERATION); | 
|  | 5883 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5884 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5885 | if(!program->setUniform4iv(location, count, v)) | 
|  | 5886 | { | 
|  | 5887 | return error(GL_INVALID_OPERATION); | 
|  | 5888 | } | 
|  | 5889 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5890 | } | 
|  | 5891 |  | 
|  | 5892 | void GL_APIENTRY glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) | 
|  | 5893 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5894 | TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)", | 
|  | 5895 | location, count, transpose, value); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5896 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5897 | if(count < 0 || transpose != GL_FALSE) | 
|  | 5898 | { | 
|  | 5899 | return error(GL_INVALID_VALUE); | 
|  | 5900 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5901 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5902 | if(location == -1) | 
|  | 5903 | { | 
|  | 5904 | return; | 
|  | 5905 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5906 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5907 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5908 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5909 | if(context) | 
|  | 5910 | { | 
|  | 5911 | es2::Program *program = context->getCurrentProgram(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5912 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5913 | if(!program) | 
|  | 5914 | { | 
|  | 5915 | return error(GL_INVALID_OPERATION); | 
|  | 5916 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5917 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5918 | if(!program->setUniformMatrix2fv(location, count, value)) | 
|  | 5919 | { | 
|  | 5920 | return error(GL_INVALID_OPERATION); | 
|  | 5921 | } | 
|  | 5922 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5923 | } | 
|  | 5924 |  | 
|  | 5925 | void GL_APIENTRY glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) | 
|  | 5926 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5927 | TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)", | 
|  | 5928 | location, count, transpose, value); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5929 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5930 | if(count < 0 || transpose != GL_FALSE) | 
|  | 5931 | { | 
|  | 5932 | return error(GL_INVALID_VALUE); | 
|  | 5933 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5934 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5935 | if(location == -1) | 
|  | 5936 | { | 
|  | 5937 | return; | 
|  | 5938 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5939 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5940 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5941 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5942 | if(context) | 
|  | 5943 | { | 
|  | 5944 | es2::Program *program = context->getCurrentProgram(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5945 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5946 | if(!program) | 
|  | 5947 | { | 
|  | 5948 | return error(GL_INVALID_OPERATION); | 
|  | 5949 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5950 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5951 | if(!program->setUniformMatrix3fv(location, count, value)) | 
|  | 5952 | { | 
|  | 5953 | return error(GL_INVALID_OPERATION); | 
|  | 5954 | } | 
|  | 5955 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5956 | } | 
|  | 5957 |  | 
|  | 5958 | void GL_APIENTRY glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) | 
|  | 5959 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5960 | TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)", | 
|  | 5961 | location, count, transpose, value); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5962 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5963 | if(count < 0 || transpose != GL_FALSE) | 
|  | 5964 | { | 
|  | 5965 | return error(GL_INVALID_VALUE); | 
|  | 5966 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5967 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5968 | if(location == -1) | 
|  | 5969 | { | 
|  | 5970 | return; | 
|  | 5971 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5972 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5973 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5974 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5975 | if(context) | 
|  | 5976 | { | 
|  | 5977 | es2::Program *program = context->getCurrentProgram(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5978 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5979 | if(!program) | 
|  | 5980 | { | 
|  | 5981 | return error(GL_INVALID_OPERATION); | 
|  | 5982 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5983 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5984 | if(!program->setUniformMatrix4fv(location, count, value)) | 
|  | 5985 | { | 
|  | 5986 | return error(GL_INVALID_OPERATION); | 
|  | 5987 | } | 
|  | 5988 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5989 | } | 
|  | 5990 |  | 
|  | 5991 | void GL_APIENTRY glUseProgram(GLuint program) | 
|  | 5992 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5993 | TRACE("(GLuint program = %d)", program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5994 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5995 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 5996 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 5997 | if(context) | 
|  | 5998 | { | 
|  | 5999 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6000 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6001 | if(!programObject && program != 0) | 
|  | 6002 | { | 
|  | 6003 | if(context->getShader(program)) | 
|  | 6004 | { | 
|  | 6005 | return error(GL_INVALID_OPERATION); | 
|  | 6006 | } | 
|  | 6007 | else | 
|  | 6008 | { | 
|  | 6009 | return error(GL_INVALID_VALUE); | 
|  | 6010 | } | 
|  | 6011 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6012 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6013 | if(program != 0 && !programObject->isLinked()) | 
|  | 6014 | { | 
|  | 6015 | return error(GL_INVALID_OPERATION); | 
|  | 6016 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6017 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6018 | context->useProgram(program); | 
|  | 6019 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6020 | } | 
|  | 6021 |  | 
|  | 6022 | void GL_APIENTRY glValidateProgram(GLuint program) | 
|  | 6023 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6024 | TRACE("(GLuint program = %d)", program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6025 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6026 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6027 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6028 | if(context) | 
|  | 6029 | { | 
|  | 6030 | es2::Program *programObject = context->getProgram(program); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6031 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6032 | if(!programObject) | 
|  | 6033 | { | 
|  | 6034 | if(context->getShader(program)) | 
|  | 6035 | { | 
|  | 6036 | return error(GL_INVALID_OPERATION); | 
|  | 6037 | } | 
|  | 6038 | else | 
|  | 6039 | { | 
|  | 6040 | return error(GL_INVALID_VALUE); | 
|  | 6041 | } | 
|  | 6042 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6043 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6044 | programObject->validate(); | 
|  | 6045 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6046 | } | 
|  | 6047 |  | 
|  | 6048 | void GL_APIENTRY glVertexAttrib1f(GLuint index, GLfloat x) | 
|  | 6049 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6050 | TRACE("(GLuint index = %d, GLfloat x = %f)", index, x); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6051 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6052 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 6053 | { | 
|  | 6054 | return error(GL_INVALID_VALUE); | 
|  | 6055 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6056 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6057 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6058 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6059 | if(context) | 
|  | 6060 | { | 
|  | 6061 | GLfloat vals[4] = { x, 0, 0, 1 }; | 
|  | 6062 | context->setVertexAttrib(index, vals); | 
|  | 6063 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6064 | } | 
|  | 6065 |  | 
|  | 6066 | void GL_APIENTRY glVertexAttrib1fv(GLuint index, const GLfloat* values) | 
|  | 6067 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6068 | TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6069 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6070 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 6071 | { | 
|  | 6072 | return error(GL_INVALID_VALUE); | 
|  | 6073 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6074 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6075 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6076 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6077 | if(context) | 
|  | 6078 | { | 
|  | 6079 | GLfloat vals[4] = { values[0], 0, 0, 1 }; | 
|  | 6080 | context->setVertexAttrib(index, vals); | 
|  | 6081 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6082 | } | 
|  | 6083 |  | 
|  | 6084 | void GL_APIENTRY glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y) | 
|  | 6085 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6086 | TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6087 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6088 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 6089 | { | 
|  | 6090 | return error(GL_INVALID_VALUE); | 
|  | 6091 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6092 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6093 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6094 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6095 | if(context) | 
|  | 6096 | { | 
|  | 6097 | GLfloat vals[4] = { x, y, 0, 1 }; | 
|  | 6098 | context->setVertexAttrib(index, vals); | 
|  | 6099 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6100 | } | 
|  | 6101 |  | 
|  | 6102 | void GL_APIENTRY glVertexAttrib2fv(GLuint index, const GLfloat* values) | 
|  | 6103 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6104 | TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6105 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6106 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 6107 | { | 
|  | 6108 | return error(GL_INVALID_VALUE); | 
|  | 6109 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6110 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6111 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6112 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6113 | if(context) | 
|  | 6114 | { | 
|  | 6115 | GLfloat vals[4] = { values[0], values[1], 0, 1 }; | 
|  | 6116 | context->setVertexAttrib(index, vals); | 
|  | 6117 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6118 | } | 
|  | 6119 |  | 
|  | 6120 | void GL_APIENTRY glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z) | 
|  | 6121 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6122 | TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6123 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6124 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 6125 | { | 
|  | 6126 | return error(GL_INVALID_VALUE); | 
|  | 6127 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6128 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6129 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6130 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6131 | if(context) | 
|  | 6132 | { | 
|  | 6133 | GLfloat vals[4] = { x, y, z, 1 }; | 
|  | 6134 | context->setVertexAttrib(index, vals); | 
|  | 6135 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6136 | } | 
|  | 6137 |  | 
|  | 6138 | void GL_APIENTRY glVertexAttrib3fv(GLuint index, const GLfloat* values) | 
|  | 6139 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6140 | TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6141 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6142 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 6143 | { | 
|  | 6144 | return error(GL_INVALID_VALUE); | 
|  | 6145 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6146 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6147 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6148 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6149 | if(context) | 
|  | 6150 | { | 
|  | 6151 | GLfloat vals[4] = { values[0], values[1], values[2], 1 }; | 
|  | 6152 | context->setVertexAttrib(index, vals); | 
|  | 6153 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6154 | } | 
|  | 6155 |  | 
|  | 6156 | void GL_APIENTRY glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) | 
|  | 6157 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6158 | TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6159 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6160 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 6161 | { | 
|  | 6162 | return error(GL_INVALID_VALUE); | 
|  | 6163 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6164 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6165 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6166 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6167 | if(context) | 
|  | 6168 | { | 
|  | 6169 | GLfloat vals[4] = { x, y, z, w }; | 
|  | 6170 | context->setVertexAttrib(index, vals); | 
|  | 6171 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6172 | } | 
|  | 6173 |  | 
|  | 6174 | void GL_APIENTRY glVertexAttrib4fv(GLuint index, const GLfloat* values) | 
|  | 6175 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6176 | TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6177 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6178 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 6179 | { | 
|  | 6180 | return error(GL_INVALID_VALUE); | 
|  | 6181 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6182 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6183 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6184 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6185 | if(context) | 
|  | 6186 | { | 
|  | 6187 | context->setVertexAttrib(index, values); | 
|  | 6188 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6189 | } | 
|  | 6190 |  | 
|  | 6191 | void GL_APIENTRY glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr) | 
|  | 6192 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6193 | TRACE("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, " | 
|  | 6194 | "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)", | 
|  | 6195 | index, size, type, normalized, stride, ptr); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6196 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6197 | if(index >= es2::MAX_VERTEX_ATTRIBS) | 
|  | 6198 | { | 
|  | 6199 | return error(GL_INVALID_VALUE); | 
|  | 6200 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6201 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6202 | if(size < 1 || size > 4) | 
|  | 6203 | { | 
|  | 6204 | return error(GL_INVALID_VALUE); | 
|  | 6205 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6206 |  | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 6207 | egl::GLint clientVersion = egl::getClientVersion(); | 
|  | 6208 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6209 | switch(type) | 
|  | 6210 | { | 
|  | 6211 | case GL_BYTE: | 
|  | 6212 | case GL_UNSIGNED_BYTE: | 
|  | 6213 | case GL_SHORT: | 
|  | 6214 | case GL_UNSIGNED_SHORT: | 
|  | 6215 | case GL_FIXED: | 
|  | 6216 | case GL_FLOAT: | 
|  | 6217 | break; | 
| Alexis Hetu | ed30618 | 2015-04-02 12:02:28 -0400 | [diff] [blame^] | 6218 | case GL_INT_2_10_10_10_REV: | 
|  | 6219 | case GL_UNSIGNED_INT_2_10_10_10_REV: | 
|  | 6220 | if(clientVersion >= 3) | 
|  | 6221 | { | 
|  | 6222 | if(size != 4) | 
|  | 6223 | { | 
|  | 6224 | return error(GL_INVALID_OPERATION); | 
|  | 6225 | } | 
|  | 6226 | break; | 
|  | 6227 | } | 
|  | 6228 | else return error(GL_INVALID_ENUM); | 
|  | 6229 | case GL_INT: | 
|  | 6230 | case GL_UNSIGNED_INT: | 
|  | 6231 | case GL_HALF_FLOAT: | 
|  | 6232 | if(clientVersion >= 3) | 
|  | 6233 | { | 
|  | 6234 | break; | 
|  | 6235 | } | 
|  | 6236 | else return error(GL_INVALID_ENUM); | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6237 | default: | 
|  | 6238 | return error(GL_INVALID_ENUM); | 
|  | 6239 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6240 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6241 | if(stride < 0) | 
|  | 6242 | { | 
|  | 6243 | return error(GL_INVALID_VALUE); | 
|  | 6244 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6245 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6246 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6247 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6248 | if(context) | 
|  | 6249 | { | 
|  | 6250 | context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr); | 
|  | 6251 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6252 | } | 
|  | 6253 |  | 
|  | 6254 | void GL_APIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height) | 
|  | 6255 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6256 | TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6257 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6258 | if(width < 0 || height < 0) | 
|  | 6259 | { | 
|  | 6260 | return error(GL_INVALID_VALUE); | 
|  | 6261 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6262 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6263 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6264 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6265 | if(context) | 
|  | 6266 | { | 
|  | 6267 | context->setViewportParams(x, y, width, height); | 
|  | 6268 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6269 | } | 
|  | 6270 |  | 
| Alexis Hetu | e9233fb | 2015-02-11 10:31:58 -0500 | [diff] [blame] | 6271 | void GL_APIENTRY glBlitFramebufferNV(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6272 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6273 | TRACE("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, " | 
|  | 6274 | "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, " | 
|  | 6275 | "GLbitfield mask = 0x%X, GLenum filter = 0x%X)", | 
|  | 6276 | srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6277 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6278 | switch(filter) | 
|  | 6279 | { | 
|  | 6280 | case GL_NEAREST: | 
|  | 6281 | break; | 
|  | 6282 | default: | 
|  | 6283 | return error(GL_INVALID_ENUM); | 
|  | 6284 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6285 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6286 | if((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0) | 
|  | 6287 | { | 
|  | 6288 | return error(GL_INVALID_VALUE); | 
|  | 6289 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6290 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6291 | es2::Context *context = es2::getContext(); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6292 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6293 | if(context) | 
|  | 6294 | { | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6295 | if(context->getReadFramebufferName() == context->getDrawFramebufferName()) | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6296 | { | 
|  | 6297 | ERR("Blits with the same source and destination framebuffer are not supported by this implementation."); | 
|  | 6298 | return error(GL_INVALID_OPERATION); | 
|  | 6299 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6300 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6301 | context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask); | 
|  | 6302 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6303 | } | 
|  | 6304 |  | 
| Alexis Hetu | e9233fb | 2015-02-11 10:31:58 -0500 | [diff] [blame] | 6305 | void GL_APIENTRY glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, | 
|  | 6306 | GLbitfield mask, GLenum filter) | 
|  | 6307 | { | 
|  | 6308 | if(srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0) | 
|  | 6309 | { | 
|  | 6310 | ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation"); | 
|  | 6311 | return error(GL_INVALID_OPERATION); | 
|  | 6312 | } | 
|  | 6313 |  | 
|  | 6314 | glBlitFramebufferNV(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); | 
|  | 6315 | } | 
|  | 6316 |  | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6317 | void GL_APIENTRY glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6318 | GLint border, GLenum format, GLenum type, const GLvoid* pixels) | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6319 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6320 | TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, " | 
|  | 6321 | "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, " | 
|  | 6322 | "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)", | 
|  | 6323 | target, level, internalformat, width, height, depth, border, format, type, pixels); | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6324 |  | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6325 | switch(target) | 
|  | 6326 | { | 
|  | 6327 | case GL_TEXTURE_3D_OES: | 
|  | 6328 | switch(format) | 
|  | 6329 | { | 
|  | 6330 | case GL_DEPTH_COMPONENT: | 
|  | 6331 | case GL_DEPTH_STENCIL_OES: | 
|  | 6332 | return error(GL_INVALID_OPERATION); | 
|  | 6333 | default: | 
|  | 6334 | break; | 
|  | 6335 | } | 
|  | 6336 | break; | 
|  | 6337 | default: | 
|  | 6338 | return error(GL_INVALID_ENUM); | 
|  | 6339 | } | 
|  | 6340 |  | 
|  | 6341 | if(!ValidateType3D(type) || !ValidateFormat3D(format)) | 
|  | 6342 | { | 
|  | 6343 | return error(GL_INVALID_ENUM); | 
|  | 6344 | } | 
|  | 6345 |  | 
|  | 6346 | if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)) | 
|  | 6347 | { | 
|  | 6348 | return error(GL_INVALID_VALUE); | 
|  | 6349 | } | 
|  | 6350 |  | 
|  | 6351 | const GLsizei maxSize3D = es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level; | 
|  | 6352 | if((width < 0) || (height < 0) || (depth < 0) || (width > maxSize3D) || (height > maxSize3D) || (depth > maxSize3D)) | 
|  | 6353 | { | 
|  | 6354 | return error(GL_INVALID_VALUE); | 
|  | 6355 | } | 
|  | 6356 |  | 
|  | 6357 | if(border != 0) | 
|  | 6358 | { | 
|  | 6359 | return error(GL_INVALID_VALUE); | 
|  | 6360 | } | 
|  | 6361 |  | 
|  | 6362 | if(!ValidateInternalFormat3D(internalformat, format, type)) | 
|  | 6363 | { | 
|  | 6364 | return error(GL_INVALID_OPERATION); | 
|  | 6365 | } | 
|  | 6366 |  | 
|  | 6367 | es2::Context *context = es2::getContext(); | 
|  | 6368 |  | 
|  | 6369 | if(context) | 
|  | 6370 | { | 
|  | 6371 | es2::Texture3D *texture = context->getTexture3D(); | 
|  | 6372 |  | 
|  | 6373 | if(!texture) | 
|  | 6374 | { | 
|  | 6375 | return error(GL_INVALID_OPERATION); | 
|  | 6376 | } | 
|  | 6377 |  | 
|  | 6378 | texture->setImage(level, width, height, depth, internalformat, type, context->getUnpackAlignment(), pixels); | 
|  | 6379 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6380 | } | 
|  | 6381 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6382 | void GL_APIENTRY glTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels) | 
|  | 6383 | { | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6384 | TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, " | 
|  | 6385 | "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, " | 
|  | 6386 | "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)", | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6387 | target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); | 
|  | 6388 |  | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6389 | switch(target) | 
|  | 6390 | { | 
|  | 6391 | case GL_TEXTURE_3D_OES: | 
|  | 6392 | break; | 
|  | 6393 | default: | 
|  | 6394 | return error(GL_INVALID_ENUM); | 
|  | 6395 | } | 
|  | 6396 |  | 
|  | 6397 | if(!ValidateType3D(type) || !ValidateFormat3D(format)) | 
|  | 6398 | { | 
|  | 6399 | return error(GL_INVALID_ENUM); | 
|  | 6400 | } | 
|  | 6401 |  | 
|  | 6402 | if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)) | 
|  | 6403 | { | 
|  | 6404 | return error(GL_INVALID_VALUE); | 
|  | 6405 | } | 
|  | 6406 |  | 
|  | 6407 | if((width < 0) || (height < 0) || (depth < 0)) | 
|  | 6408 | { | 
|  | 6409 | return error(GL_INVALID_VALUE); | 
|  | 6410 | } | 
|  | 6411 |  | 
|  | 6412 | es2::Context *context = es2::getContext(); | 
|  | 6413 |  | 
|  | 6414 | if(context) | 
|  | 6415 | { | 
|  | 6416 | es2::Texture3D *texture = context->getTexture3D(); | 
|  | 6417 |  | 
|  | 6418 | if(validateSubImageParams(false, width, height, depth, xoffset, yoffset, zoffset, target, level, format, texture)) | 
|  | 6419 | { | 
|  | 6420 | texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels); | 
|  | 6421 | } | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6422 | } | 
|  | 6423 | } | 
|  | 6424 |  | 
|  | 6425 | void GL_APIENTRY glCopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) | 
|  | 6426 | { | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6427 | TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, " | 
|  | 6428 | "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6429 | target, level, xoffset, yoffset, zoffset, x, y, width, height); | 
|  | 6430 |  | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6431 | switch(target) | 
|  | 6432 | { | 
|  | 6433 | case GL_TEXTURE_3D_OES: | 
|  | 6434 | break; | 
|  | 6435 | default: | 
|  | 6436 | return error(GL_INVALID_ENUM); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6437 | } | 
|  | 6438 |  | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6439 | if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)) | 
|  | 6440 | { | 
|  | 6441 | return error(GL_INVALID_VALUE); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6442 | } | 
|  | 6443 |  | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6444 | es2::Context *context = es2::getContext(); | 
|  | 6445 |  | 
|  | 6446 | if(context) | 
|  | 6447 | { | 
|  | 6448 | es2::Framebuffer *framebuffer = context->getReadFramebuffer(); | 
|  | 6449 |  | 
|  | 6450 | if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) | 
|  | 6451 | { | 
|  | 6452 | return error(GL_INVALID_FRAMEBUFFER_OPERATION); | 
|  | 6453 | } | 
|  | 6454 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6455 | if(context->getReadFramebufferName() != 0 && framebuffer->getColorbuffer()->getSamples() > 1) | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6456 | { | 
|  | 6457 | return error(GL_INVALID_OPERATION); | 
|  | 6458 | } | 
|  | 6459 |  | 
|  | 6460 | es2::Renderbuffer *source = framebuffer->getColorbuffer(); | 
|  | 6461 | GLenum colorbufferFormat = source->getFormat(); | 
|  | 6462 | es2::Texture3D *texture = context->getTexture3D(); | 
|  | 6463 |  | 
|  | 6464 | if(!validateSubImageParams(false, width, height, 1, xoffset, yoffset, zoffset, target, level, GL_NONE, texture)) | 
|  | 6465 | { | 
|  | 6466 | return; | 
|  | 6467 | } | 
|  | 6468 |  | 
|  | 6469 | GLenum textureFormat = texture->getFormat(target, level); | 
|  | 6470 |  | 
|  | 6471 | if(!validateColorBufferFormat(textureFormat, colorbufferFormat)) | 
|  | 6472 | { | 
|  | 6473 | return; | 
|  | 6474 | } | 
|  | 6475 |  | 
|  | 6476 | texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6477 | } | 
|  | 6478 | } | 
|  | 6479 |  | 
|  | 6480 | void GL_APIENTRY glCompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data) | 
|  | 6481 | { | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6482 | TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, " | 
|  | 6483 | "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)", | 
|  | 6484 | target, level, internalformat, width, height, depth, border, imageSize, data); | 
|  | 6485 |  | 
|  | 6486 | switch(target) | 
|  | 6487 | { | 
|  | 6488 | case GL_TEXTURE_3D_OES: | 
|  | 6489 | break; | 
|  | 6490 | default: | 
|  | 6491 | return error(GL_INVALID_ENUM); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6492 | } | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6493 |  | 
|  | 6494 | if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)) | 
|  | 6495 | { | 
|  | 6496 | return error(GL_INVALID_VALUE); | 
|  | 6497 | } | 
|  | 6498 |  | 
|  | 6499 | const GLsizei maxSize3D = es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level; | 
|  | 6500 | if((width < 0) || (height < 0) || (depth < 0) || (width > maxSize3D) || (height > maxSize3D) || (depth > maxSize3D) ||(border != 0) || (imageSize < 0)) | 
|  | 6501 | { | 
|  | 6502 | return error(GL_INVALID_VALUE); | 
|  | 6503 | } | 
|  | 6504 |  | 
|  | 6505 | switch(internalformat) | 
|  | 6506 | { | 
|  | 6507 | case GL_ETC1_RGB8_OES: | 
|  | 6508 | break; | 
|  | 6509 | case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: | 
|  | 6510 | case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: | 
|  | 6511 | case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: | 
|  | 6512 | case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: | 
|  | 6513 | if(!S3TC_SUPPORT) | 
|  | 6514 | { | 
|  | 6515 | return error(GL_INVALID_ENUM); | 
|  | 6516 | } | 
|  | 6517 | break; | 
|  | 6518 | case GL_DEPTH_COMPONENT: | 
|  | 6519 | case GL_DEPTH_COMPONENT16: | 
|  | 6520 | case GL_DEPTH_COMPONENT32_OES: | 
|  | 6521 | case GL_DEPTH_STENCIL_OES: | 
|  | 6522 | case GL_DEPTH24_STENCIL8_OES: | 
|  | 6523 | return error(GL_INVALID_OPERATION); | 
|  | 6524 | default: | 
|  | 6525 | return error(GL_INVALID_ENUM); | 
|  | 6526 | } | 
|  | 6527 |  | 
|  | 6528 | if(imageSize != es2::ComputeCompressedSize(width, height, internalformat) * depth) | 
|  | 6529 | { | 
|  | 6530 | return error(GL_INVALID_VALUE); | 
|  | 6531 | } | 
|  | 6532 |  | 
|  | 6533 | es2::Context *context = es2::getContext(); | 
|  | 6534 |  | 
|  | 6535 | if(context) | 
|  | 6536 | { | 
|  | 6537 | es2::Texture3D *texture = context->getTexture3D(); | 
|  | 6538 |  | 
|  | 6539 | if(!texture) | 
|  | 6540 | { | 
|  | 6541 | return error(GL_INVALID_OPERATION); | 
|  | 6542 | } | 
|  | 6543 |  | 
|  | 6544 | texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6545 | } | 
|  | 6546 | } | 
|  | 6547 |  | 
|  | 6548 | void GL_APIENTRY glCompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data) | 
|  | 6549 | { | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6550 | TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, " | 
|  | 6551 | "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, " | 
|  | 6552 | "GLenum format = 0x%X, GLsizei imageSize = %d, const void *data = 0x%0.8p)", | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6553 | target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); | 
|  | 6554 |  | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6555 | switch(target) | 
|  | 6556 | { | 
|  | 6557 | case GL_TEXTURE_3D_OES: | 
|  | 6558 | break; | 
|  | 6559 | default: | 
|  | 6560 | return error(GL_INVALID_ENUM); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6561 | } | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6562 |  | 
|  | 6563 | if(xoffset < 0 || yoffset < 0 || zoffset < 0 || !validImageSize(level, width, height) || depth < 0 || imageSize < 0) | 
|  | 6564 | { | 
|  | 6565 | return error(GL_INVALID_VALUE); | 
|  | 6566 | } | 
|  | 6567 |  | 
|  | 6568 | switch(format) | 
|  | 6569 | { | 
|  | 6570 | case GL_ETC1_RGB8_OES: | 
|  | 6571 | break; | 
|  | 6572 | case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: | 
|  | 6573 | case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: | 
|  | 6574 | case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: | 
|  | 6575 | case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: | 
|  | 6576 | if(!S3TC_SUPPORT) | 
|  | 6577 | { | 
|  | 6578 | return error(GL_INVALID_ENUM); | 
|  | 6579 | } | 
|  | 6580 | break; | 
|  | 6581 | default: | 
|  | 6582 | return error(GL_INVALID_ENUM); | 
|  | 6583 | } | 
|  | 6584 |  | 
|  | 6585 | if(width == 0 || height == 0 || depth == 0 || data == NULL) | 
|  | 6586 | { | 
|  | 6587 | return; | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6588 | } | 
|  | 6589 |  | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6590 | es2::Context *context = es2::getContext(); | 
|  | 6591 |  | 
|  | 6592 | if(context) | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6593 | { | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6594 | es2::Texture3D *texture = context->getTexture3D(); | 
|  | 6595 |  | 
|  | 6596 | if(!texture) | 
|  | 6597 | { | 
|  | 6598 | return error(GL_INVALID_OPERATION); | 
|  | 6599 | } | 
|  | 6600 |  | 
|  | 6601 | texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); | 
|  | 6602 | } | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6603 | } | 
|  | 6604 |  | 
|  | 6605 | void GL_APIENTRY glFramebufferTexture3DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) | 
|  | 6606 | { | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6607 | TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, " | 
|  | 6608 | "GLuint texture = %d, GLint level = %d, GLint zoffset = %d)", target, attachment, textarget, texture, level, zoffset); | 
|  | 6609 |  | 
|  | 6610 | if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE) | 
|  | 6611 | { | 
|  | 6612 | return error(GL_INVALID_ENUM); | 
|  | 6613 | } | 
|  | 6614 |  | 
|  | 6615 | switch(attachment) | 
|  | 6616 | { | 
|  | 6617 | case GL_COLOR_ATTACHMENT0: | 
|  | 6618 | case GL_DEPTH_ATTACHMENT: | 
|  | 6619 | case GL_STENCIL_ATTACHMENT: | 
|  | 6620 | break; | 
|  | 6621 | default: | 
|  | 6622 | return error(GL_INVALID_ENUM); | 
|  | 6623 | } | 
|  | 6624 |  | 
|  | 6625 | es2::Context *context = es2::getContext(); | 
|  | 6626 |  | 
|  | 6627 | if(context) | 
|  | 6628 | { | 
|  | 6629 | if(texture == 0) | 
|  | 6630 | { | 
|  | 6631 | textarget = GL_NONE; | 
|  | 6632 | } | 
|  | 6633 | else | 
|  | 6634 | { | 
|  | 6635 | es2::Texture *tex = context->getTexture(texture); | 
|  | 6636 |  | 
|  | 6637 | if(tex == NULL) | 
|  | 6638 | { | 
|  | 6639 | return error(GL_INVALID_OPERATION); | 
|  | 6640 | } | 
|  | 6641 |  | 
|  | 6642 | if(tex->isCompressed(textarget, level)) | 
|  | 6643 | { | 
|  | 6644 | return error(GL_INVALID_OPERATION); | 
|  | 6645 | } | 
|  | 6646 |  | 
|  | 6647 | switch(textarget) | 
|  | 6648 | { | 
|  | 6649 | case GL_TEXTURE_3D_OES: | 
|  | 6650 | if(tex->getTarget() != GL_TEXTURE_3D_OES) | 
|  | 6651 | { | 
|  | 6652 | return error(GL_INVALID_OPERATION); | 
|  | 6653 | } | 
|  | 6654 | break; | 
|  | 6655 | default: | 
|  | 6656 | return error(GL_INVALID_ENUM); | 
|  | 6657 | } | 
|  | 6658 |  | 
|  | 6659 | if(level != 0) | 
|  | 6660 | { | 
|  | 6661 | return error(GL_INVALID_VALUE); | 
|  | 6662 | } | 
|  | 6663 | } | 
|  | 6664 |  | 
|  | 6665 | es2::Framebuffer *framebuffer = NULL; | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6666 | GLuint framebufferName = 0; | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6667 | if(target == GL_READ_FRAMEBUFFER_ANGLE) | 
|  | 6668 | { | 
|  | 6669 | framebuffer = context->getReadFramebuffer(); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6670 | framebufferName = context->getReadFramebufferName(); | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6671 | } | 
|  | 6672 | else | 
|  | 6673 | { | 
|  | 6674 | framebuffer = context->getDrawFramebuffer(); | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6675 | framebufferName = context->getDrawFramebufferName(); | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6676 | } | 
|  | 6677 |  | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6678 | if(framebufferName == 0 || !framebuffer) | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6679 | { | 
|  | 6680 | return error(GL_INVALID_OPERATION); | 
|  | 6681 | } | 
|  | 6682 |  | 
|  | 6683 | switch(attachment) | 
|  | 6684 | { | 
|  | 6685 | case GL_COLOR_ATTACHMENT0:  framebuffer->setColorbuffer(textarget, texture);   break; | 
|  | 6686 | case GL_DEPTH_ATTACHMENT:   framebuffer->setDepthbuffer(textarget, texture);   break; | 
|  | 6687 | case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break; | 
|  | 6688 | } | 
| Nicolas Capens | 7cc75e1 | 2015-01-29 14:44:24 -0500 | [diff] [blame] | 6689 | } | 
|  | 6690 | } | 
| Alexis Hetu | b027aa9 | 2015-01-19 15:56:12 -0500 | [diff] [blame] | 6691 |  | 
| Nicolas Capens | e9c5e4f | 2014-05-28 22:46:43 -0400 | [diff] [blame] | 6692 | void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image) | 
|  | 6693 | { | 
| Nicolas Capens | d76b5df | 2014-10-28 15:54:46 -0400 | [diff] [blame] | 6694 | if(egl::getClientVersion() == 1) | 
|  | 6695 | { | 
| Nicolas Capens | f3d2efd | 2014-10-29 11:27:55 -0400 | [diff] [blame] | 6696 | static auto glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)es1::getProcAddress("glEGLImageTargetTexture2DOES"); | 
| Nicolas Capens | d76b5df | 2014-10-28 15:54:46 -0400 | [diff] [blame] | 6697 | return glEGLImageTargetTexture2DOES(target, image); | 
|  | 6698 | } | 
|  | 6699 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6700 | TRACE("(GLenum target = 0x%X, GLeglImageOES image = 0x%0.8p)", target, image); | 
| Nicolas Capens | e9c5e4f | 2014-05-28 22:46:43 -0400 | [diff] [blame] | 6701 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6702 | switch(target) | 
|  | 6703 | { | 
|  | 6704 | case GL_TEXTURE_2D: | 
|  | 6705 | case GL_TEXTURE_EXTERNAL_OES: | 
|  | 6706 | break; | 
|  | 6707 | default: | 
|  | 6708 | return error(GL_INVALID_ENUM); | 
|  | 6709 | } | 
| Nicolas Capens | e9c5e4f | 2014-05-28 22:46:43 -0400 | [diff] [blame] | 6710 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6711 | if(!image) | 
|  | 6712 | { | 
|  | 6713 | return error(GL_INVALID_OPERATION); | 
|  | 6714 | } | 
| Nicolas Capens | e9c5e4f | 2014-05-28 22:46:43 -0400 | [diff] [blame] | 6715 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6716 | es2::Context *context = es2::getContext(); | 
| Nicolas Capens | e9c5e4f | 2014-05-28 22:46:43 -0400 | [diff] [blame] | 6717 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6718 | if(context) | 
|  | 6719 | { | 
|  | 6720 | es2::Texture2D *texture = 0; | 
| Nicolas Capens | 08e90f0 | 2014-11-21 12:49:12 -0500 | [diff] [blame] | 6721 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6722 | switch(target) | 
|  | 6723 | { | 
|  | 6724 | case GL_TEXTURE_2D:           texture = context->getTexture2D();       break; | 
|  | 6725 | case GL_TEXTURE_EXTERNAL_OES: texture = context->getTextureExternal(); break; | 
|  | 6726 | default:                      UNREACHABLE(); | 
|  | 6727 | } | 
| Nicolas Capens | e9c5e4f | 2014-05-28 22:46:43 -0400 | [diff] [blame] | 6728 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6729 | if(!texture) | 
|  | 6730 | { | 
|  | 6731 | return error(GL_INVALID_OPERATION); | 
|  | 6732 | } | 
| Nicolas Capens | e9c5e4f | 2014-05-28 22:46:43 -0400 | [diff] [blame] | 6733 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6734 | egl::Image *glImage = static_cast<egl::Image*>(image); | 
| Nicolas Capens | e9c5e4f | 2014-05-28 22:46:43 -0400 | [diff] [blame] | 6735 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6736 | texture->setImage(glImage); | 
|  | 6737 | } | 
| Nicolas Capens | e9c5e4f | 2014-05-28 22:46:43 -0400 | [diff] [blame] | 6738 | } | 
|  | 6739 |  | 
| Nicolas Capens | 7e12ac6 | 2014-11-05 17:07:53 -0500 | [diff] [blame] | 6740 | void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image) | 
|  | 6741 | { | 
|  | 6742 | TRACE("(GLenum target = 0x%X, GLeglImageOES image = 0x%0.8p)", target, image); | 
|  | 6743 |  | 
|  | 6744 | UNIMPLEMENTED(); | 
|  | 6745 | } | 
|  | 6746 |  | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6747 | __eglMustCastToProperFunctionPointerType glGetProcAddress(const char *procname) | 
|  | 6748 | { | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6749 | struct Extension | 
|  | 6750 | { | 
|  | 6751 | const char *name; | 
|  | 6752 | __eglMustCastToProperFunctionPointerType address; | 
|  | 6753 | }; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6754 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6755 | static const Extension glExtensions[] = | 
|  | 6756 | { | 
| Nicolas Capens | f6b6d27 | 2014-11-03 11:11:08 -0500 | [diff] [blame] | 6757 | #define EXTENSION(name) {#name, (__eglMustCastToProperFunctionPointerType)name} | 
|  | 6758 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6759 | EXTENSION(glTexImage3DOES), | 
|  | 6760 | EXTENSION(glBlitFramebufferANGLE), | 
| Alexis Hetu | e9233fb | 2015-02-11 10:31:58 -0500 | [diff] [blame] | 6761 | EXTENSION(glBlitFramebufferNV), | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6762 | EXTENSION(glRenderbufferStorageMultisampleANGLE), | 
|  | 6763 | EXTENSION(glDeleteFencesNV), | 
|  | 6764 | EXTENSION(glGenFencesNV), | 
|  | 6765 | EXTENSION(glIsFenceNV), | 
|  | 6766 | EXTENSION(glTestFenceNV), | 
|  | 6767 | EXTENSION(glGetFenceivNV), | 
|  | 6768 | EXTENSION(glFinishFenceNV), | 
|  | 6769 | EXTENSION(glSetFenceNV), | 
| Nicolas Capens | f6b6d27 | 2014-11-03 11:11:08 -0500 | [diff] [blame] | 6770 | EXTENSION(glGetGraphicsResetStatusEXT), | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6771 | EXTENSION(glReadnPixelsEXT), | 
|  | 6772 | EXTENSION(glGetnUniformfvEXT), | 
|  | 6773 | EXTENSION(glGetnUniformivEXT), | 
| Nicolas Capens | f6b6d27 | 2014-11-03 11:11:08 -0500 | [diff] [blame] | 6774 | EXTENSION(glGenQueriesEXT), | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6775 | EXTENSION(glDeleteQueriesEXT), | 
|  | 6776 | EXTENSION(glIsQueryEXT), | 
|  | 6777 | EXTENSION(glBeginQueryEXT), | 
|  | 6778 | EXTENSION(glEndQueryEXT), | 
|  | 6779 | EXTENSION(glGetQueryivEXT), | 
|  | 6780 | EXTENSION(glGetQueryObjectuivEXT), | 
|  | 6781 | EXTENSION(glEGLImageTargetTexture2DOES), | 
| Nicolas Capens | 7e12ac6 | 2014-11-05 17:07:53 -0500 | [diff] [blame] | 6782 | EXTENSION(glEGLImageTargetRenderbufferStorageOES), | 
| Nicolas Capens | f6b6d27 | 2014-11-03 11:11:08 -0500 | [diff] [blame] | 6783 |  | 
|  | 6784 | #undef EXTENSION | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6785 | }; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6786 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6787 | for(int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++) | 
|  | 6788 | { | 
|  | 6789 | if(strcmp(procname, glExtensions[ext].name) == 0) | 
|  | 6790 | { | 
|  | 6791 | return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address; | 
|  | 6792 | } | 
|  | 6793 | } | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6794 |  | 
| Nicolas Capens | f160b17 | 2014-11-26 11:58:23 -0500 | [diff] [blame] | 6795 | return NULL; | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6796 | } | 
|  | 6797 |  | 
| John Bauman | d4ae863 | 2014-05-06 16:18:33 -0400 | [diff] [blame] | 6798 | void GL_APIENTRY Register(const char *licenseKey) | 
|  | 6799 | { | 
|  | 6800 | RegisterLicenseKey(licenseKey); | 
|  | 6801 | } | 
|  | 6802 |  | 
| John Bauman | 66b8ab2 | 2014-05-06 15:57:45 -0400 | [diff] [blame] | 6803 | } |