1/*------------------------------------------------------------------------- 2 * drawElements Quality Program OpenGL ES 3.0 Module 3 * ------------------------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Negative Texture API tests. 22 *//*--------------------------------------------------------------------*/ 23 24#include "es3fNegativeTextureApiTests.hpp" 25#include "es3fApiCase.hpp" 26#include "gluContextInfo.hpp" 27#include "tcuFormatUtil.hpp" 28#include "gluTextureUtil.hpp" 29 30#include <vector> 31#include <algorithm> 32 33#include "glwDefs.hpp" 34#include "glwEnums.hpp" 35 36using namespace glw; // GL types 37 38namespace deqp 39{ 40namespace gles3 41{ 42namespace Functional 43{ 44 45using tcu::TestLog; 46using tcu::CompressedTexFormat; 47using tcu::getBlockSize; 48using tcu::getBlockPixelSize; 49using tcu::IVec3; 50using glu::mapGLCompressedTexFormat; 51using std::vector; 52 53static inline int divRoundUp (int a, int b) 54{ 55 return a/b + (a%b != 0 ? 1 : 0); 56} 57 58static inline int etc2DataSize (int width, int height) 59{ 60 return (int)(divRoundUp(width, 4) * divRoundUp(height, 4) * sizeof(deUint64)); 61} 62 63static inline int etc2EacDataSize (int width, int height) 64{ 65 return 2 * etc2DataSize(width, height); 66} 67 68static const GLuint s_astcFormats[] = 69{ 70 GL_COMPRESSED_RGBA_ASTC_4x4_KHR, 71 GL_COMPRESSED_RGBA_ASTC_5x4_KHR, 72 GL_COMPRESSED_RGBA_ASTC_5x5_KHR, 73 GL_COMPRESSED_RGBA_ASTC_6x5_KHR, 74 GL_COMPRESSED_RGBA_ASTC_6x6_KHR, 75 GL_COMPRESSED_RGBA_ASTC_8x5_KHR, 76 GL_COMPRESSED_RGBA_ASTC_8x6_KHR, 77 GL_COMPRESSED_RGBA_ASTC_8x8_KHR, 78 GL_COMPRESSED_RGBA_ASTC_10x5_KHR, 79 GL_COMPRESSED_RGBA_ASTC_10x6_KHR, 80 GL_COMPRESSED_RGBA_ASTC_10x8_KHR, 81 GL_COMPRESSED_RGBA_ASTC_10x10_KHR, 82 GL_COMPRESSED_RGBA_ASTC_12x10_KHR, 83 GL_COMPRESSED_RGBA_ASTC_12x12_KHR, 84 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, 85 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, 86 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, 87 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, 88 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, 89 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, 90 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, 91 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, 92 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, 93 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, 94 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, 95 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 96 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 97 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 98}; 99 100static deUint32 cubeFaceToGLFace (tcu::CubeFace face) 101{ 102 switch (face) 103 { 104 case tcu::CUBEFACE_NEGATIVE_X: return GL_TEXTURE_CUBE_MAP_NEGATIVE_X; 105 case tcu::CUBEFACE_POSITIVE_X: return GL_TEXTURE_CUBE_MAP_POSITIVE_X; 106 case tcu::CUBEFACE_NEGATIVE_Y: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Y; 107 case tcu::CUBEFACE_POSITIVE_Y: return GL_TEXTURE_CUBE_MAP_POSITIVE_Y; 108 case tcu::CUBEFACE_NEGATIVE_Z: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; 109 case tcu::CUBEFACE_POSITIVE_Z: return GL_TEXTURE_CUBE_MAP_POSITIVE_Z; 110 default: 111 DE_ASSERT(DE_FALSE); 112 return GL_NONE; 113 } 114} 115 116#define FOR_CUBE_FACES(FACE_GL_VAR, BODY) \ 117 do \ 118 { \ 119 for (int faceIterTcu = 0; faceIterTcu < tcu::CUBEFACE_LAST; faceIterTcu++) \ 120 { \ 121 const GLenum FACE_GL_VAR = cubeFaceToGLFace((tcu::CubeFace)faceIterTcu); \ 122 BODY \ 123 } \ 124 } while (false) 125 126NegativeTextureApiTests::NegativeTextureApiTests (Context& context) 127 : TestCaseGroup(context, "texture", "Negative Texture API Cases") 128{ 129} 130 131NegativeTextureApiTests::~NegativeTextureApiTests (void) 132{ 133} 134 135void NegativeTextureApiTests::init (void) 136{ 137 // glActiveTexture 138 139 ES3F_ADD_API_CASE(activetexture, "Invalid glActiveTexture() usage", 140 { 141 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if texture is not one of GL_TEXTUREi, where i ranges from 0 to (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)."); 142 glActiveTexture(-1); 143 expectError(GL_INVALID_ENUM); 144 int numMaxTextureUnits = m_context.getContextInfo().getInt(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS); 145 glActiveTexture(GL_TEXTURE0 + numMaxTextureUnits); 146 expectError(GL_INVALID_ENUM); 147 m_log << TestLog::EndSection; 148 }); 149 150 // glBindTexture 151 152 ES3F_ADD_API_CASE(bindtexture, "Invalid glBindTexture() usage", 153 { 154 GLuint texture[2]; 155 glGenTextures(2, texture); 156 157 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not one of the allowable values."); 158 glBindTexture(0, 1); 159 expectError(GL_INVALID_ENUM); 160 glBindTexture(GL_FRAMEBUFFER, 1); 161 expectError(GL_INVALID_ENUM); 162 m_log << TestLog::EndSection; 163 164 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if texture was previously created with a target that doesn't match that of target."); 165 glBindTexture(GL_TEXTURE_2D, texture[0]); 166 expectError(GL_NO_ERROR); 167 glBindTexture(GL_TEXTURE_CUBE_MAP, texture[0]); 168 expectError(GL_INVALID_OPERATION); 169 glBindTexture(GL_TEXTURE_3D, texture[0]); 170 expectError(GL_INVALID_OPERATION); 171 glBindTexture(GL_TEXTURE_2D_ARRAY, texture[0]); 172 expectError(GL_INVALID_OPERATION); 173 174 glBindTexture(GL_TEXTURE_CUBE_MAP, texture[1]); 175 expectError(GL_NO_ERROR); 176 glBindTexture(GL_TEXTURE_2D, texture[1]); 177 expectError(GL_INVALID_OPERATION); 178 glBindTexture(GL_TEXTURE_3D, texture[1]); 179 expectError(GL_INVALID_OPERATION); 180 glBindTexture(GL_TEXTURE_2D_ARRAY, texture[1]); 181 expectError(GL_INVALID_OPERATION); 182 m_log << TestLog::EndSection; 183 184 glDeleteTextures(2, texture); 185 }); 186 187 // glCompressedTexImage2D 188 189 ES3F_ADD_API_CASE(compressedteximage2d_invalid_target, "Invalid glCompressedTexImage2D() usage", 190 { 191 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid."); 192 glCompressedTexImage2D(0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0); 193 expectError(GL_INVALID_ENUM); 194 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0); 195 expectError(GL_INVALID_ENUM); 196 m_log << TestLog::EndSection; 197 }); 198 ES3F_ADD_API_CASE(compressedteximage2d_invalid_format, "Invalid glCompressedTexImage2D() usage", 199 { 200 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if internalformat is not a supported format returned in GL_COMPRESSED_TEXTURE_FORMATS."); 201 glCompressedTexImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 0); 202 expectError(GL_INVALID_ENUM); 203 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 0, 0, 0); 204 expectError(GL_INVALID_ENUM); 205 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 0, 0, 0, 0, 0); 206 expectError(GL_INVALID_ENUM); 207 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 0, 0, 0, 0); 208 expectError(GL_INVALID_ENUM); 209 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, 0, 0, 0, 0); 210 expectError(GL_INVALID_ENUM); 211 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, 0, 0, 0, 0); 212 expectError(GL_INVALID_ENUM); 213 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, 0, 0, 0, 0); 214 expectError(GL_INVALID_ENUM); 215 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, 0, 0, 0, 0); 216 expectError(GL_INVALID_ENUM); 217 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, 0, 0, 0, 0); 218 expectError(GL_INVALID_ENUM); 219 m_log << TestLog::EndSection; 220 }); 221 ES3F_ADD_API_CASE(compressedteximage2d_neg_level, "Invalid glCompressedTexImage2D() usage", 222 { 223 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 224 glCompressedTexImage2D(GL_TEXTURE_2D, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0); 225 expectError(GL_INVALID_VALUE); 226 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0); 227 expectError(GL_INVALID_VALUE); 228 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0); 229 expectError(GL_INVALID_VALUE); 230 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0); 231 expectError(GL_INVALID_VALUE); 232 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0); 233 expectError(GL_INVALID_VALUE); 234 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0); 235 expectError(GL_INVALID_VALUE); 236 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0); 237 expectError(GL_INVALID_VALUE); 238 m_log << TestLog::EndSection; 239 }); 240 ES3F_ADD_API_CASE(compressedteximage2d_max_level, "Invalid glCompressedTexImage2D() usage", 241 { 242 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE) for a 2d texture target."); 243 deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1; 244 glCompressedTexImage2D(GL_TEXTURE_2D, log2MaxTextureSize, GL_COMPRESSED_RGB8_ETC2, 16, 16, 0, etc2DataSize(16, 16), 0); 245 expectError(GL_INVALID_VALUE); 246 m_log << TestLog::EndSection; 247 248 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE) for a cubemap target."); 249 deUint32 log2MaxCubemapSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1; 250 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0); 251 expectError(GL_INVALID_VALUE); 252 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0); 253 expectError(GL_INVALID_VALUE); 254 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0); 255 expectError(GL_INVALID_VALUE); 256 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0); 257 expectError(GL_INVALID_VALUE); 258 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0); 259 expectError(GL_INVALID_VALUE); 260 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxCubemapSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0); 261 expectError(GL_INVALID_VALUE); 262 m_log << TestLog::EndSection; 263 }); 264 ES3F_ADD_API_CASE(compressedteximage2d_neg_width_height, "Invalid glCompressedTexImage2D() usage", 265 { 266 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0."); 267 268 m_log << TestLog::Section("", "GL_TEXTURE_2D target"); 269 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0); 270 expectError(GL_INVALID_VALUE); 271 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0); 272 expectError(GL_INVALID_VALUE); 273 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0); 274 expectError(GL_INVALID_VALUE); 275 m_log << TestLog::EndSection; 276 277 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target"); 278 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0); 279 expectError(GL_INVALID_VALUE); 280 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0); 281 expectError(GL_INVALID_VALUE); 282 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0); 283 expectError(GL_INVALID_VALUE); 284 m_log << TestLog::EndSection; 285 286 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target"); 287 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0); 288 expectError(GL_INVALID_VALUE); 289 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0); 290 expectError(GL_INVALID_VALUE); 291 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0); 292 expectError(GL_INVALID_VALUE); 293 m_log << TestLog::EndSection; 294 295 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target"); 296 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0); 297 expectError(GL_INVALID_VALUE); 298 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0); 299 expectError(GL_INVALID_VALUE); 300 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0); 301 expectError(GL_INVALID_VALUE); 302 m_log << TestLog::EndSection; 303 304 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target"); 305 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0); 306 expectError(GL_INVALID_VALUE); 307 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0); 308 expectError(GL_INVALID_VALUE); 309 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0); 310 expectError(GL_INVALID_VALUE); 311 m_log << TestLog::EndSection; 312 313 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target"); 314 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0); 315 expectError(GL_INVALID_VALUE); 316 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0); 317 expectError(GL_INVALID_VALUE); 318 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0); 319 expectError(GL_INVALID_VALUE); 320 m_log << TestLog::EndSection; 321 322 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target"); 323 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0); 324 expectError(GL_INVALID_VALUE); 325 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0); 326 expectError(GL_INVALID_VALUE); 327 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, 0, 0, 0); 328 expectError(GL_INVALID_VALUE); 329 m_log << TestLog::EndSection; 330 331 m_log << TestLog::EndSection; 332 }); 333 ES3F_ADD_API_CASE(compressedteximage2d_max_width_height, "Invalid glCompressedTexImage2D() usage", 334 { 335 int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE) + 1; 336 int maxCubemapSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1; 337 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_TEXTURE_SIZE."); 338 339 m_log << TestLog::Section("", "GL_TEXTURE_2D target"); 340 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxTextureSize, 1, 0, etc2EacDataSize(maxTextureSize, 1), 0); 341 expectError(GL_INVALID_VALUE); 342 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxTextureSize, 0, etc2EacDataSize(1, maxTextureSize), 0); 343 expectError(GL_INVALID_VALUE); 344 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxTextureSize, maxTextureSize, 0, etc2EacDataSize(maxTextureSize, maxTextureSize), 0); 345 expectError(GL_INVALID_VALUE); 346 m_log << TestLog::EndSection; 347 348 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target"); 349 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0, etc2EacDataSize(maxCubemapSize, 1), 0); 350 expectError(GL_INVALID_VALUE); 351 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0, etc2EacDataSize(1, maxCubemapSize), 0); 352 expectError(GL_INVALID_VALUE); 353 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0); 354 expectError(GL_INVALID_VALUE); 355 m_log << TestLog::EndSection; 356 357 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target"); 358 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0, etc2EacDataSize(maxCubemapSize, 1), 0); 359 expectError(GL_INVALID_VALUE); 360 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0, etc2EacDataSize(1, maxCubemapSize), 0); 361 expectError(GL_INVALID_VALUE); 362 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0); 363 expectError(GL_INVALID_VALUE); 364 m_log << TestLog::EndSection; 365 366 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target"); 367 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0, etc2EacDataSize(maxCubemapSize, 1), 0); 368 expectError(GL_INVALID_VALUE); 369 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0, etc2EacDataSize(1, maxCubemapSize), 0); 370 expectError(GL_INVALID_VALUE); 371 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0); 372 expectError(GL_INVALID_VALUE); 373 m_log << TestLog::EndSection; 374 375 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target"); 376 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0, etc2EacDataSize(maxCubemapSize, 1), 0); 377 expectError(GL_INVALID_VALUE); 378 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0, etc2EacDataSize(1, maxCubemapSize), 0); 379 expectError(GL_INVALID_VALUE); 380 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0); 381 expectError(GL_INVALID_VALUE); 382 m_log << TestLog::EndSection; 383 384 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target"); 385 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0, etc2EacDataSize(maxCubemapSize, 1), 0); 386 expectError(GL_INVALID_VALUE); 387 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0, etc2EacDataSize(1, maxCubemapSize), 0); 388 expectError(GL_INVALID_VALUE); 389 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0); 390 expectError(GL_INVALID_VALUE); 391 m_log << TestLog::EndSection; 392 393 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target"); 394 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, 1, 0, etc2EacDataSize(maxCubemapSize, 1), 0); 395 expectError(GL_INVALID_VALUE); 396 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 1, maxCubemapSize, 0, etc2EacDataSize(1, maxCubemapSize), 0); 397 expectError(GL_INVALID_VALUE); 398 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxCubemapSize, maxCubemapSize, 0, etc2EacDataSize(maxCubemapSize, maxCubemapSize), 0); 399 expectError(GL_INVALID_VALUE); 400 m_log << TestLog::EndSection; 401 402 m_log << TestLog::EndSection; 403 }); 404 ES3F_ADD_API_CASE(compressedteximage2d_invalid_border, "Invalid glCompressedTexImage2D() usage", 405 { 406 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0."); 407 408 m_log << TestLog::Section("", "GL_TEXTURE_2D target"); 409 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0); 410 expectError(GL_INVALID_VALUE); 411 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0); 412 expectError(GL_INVALID_VALUE); 413 m_log << TestLog::EndSection; 414 415 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target"); 416 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0); 417 expectError(GL_INVALID_VALUE); 418 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0); 419 expectError(GL_INVALID_VALUE); 420 m_log << TestLog::EndSection; 421 422 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target"); 423 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0); 424 expectError(GL_INVALID_VALUE); 425 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0); 426 expectError(GL_INVALID_VALUE); 427 m_log << TestLog::EndSection; 428 429 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target"); 430 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0); 431 expectError(GL_INVALID_VALUE); 432 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0); 433 expectError(GL_INVALID_VALUE); 434 m_log << TestLog::EndSection; 435 436 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target"); 437 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0); 438 expectError(GL_INVALID_VALUE); 439 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0); 440 expectError(GL_INVALID_VALUE); 441 m_log << TestLog::EndSection; 442 443 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target"); 444 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0); 445 expectError(GL_INVALID_VALUE); 446 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0); 447 expectError(GL_INVALID_VALUE); 448 m_log << TestLog::EndSection; 449 450 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target"); 451 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0); 452 expectError(GL_INVALID_VALUE); 453 glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0); 454 expectError(GL_INVALID_VALUE); 455 m_log << TestLog::EndSection; 456 457 m_log << TestLog::EndSection; 458 }); 459 ES3F_ADD_API_CASE(compressedteximage2d_invalid_size, "Invalid glCompressedTexImage2D() usage", 460 { 461 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if imageSize is not consistent with the format, dimensions, and contents of the specified compressed image data."); 462 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, -1, 0); 463 expectError(GL_INVALID_VALUE); 464 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, 4*4*8, 0); 465 expectError(GL_INVALID_VALUE); 466 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 0, 4*4*16, 0); 467 expectError(GL_INVALID_VALUE); 468 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SIGNED_R11_EAC, 16, 16, 0, 4*4*16, 0); 469 expectError(GL_INVALID_VALUE); 470 m_log << TestLog::EndSection; 471 }); 472 ES3F_ADD_API_CASE(compressedteximage2d_invalid_buffer_target, "Invalid glCompressedTexImage2D() usage", 473 { 474 deUint32 buf; 475 std::vector<GLubyte> data(64); 476 477 glGenBuffers (1, &buf); 478 glBindBuffer (GL_PIXEL_UNPACK_BUFFER, buf); 479 glBufferData (GL_PIXEL_UNPACK_BUFFER, 64, &data[0], GL_DYNAMIC_COPY); 480 expectError (GL_NO_ERROR); 481 482 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and the buffer object's data store is currently mapped."); 483 glMapBufferRange (GL_PIXEL_UNPACK_BUFFER, 0, 32, GL_MAP_WRITE_BIT); 484 glCompressedTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 4, 4, 0, etc2DataSize(4, 4), 0); 485 expectError (GL_INVALID_OPERATION); 486 glUnmapBuffer (GL_PIXEL_UNPACK_BUFFER); 487 m_log << TestLog::EndSection; 488 489 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size."); 490 glCompressedTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 0, etc2DataSize(16, 16), 0); 491 expectError (GL_INVALID_OPERATION); 492 m_log << TestLog::EndSection; 493 494 glDeleteBuffers (1, &buf); 495 }); 496 ES3F_ADD_API_CASE(compressedteximage2d_invalid_astc_target, "ASTC formats should not be supported without a proper extension.", 497 { 498 if (m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_ldr")) 499 { 500 m_log.writeMessage("ASTC supported. No negative API requirements."); 501 } 502 else 503 { 504 m_log.writeMessage("GL_INVALID_ENUM should be generated if no ASTC extensions are present."); 505 506 for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_astcFormats); formatNdx++) 507 { 508 const GLuint format = s_astcFormats[formatNdx]; 509 const CompressedTexFormat tcuFormat = mapGLCompressedTexFormat(format); 510 const IVec3 blockPixels = getBlockPixelSize(tcuFormat); 511 { 512 const size_t blockBytes = getBlockSize(tcuFormat); 513 const vector<deUint8> dummyData (blockBytes); 514 515 glCompressedTexImage2D(GL_TEXTURE_2D, 0, format, blockPixels.x(), blockPixels.y(), 0, blockBytes, &dummyData[0]); 516 expectError(GL_INVALID_ENUM); 517 } 518 FOR_CUBE_FACES(faceGL, 519 { 520 const deInt32 cubeSize = blockPixels.x() * blockPixels.y(); // Divisible by the block size and square 521 const size_t blockBytes = getBlockSize(tcuFormat) * cubeSize; // We have a x * y grid of blocks 522 const vector<deUint8> dummyData (blockBytes); 523 524 glCompressedTexImage2D(faceGL, 0, format, cubeSize, cubeSize, 0, blockBytes, &dummyData[0]); 525 expectError(GL_INVALID_ENUM); 526 }); 527 } 528 } 529 }); 530 531 // glCopyTexImage2D 532 533 ES3F_ADD_API_CASE(copyteximage2d_invalid_target, "Invalid glCopyTexImage2D() usage", 534 { 535 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid."); 536 glCopyTexImage2D(0, 0, GL_RGB, 0, 0, 64, 64, 0); 537 expectError(GL_INVALID_ENUM); 538 m_log << TestLog::EndSection; 539 }); 540 ES3F_ADD_API_CASE(copyteximage2d_invalid_format, "Invalid glCopyTexImage2D() usage", 541 { 542 m_log << TestLog::Section("", "GL_INVALID_ENUM or GL_INVALID_VALUE is generated if internalformat is not an accepted format."); 543 glCopyTexImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 64, 64, 0); 544 expectError(GL_INVALID_ENUM, GL_INVALID_VALUE); 545 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 0, 16, 16, 0); 546 expectError(GL_INVALID_ENUM, GL_INVALID_VALUE); 547 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, 0, 16, 16, 0); 548 expectError(GL_INVALID_ENUM, GL_INVALID_VALUE); 549 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, 0, 16, 16, 0); 550 expectError(GL_INVALID_ENUM, GL_INVALID_VALUE); 551 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, 0, 16, 16, 0); 552 expectError(GL_INVALID_ENUM, GL_INVALID_VALUE); 553 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, 0, 16, 16, 0); 554 expectError(GL_INVALID_ENUM, GL_INVALID_VALUE); 555 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, 0, 16, 16, 0); 556 expectError(GL_INVALID_ENUM, GL_INVALID_VALUE); 557 m_log << TestLog::EndSection; 558 }); 559 ES3F_ADD_API_CASE(copyteximage2d_inequal_width_height_cube, "Invalid glCopyTexImage2D() usage", 560 { 561 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if target is one of the six cube map 2D image targets and the width and height parameters are not equal."); 562 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 16, 17, 0); 563 expectError(GL_INVALID_VALUE); 564 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 16, 17, 0); 565 expectError(GL_INVALID_VALUE); 566 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 16, 17, 0); 567 expectError(GL_INVALID_VALUE); 568 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 16, 17, 0); 569 expectError(GL_INVALID_VALUE); 570 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 16, 17, 0); 571 expectError(GL_INVALID_VALUE); 572 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 16, 17, 0); 573 expectError(GL_INVALID_VALUE); 574 m_log << TestLog::EndSection; 575 }); 576 ES3F_ADD_API_CASE(copyteximage2d_neg_level, "Invalid glCopyTexImage2D() usage", 577 { 578 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 579 glCopyTexImage2D(GL_TEXTURE_2D, -1, GL_RGB, 0, 0, 64, 64, 0); 580 expectError(GL_INVALID_VALUE); 581 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, GL_RGB, 0, 0, 16, 16, 0); 582 expectError(GL_INVALID_VALUE); 583 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, GL_RGB, 0, 0, 16, 16, 0); 584 expectError(GL_INVALID_VALUE); 585 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, GL_RGB, 0, 0, 16, 16, 0); 586 expectError(GL_INVALID_VALUE); 587 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, GL_RGB, 0, 0, 16, 16, 0); 588 expectError(GL_INVALID_VALUE); 589 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, GL_RGB, 0, 0, 16, 16, 0); 590 expectError(GL_INVALID_VALUE); 591 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, GL_RGB, 0, 0, 16, 16, 0); 592 expectError(GL_INVALID_VALUE); 593 m_log << TestLog::EndSection; 594 }); 595 ES3F_ADD_API_CASE(copyteximage2d_max_level, "Invalid glCopyTexImage2D() usage", 596 { 597 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE)."); 598 deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1; 599 glCopyTexImage2D(GL_TEXTURE_2D, log2MaxTextureSize, GL_RGB, 0, 0, 64, 64, 0); 600 expectError(GL_INVALID_VALUE); 601 m_log << TestLog::EndSection; 602 603 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE)."); 604 deUint32 log2MaxCubemapSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1; 605 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0); 606 expectError(GL_INVALID_VALUE); 607 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0); 608 expectError(GL_INVALID_VALUE); 609 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0); 610 expectError(GL_INVALID_VALUE); 611 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0); 612 expectError(GL_INVALID_VALUE); 613 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0); 614 expectError(GL_INVALID_VALUE); 615 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxCubemapSize, GL_RGB, 0, 0, 16, 16, 0); 616 expectError(GL_INVALID_VALUE); 617 m_log << TestLog::EndSection; 618 }); 619 ES3F_ADD_API_CASE(copyteximage2d_neg_width_height, "Invalid glCopyTexImage2D() usage", 620 { 621 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0."); 622 623 m_log << TestLog::Section("", "GL_TEXTURE_2D target"); 624 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, -1, 1, 0); 625 expectError(GL_INVALID_VALUE); 626 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, -1, 0); 627 expectError(GL_INVALID_VALUE); 628 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, -1, -1, 0); 629 expectError(GL_INVALID_VALUE); 630 m_log << TestLog::EndSection; 631 632 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target"); 633 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, -1, 1, 0); 634 expectError(GL_INVALID_VALUE); 635 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 1, -1, 0); 636 expectError(GL_INVALID_VALUE); 637 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, -1, -1, 0); 638 expectError(GL_INVALID_VALUE); 639 m_log << TestLog::EndSection; 640 641 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target"); 642 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, -1, 1, 0); 643 expectError(GL_INVALID_VALUE); 644 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 1, -1, 0); 645 expectError(GL_INVALID_VALUE); 646 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, -1, -1, 0); 647 expectError(GL_INVALID_VALUE); 648 m_log << TestLog::EndSection; 649 650 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target"); 651 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, -1, 1, 0); 652 expectError(GL_INVALID_VALUE); 653 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 1, -1, 0); 654 expectError(GL_INVALID_VALUE); 655 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, -1, -1, 0); 656 expectError(GL_INVALID_VALUE); 657 m_log << TestLog::EndSection; 658 659 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target"); 660 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, -1, 1, 0); 661 expectError(GL_INVALID_VALUE); 662 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 1, -1, 0); 663 expectError(GL_INVALID_VALUE); 664 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, -1, -1, 0); 665 expectError(GL_INVALID_VALUE); 666 m_log << TestLog::EndSection; 667 668 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target"); 669 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, -1, 1, 0); 670 expectError(GL_INVALID_VALUE); 671 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 1, -1, 0); 672 expectError(GL_INVALID_VALUE); 673 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, -1, -1, 0); 674 expectError(GL_INVALID_VALUE); 675 m_log << TestLog::EndSection; 676 677 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target"); 678 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, -1, 1, 0); 679 expectError(GL_INVALID_VALUE); 680 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 1, -1, 0); 681 expectError(GL_INVALID_VALUE); 682 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, -1, -1, 0); 683 expectError(GL_INVALID_VALUE); 684 m_log << TestLog::EndSection; 685 686 m_log << TestLog::EndSection; 687 }); 688 ES3F_ADD_API_CASE(copyteximage2d_max_width_height, "Invalid glCopyTexImage2D() usage", 689 { 690 int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE) + 1; 691 int maxCubemapSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1; 692 693 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_TEXTURE_SIZE."); 694 695 m_log << TestLog::Section("", "GL_TEXTURE_2D target"); 696 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, maxTextureSize, 1, 0); 697 expectError(GL_INVALID_VALUE); 698 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, maxTextureSize, 0); 699 expectError(GL_INVALID_VALUE); 700 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, maxTextureSize, maxTextureSize, 0); 701 expectError(GL_INVALID_VALUE); 702 m_log << TestLog::EndSection; 703 704 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target"); 705 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0); 706 expectError(GL_INVALID_VALUE); 707 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0); 708 expectError(GL_INVALID_VALUE); 709 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0); 710 expectError(GL_INVALID_VALUE); 711 m_log << TestLog::EndSection; 712 713 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target"); 714 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0); 715 expectError(GL_INVALID_VALUE); 716 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0); 717 expectError(GL_INVALID_VALUE); 718 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0); 719 expectError(GL_INVALID_VALUE); 720 m_log << TestLog::EndSection; 721 722 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target"); 723 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0); 724 expectError(GL_INVALID_VALUE); 725 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0); 726 expectError(GL_INVALID_VALUE); 727 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0); 728 expectError(GL_INVALID_VALUE); 729 m_log << TestLog::EndSection; 730 731 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target"); 732 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0); 733 expectError(GL_INVALID_VALUE); 734 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0); 735 expectError(GL_INVALID_VALUE); 736 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0); 737 expectError(GL_INVALID_VALUE); 738 m_log << TestLog::EndSection; 739 740 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target"); 741 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0); 742 expectError(GL_INVALID_VALUE); 743 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0); 744 expectError(GL_INVALID_VALUE); 745 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0); 746 expectError(GL_INVALID_VALUE); 747 m_log << TestLog::EndSection; 748 749 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target"); 750 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 1, maxCubemapSize, 0); 751 expectError(GL_INVALID_VALUE); 752 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, maxCubemapSize, 1, 0); 753 expectError(GL_INVALID_VALUE); 754 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, maxCubemapSize, maxCubemapSize, 0); 755 expectError(GL_INVALID_VALUE); 756 m_log << TestLog::EndSection; 757 758 m_log << TestLog::EndSection; 759 }); 760 ES3F_ADD_API_CASE(copyteximage2d_invalid_border, "Invalid glCopyTexImage2D() usage", 761 { 762 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0."); 763 764 m_log << TestLog::Section("", "GL_TEXTURE_2D target"); 765 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 0, 0, -1); 766 expectError(GL_INVALID_VALUE); 767 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 0, 0, 1); 768 expectError(GL_INVALID_VALUE); 769 m_log << TestLog::EndSection; 770 771 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target"); 772 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 0, 0, -1); 773 expectError(GL_INVALID_VALUE); 774 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 0, 0, 1); 775 expectError(GL_INVALID_VALUE); 776 m_log << TestLog::EndSection; 777 778 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target"); 779 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 0, 0, -1); 780 expectError(GL_INVALID_VALUE); 781 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 0, 0, 0, 0, 1); 782 expectError(GL_INVALID_VALUE); 783 m_log << TestLog::EndSection; 784 785 m_log << TestLog::Section("", "GL_TEXTURE_2D target"); 786 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 0, 0, -1); 787 expectError(GL_INVALID_VALUE); 788 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 0, 0, 0, 0, 1); 789 expectError(GL_INVALID_VALUE); 790 m_log << TestLog::EndSection; 791 792 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target"); 793 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 0, 0, -1); 794 expectError(GL_INVALID_VALUE); 795 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 0, 0, 0, 0, 1); 796 expectError(GL_INVALID_VALUE); 797 m_log << TestLog::EndSection; 798 799 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target"); 800 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 0, 0, -1); 801 expectError(GL_INVALID_VALUE); 802 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 0, 0, 0, 0, 1); 803 expectError(GL_INVALID_VALUE); 804 m_log << TestLog::EndSection; 805 806 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target"); 807 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 0, 0, -1); 808 expectError(GL_INVALID_VALUE); 809 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 0, 0, 0, 0, 1); 810 expectError(GL_INVALID_VALUE); 811 m_log << TestLog::EndSection; 812 813 m_log << TestLog::EndSection; 814 }); 815 ES3F_ADD_API_CASE(copyteximage2d_incomplete_framebuffer, "Invalid glCopyTexImage2D() usage", 816 { 817 GLuint fbo; 818 glGenFramebuffers (1, &fbo); 819 glBindFramebuffer (GL_FRAMEBUFFER, fbo); 820 glCheckFramebufferStatus(GL_FRAMEBUFFER); 821 822 m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete."); 823 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, 0, 0, 0); 824 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 825 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA8, 0, 0, 0, 0, 0); 826 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 827 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA8, 0, 0, 0, 0, 0); 828 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 829 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA8, 0, 0, 0, 0, 0); 830 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 831 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA8, 0, 0, 0, 0, 0); 832 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 833 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA8, 0, 0, 0, 0, 0); 834 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 835 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA8, 0, 0, 0, 0, 0); 836 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 837 m_log << tcu::TestLog::EndSection; 838 839 glBindFramebuffer (GL_FRAMEBUFFER, 0); 840 glDeleteFramebuffers(1, &fbo); 841 }); 842 843 // glCopyTexSubImage2D 844 845 ES3F_ADD_API_CASE(copytexsubimage2d_invalid_target, "Invalid glCopyTexSubImage2D() usage", 846 { 847 GLuint texture; 848 glGenTextures (1, &texture); 849 glBindTexture (GL_TEXTURE_2D, texture); 850 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 851 852 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid."); 853 glCopyTexSubImage2D(0, 0, 0, 0, 0, 0, 4, 4); 854 expectError(GL_INVALID_ENUM); 855 m_log << TestLog::EndSection; 856 857 glDeleteTextures(1, &texture); 858 }); 859 ES3F_ADD_API_CASE(copytexsubimage2d_neg_level, "Invalid glCopyTexSubImage2D() usage", 860 { 861 GLuint textures[2]; 862 glGenTextures (2, &textures[0]); 863 glBindTexture (GL_TEXTURE_2D, textures[0]); 864 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 865 glBindTexture (GL_TEXTURE_CUBE_MAP, textures[1]); 866 FOR_CUBE_FACES(faceGL, glTexImage2D(faceGL, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);); 867 868 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 869 glCopyTexSubImage2D(GL_TEXTURE_2D, -1, 0, 0, 0, 0, 4, 4); 870 expectError(GL_INVALID_VALUE); 871 FOR_CUBE_FACES(faceGL, 872 { 873 glCopyTexSubImage2D(faceGL, -1, 0, 0, 0, 0, 4, 4); 874 expectError(GL_INVALID_VALUE); 875 }); 876 m_log << TestLog::EndSection; 877 878 glDeleteTextures(2, &textures[0]); 879 }); 880 ES3F_ADD_API_CASE(copytexsubimage2d_max_level, "Invalid glCopyTexSubImage2D() usage", 881 { 882 GLuint textures[2]; 883 glGenTextures (2, &textures[0]); 884 glBindTexture (GL_TEXTURE_2D, textures[0]); 885 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 886 glBindTexture (GL_TEXTURE_CUBE_MAP, textures[1]); 887 FOR_CUBE_FACES(faceGL, glTexImage2D(faceGL, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);); 888 889 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE) for 2D texture targets."); 890 deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1; 891 glCopyTexSubImage2D(GL_TEXTURE_2D, log2MaxTextureSize, 0, 0, 0, 0, 4, 4); 892 expectError(GL_INVALID_VALUE); 893 m_log << TestLog::EndSection; 894 895 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_SIZE) for cubemap targets."); 896 deUint32 log2MaxCubemapSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1; 897 FOR_CUBE_FACES(faceGL, 898 { 899 glCopyTexSubImage2D(faceGL, log2MaxCubemapSize, 0, 0, 0, 0, 4, 4); 900 expectError(GL_INVALID_VALUE); 901 }); 902 m_log << TestLog::EndSection; 903 904 glDeleteTextures(2, &textures[0]); 905 }); 906 ES3F_ADD_API_CASE(copytexsubimage2d_neg_offset, "Invalid glCopyTexSubImage2D() usage", 907 { 908 GLuint texture; 909 glGenTextures (1, &texture); 910 glBindTexture (GL_TEXTURE_2D, texture); 911 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 912 913 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset < 0 or yoffset < 0."); 914 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, -1, 0, 0, 0, 4, 4); 915 expectError(GL_INVALID_VALUE); 916 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, -1, 0, 0, 4, 4); 917 expectError(GL_INVALID_VALUE); 918 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, -1, -1, 0, 0, 4, 4); 919 expectError(GL_INVALID_VALUE); 920 m_log << TestLog::EndSection; 921 922 glDeleteTextures(1, &texture); 923 }); 924 ES3F_ADD_API_CASE(copytexsubimage2d_invalid_offset, "Invalid glCopyTexSubImage2D() usage", 925 { 926 GLuint texture; 927 glGenTextures (1, &texture); 928 glBindTexture (GL_TEXTURE_2D, texture); 929 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 930 931 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset + width > texture_width or yoffset + height > texture_height."); 932 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 14, 0, 0, 0, 4, 4); 933 expectError(GL_INVALID_VALUE); 934 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 14, 0, 0, 4, 4); 935 expectError(GL_INVALID_VALUE); 936 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 14, 14, 0, 0, 4, 4); 937 expectError(GL_INVALID_VALUE); 938 m_log << TestLog::EndSection; 939 940 glDeleteTextures(1, &texture); 941 }); 942 ES3F_ADD_API_CASE(copytexsubimage2d_neg_width_height, "Invalid glCopyTexSubImage2D() usage", 943 { 944 GLuint texture; 945 glGenTextures (1, &texture); 946 glBindTexture (GL_TEXTURE_2D, texture); 947 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 948 949 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0."); 950 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, -1, 0); 951 expectError(GL_INVALID_VALUE); 952 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, -1); 953 expectError(GL_INVALID_VALUE); 954 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, -1, -1); 955 expectError(GL_INVALID_VALUE); 956 m_log << TestLog::EndSection; 957 958 glDeleteTextures(1, &texture); 959 }); 960 ES3F_ADD_API_CASE(copytexsubimage2d_incomplete_framebuffer, "Invalid glCopyTexSubImage2D() usage", 961 { 962 m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete."); 963 964 GLuint texture[2]; 965 GLuint fbo; 966 967 glGenTextures (2, texture); 968 glBindTexture (GL_TEXTURE_2D, texture[0]); 969 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 970 glBindTexture (GL_TEXTURE_CUBE_MAP, texture[1]); 971 glTexImage2D (GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 972 glTexImage2D (GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 973 glTexImage2D (GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 974 glTexImage2D (GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 975 glTexImage2D (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 976 glTexImage2D (GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 977 expectError(GL_NO_ERROR); 978 979 glGenFramebuffers(1, &fbo); 980 glBindFramebuffer(GL_FRAMEBUFFER, fbo); 981 glCheckFramebufferStatus(GL_FRAMEBUFFER); 982 expectError(GL_NO_ERROR); 983 984 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 0); 985 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 986 glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 0, 0, 0, 0); 987 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 988 glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, 0, 0, 0, 0); 989 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 990 glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, 0, 0, 0, 0); 991 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 992 glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, 0, 0, 0, 0); 993 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 994 glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, 0, 0, 0, 0); 995 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 996 glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, 0, 0, 0, 0); 997 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 998 999 glBindFramebuffer(GL_FRAMEBUFFER, 0); 1000 glDeleteFramebuffers(1, &fbo); 1001 glDeleteTextures(2, texture); 1002 1003 m_log << tcu::TestLog::EndSection; 1004 }); 1005 1006 // glDeleteTextures 1007 1008 ES3F_ADD_API_CASE(deletetextures, "Invalid glDeleteTextures() usage", 1009 { 1010 GLuint texture; 1011 glGenTextures(1, &texture); 1012 1013 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative."); 1014 glDeleteTextures(-1, 0); 1015 expectError(GL_INVALID_VALUE); 1016 1017 glBindTexture(GL_TEXTURE_2D, texture); 1018 glDeleteTextures(-1, 0); 1019 expectError(GL_INVALID_VALUE); 1020 m_log << TestLog::EndSection; 1021 1022 glDeleteTextures(1, &texture); 1023 }); 1024 1025 // glGenerateMipmap 1026 1027 ES3F_ADD_API_CASE(generatemipmap, "Invalid glGenerateMipmap() usage", 1028 { 1029 GLuint texture[2]; 1030 glGenTextures(2, texture); 1031 1032 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP."); 1033 glGenerateMipmap(0); 1034 expectError(GL_INVALID_ENUM); 1035 m_log << TestLog::EndSection; 1036 1037 m_log << TestLog::Section("", "INVALID_OPERATION is generated if the texture bound to target is not cube complete."); 1038 glBindTexture(GL_TEXTURE_CUBE_MAP, texture[0]); 1039 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT); 1040 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1041 glGenerateMipmap(GL_TEXTURE_CUBE_MAP); 1042 expectError(GL_INVALID_OPERATION); 1043 1044 glBindTexture(GL_TEXTURE_CUBE_MAP, texture[0]); 1045 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1046 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1047 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1048 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1049 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1050 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1051 glGenerateMipmap(GL_TEXTURE_CUBE_MAP); 1052 expectError(GL_INVALID_OPERATION); 1053 m_log << TestLog::EndSection; 1054 1055 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the zero level array is stored in a compressed internal format."); 1056 glBindTexture(GL_TEXTURE_2D, texture[1]); 1057 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0); 1058 glGenerateMipmap(GL_TEXTURE_2D); 1059 expectError(GL_INVALID_OPERATION); 1060 m_log << TestLog::EndSection; 1061 1062 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the level base array was not specified with an unsized internal format or a sized internal format that is both color-renderable and texture-filterable."); 1063 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8_SNORM, 0, 0, 0, GL_RGB, GL_BYTE, 0); 1064 glGenerateMipmap(GL_TEXTURE_2D); 1065 expectError(GL_INVALID_OPERATION); 1066 glTexImage2D(GL_TEXTURE_2D, 0, GL_R8I, 0, 0, 0, GL_RED_INTEGER, GL_BYTE, 0); 1067 glGenerateMipmap(GL_TEXTURE_2D); 1068 expectError(GL_INVALID_OPERATION); 1069 1070 if (!(m_context.getContextInfo().isExtensionSupported("GL_EXT_color_buffer_float") && m_context.getContextInfo().isExtensionSupported("GL_OES_texture_float_linear"))) 1071 { 1072 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 0, 0, 0, GL_RGBA, GL_FLOAT, 0); 1073 glGenerateMipmap(GL_TEXTURE_2D); 1074 expectError(GL_INVALID_OPERATION); 1075 } 1076 1077 m_log << TestLog::EndSection; 1078 1079 glDeleteTextures(2, texture); 1080 }); 1081 1082 // glGenTextures 1083 1084 ES3F_ADD_API_CASE(gentextures, "Invalid glGenTextures() usage", 1085 { 1086 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative."); 1087 glGenTextures(-1, 0); 1088 expectError(GL_INVALID_VALUE); 1089 m_log << TestLog::EndSection; 1090 }); 1091 1092 // glPixelStorei 1093 1094 ES3F_ADD_API_CASE(pixelstorei, "Invalid glPixelStorei() usage", 1095 { 1096 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value."); 1097 glPixelStorei(0,1); 1098 expectError(GL_INVALID_ENUM); 1099 m_log << TestLog::EndSection; 1100 1101 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if a negative row length, pixel skip, or row skip value is specified, or if alignment is specified as other than 1, 2, 4, or 8."); 1102 glPixelStorei(GL_PACK_ROW_LENGTH, -1); 1103 expectError(GL_INVALID_VALUE); 1104 glPixelStorei(GL_PACK_SKIP_ROWS, -1); 1105 expectError(GL_INVALID_VALUE); 1106 glPixelStorei(GL_PACK_SKIP_PIXELS, -1); 1107 expectError(GL_INVALID_VALUE); 1108 glPixelStorei(GL_UNPACK_ROW_LENGTH, -1); 1109 expectError(GL_INVALID_VALUE); 1110 glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, -1); 1111 expectError(GL_INVALID_VALUE); 1112 glPixelStorei(GL_UNPACK_SKIP_ROWS, -1); 1113 expectError(GL_INVALID_VALUE); 1114 glPixelStorei(GL_UNPACK_SKIP_PIXELS, -1); 1115 expectError(GL_INVALID_VALUE); 1116 glPixelStorei(GL_UNPACK_SKIP_IMAGES, -1); 1117 expectError(GL_INVALID_VALUE); 1118 glPixelStorei(GL_PACK_ALIGNMENT, 0); 1119 expectError(GL_INVALID_VALUE); 1120 glPixelStorei(GL_UNPACK_ALIGNMENT, 0); 1121 expectError(GL_INVALID_VALUE); 1122 glPixelStorei(GL_PACK_ALIGNMENT, 16); 1123 expectError(GL_INVALID_VALUE); 1124 glPixelStorei(GL_UNPACK_ALIGNMENT, 16); 1125 expectError(GL_INVALID_VALUE); 1126 m_log << TestLog::EndSection; 1127 }); 1128 1129 // glTexImage2D 1130 1131 ES3F_ADD_API_CASE(teximage2d, "Invalid glTexImage2D() usage", 1132 { 1133 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid."); 1134 glTexImage2D(0, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1135 expectError(GL_INVALID_ENUM); 1136 m_log << TestLog::EndSection; 1137 1138 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if type is not a type constant."); 1139 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, 0, 0); 1140 expectError(GL_INVALID_ENUM); 1141 m_log << TestLog::EndSection; 1142 1143 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the combination of internalFormat, format and type is invalid."); 1144 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1145 expectError(GL_INVALID_OPERATION); 1146 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0); 1147 expectError(GL_INVALID_OPERATION); 1148 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0); 1149 expectError(GL_INVALID_OPERATION); 1150 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB10_A2, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_2_10_10_10_REV, 0); 1151 expectError(GL_INVALID_OPERATION); 1152 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32UI, 1, 1, 0, GL_RGBA_INTEGER, GL_INT, 0); 1153 expectError(GL_INVALID_OPERATION); 1154 m_log << TestLog::EndSection; 1155 }); 1156 ES3F_ADD_API_CASE(teximage2d_inequal_width_height_cube, "Invalid glTexImage2D() usage", 1157 { 1158 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if target is one of the six cube map 2D image targets and the width and height parameters are not equal."); 1159 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1160 expectError(GL_INVALID_VALUE); 1161 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1162 expectError(GL_INVALID_VALUE); 1163 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1164 expectError(GL_INVALID_VALUE); 1165 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1166 expectError(GL_INVALID_VALUE); 1167 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1168 expectError(GL_INVALID_VALUE); 1169 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1170 expectError(GL_INVALID_VALUE); 1171 m_log << TestLog::EndSection; 1172 }); 1173 ES3F_ADD_API_CASE(teximage2d_neg_level, "Invalid glTexImage2D() usage", 1174 { 1175 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 1176 glTexImage2D(GL_TEXTURE_2D, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1177 expectError(GL_INVALID_VALUE); 1178 m_log << TestLog::EndSection; 1179 1180 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 1181 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1182 expectError(GL_INVALID_VALUE); 1183 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1184 expectError(GL_INVALID_VALUE); 1185 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1186 expectError(GL_INVALID_VALUE); 1187 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1188 expectError(GL_INVALID_VALUE); 1189 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1190 expectError(GL_INVALID_VALUE); 1191 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, -1, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1192 expectError(GL_INVALID_VALUE); 1193 m_log << TestLog::EndSection; 1194 }); 1195 ES3F_ADD_API_CASE(teximage2d_max_level, "Invalid glTexImage2D() usage", 1196 { 1197 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE)."); 1198 deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1; 1199 glTexImage2D(GL_TEXTURE_2D, log2MaxTextureSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1200 expectError(GL_INVALID_VALUE); 1201 m_log << TestLog::EndSection; 1202 1203 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE)."); 1204 deUint32 log2MaxCubemapSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1; 1205 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1206 expectError(GL_INVALID_VALUE); 1207 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1208 expectError(GL_INVALID_VALUE); 1209 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1210 expectError(GL_INVALID_VALUE); 1211 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1212 expectError(GL_INVALID_VALUE); 1213 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1214 expectError(GL_INVALID_VALUE); 1215 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, log2MaxCubemapSize, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1216 expectError(GL_INVALID_VALUE); 1217 m_log << TestLog::EndSection; 1218 }); 1219 ES3F_ADD_API_CASE(teximage2d_neg_width_height, "Invalid glTexImage2D() usage", 1220 { 1221 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0."); 1222 1223 m_log << TestLog::Section("", "GL_TEXTURE_2D target"); 1224 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1225 expectError(GL_INVALID_VALUE); 1226 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1227 expectError(GL_INVALID_VALUE); 1228 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1229 expectError(GL_INVALID_VALUE); 1230 m_log << TestLog::EndSection; 1231 1232 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target"); 1233 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1234 expectError(GL_INVALID_VALUE); 1235 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1236 expectError(GL_INVALID_VALUE); 1237 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1238 expectError(GL_INVALID_VALUE); 1239 m_log << TestLog::EndSection; 1240 1241 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target"); 1242 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1243 expectError(GL_INVALID_VALUE); 1244 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1245 expectError(GL_INVALID_VALUE); 1246 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1247 expectError(GL_INVALID_VALUE); 1248 m_log << TestLog::EndSection; 1249 1250 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target"); 1251 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1252 expectError(GL_INVALID_VALUE); 1253 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1254 expectError(GL_INVALID_VALUE); 1255 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1256 expectError(GL_INVALID_VALUE); 1257 m_log << TestLog::EndSection; 1258 1259 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target"); 1260 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1261 expectError(GL_INVALID_VALUE); 1262 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1263 expectError(GL_INVALID_VALUE); 1264 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1265 expectError(GL_INVALID_VALUE); 1266 m_log << TestLog::EndSection; 1267 1268 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target"); 1269 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1270 expectError(GL_INVALID_VALUE); 1271 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1272 expectError(GL_INVALID_VALUE); 1273 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1274 expectError(GL_INVALID_VALUE); 1275 m_log << TestLog::EndSection; 1276 1277 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target"); 1278 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, -1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1279 expectError(GL_INVALID_VALUE); 1280 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1281 expectError(GL_INVALID_VALUE); 1282 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, -1, -1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1283 expectError(GL_INVALID_VALUE); 1284 m_log << TestLog::EndSection; 1285 1286 m_log << TestLog::EndSection; 1287 }); 1288 ES3F_ADD_API_CASE(teximage2d_max_width_height, "Invalid glTexImage2D() usage", 1289 { 1290 int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE) + 1; 1291 int maxCubemapSize = m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE) + 1; 1292 1293 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_TEXTURE_SIZE."); 1294 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, maxTextureSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1295 expectError(GL_INVALID_VALUE); 1296 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1297 expectError(GL_INVALID_VALUE); 1298 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, maxTextureSize, maxTextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1299 expectError(GL_INVALID_VALUE); 1300 m_log << TestLog::EndSection; 1301 1302 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_CUBE_MAP_TEXTURE_SIZE."); 1303 1304 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_X target"); 1305 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1306 expectError(GL_INVALID_VALUE); 1307 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1308 expectError(GL_INVALID_VALUE); 1309 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1310 expectError(GL_INVALID_VALUE); 1311 m_log << TestLog::EndSection; 1312 1313 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Y target"); 1314 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1315 expectError(GL_INVALID_VALUE); 1316 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1317 expectError(GL_INVALID_VALUE); 1318 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1319 expectError(GL_INVALID_VALUE); 1320 m_log << TestLog::EndSection; 1321 1322 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_POSITIVE_Z target"); 1323 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1324 expectError(GL_INVALID_VALUE); 1325 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1326 expectError(GL_INVALID_VALUE); 1327 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1328 expectError(GL_INVALID_VALUE); 1329 m_log << TestLog::EndSection; 1330 1331 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_X target"); 1332 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1333 expectError(GL_INVALID_VALUE); 1334 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1335 expectError(GL_INVALID_VALUE); 1336 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1337 expectError(GL_INVALID_VALUE); 1338 m_log << TestLog::EndSection; 1339 1340 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target"); 1341 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1342 expectError(GL_INVALID_VALUE); 1343 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1344 expectError(GL_INVALID_VALUE); 1345 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1346 expectError(GL_INVALID_VALUE); 1347 m_log << TestLog::EndSection; 1348 1349 m_log << TestLog::Section("", "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target"); 1350 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, maxCubemapSize, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1351 expectError(GL_INVALID_VALUE); 1352 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1353 expectError(GL_INVALID_VALUE); 1354 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, maxCubemapSize, maxCubemapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1355 expectError(GL_INVALID_VALUE); 1356 m_log << TestLog::EndSection; 1357 1358 m_log << TestLog::EndSection; 1359 }); 1360 ES3F_ADD_API_CASE(teximage2d_invalid_border, "Invalid glTexImage2D() usage", 1361 { 1362 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0."); 1363 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0); 1364 expectError(GL_INVALID_VALUE); 1365 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, -1, GL_RGB, GL_UNSIGNED_BYTE, 0); 1366 expectError(GL_INVALID_VALUE); 1367 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0); 1368 expectError(GL_INVALID_VALUE); 1369 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0); 1370 expectError(GL_INVALID_VALUE); 1371 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0); 1372 expectError(GL_INVALID_VALUE); 1373 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0); 1374 expectError(GL_INVALID_VALUE); 1375 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0); 1376 expectError(GL_INVALID_VALUE); 1377 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, 0); 1378 expectError(GL_INVALID_VALUE); 1379 m_log << TestLog::EndSection; 1380 }); 1381 ES3F_ADD_API_CASE(teximage2d_invalid_buffer_target, "Invalid glTexImage2D() usage", 1382 { 1383 deUint32 buf; 1384 deUint32 texture; 1385 std::vector<GLubyte> data(64); 1386 1387 glGenBuffers (1, &buf); 1388 glBindBuffer (GL_PIXEL_UNPACK_BUFFER, buf); 1389 glBufferData (GL_PIXEL_UNPACK_BUFFER, 64, &data[0], GL_DYNAMIC_COPY); 1390 glGenTextures (1, &texture); 1391 glBindTexture (GL_TEXTURE_2D, texture); 1392 expectError (GL_NO_ERROR); 1393 1394 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and..."); 1395 m_log << TestLog::Section("", "...the buffer object's data store is currently mapped."); 1396 glMapBufferRange (GL_PIXEL_UNPACK_BUFFER, 0, 32, GL_MAP_WRITE_BIT); 1397 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1398 expectError (GL_INVALID_OPERATION); 1399 glUnmapBuffer (GL_PIXEL_UNPACK_BUFFER); 1400 m_log << TestLog::EndSection; 1401 1402 m_log << TestLog::Section("", "...the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size."); 1403 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1404 expectError (GL_INVALID_OPERATION); 1405 m_log << TestLog::EndSection; 1406 1407 m_log << TestLog::Section("", "...data is not evenly divisible into the number of bytes needed to store in memory a datum indicated by type."); 1408 m_log << TestLog::Message << "// Set byte offset = 3" << TestLog::EndMessage; 1409 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB5_A1, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, (const GLvoid*)3); 1410 expectError (GL_INVALID_OPERATION); 1411 m_log << TestLog::EndSection; 1412 m_log << TestLog::EndSection; 1413 1414 glDeleteBuffers (1, &buf); 1415 glDeleteTextures (1, &texture); 1416 }); 1417 1418 // glTexSubImage2D 1419 1420 ES3F_ADD_API_CASE(texsubimage2d, "Invalid glTexSubImage2D() usage", 1421 { 1422 deUint32 texture; 1423 glGenTextures (1, &texture); 1424 glBindTexture (GL_TEXTURE_2D, texture); 1425 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1426 expectError (GL_NO_ERROR); 1427 1428 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid."); 1429 glTexSubImage2D(0, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1430 expectError(GL_INVALID_ENUM); 1431 m_log << TestLog::EndSection; 1432 1433 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if format is not an accepted format constant."); 1434 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 4, 4, GL_UNSIGNED_BYTE, 0); 1435 expectError(GL_INVALID_ENUM); 1436 m_log << TestLog::EndSection; 1437 1438 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if type is not a type constant."); 1439 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, 0, 0); 1440 expectError(GL_INVALID_ENUM); 1441 m_log << TestLog::EndSection; 1442 1443 m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if the combination of internalFormat of the previously specified texture array, format and type is not valid."); 1444 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, 0); 1445 expectError(GL_INVALID_OPERATION); 1446 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0); 1447 expectError(GL_INVALID_OPERATION); 1448 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0); 1449 expectError(GL_INVALID_OPERATION); 1450 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0); 1451 expectError(GL_INVALID_OPERATION); 1452 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA_INTEGER, GL_UNSIGNED_INT, 0); 1453 expectError(GL_INVALID_OPERATION); 1454 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_FLOAT, 0); 1455 expectError(GL_INVALID_OPERATION); 1456 m_log << tcu::TestLog::EndSection; 1457 1458 glDeleteTextures (1, &texture); 1459 }); 1460 ES3F_ADD_API_CASE(texsubimage2d_neg_level, "Invalid glTexSubImage2D() usage", 1461 { 1462 deUint32 textures[2]; 1463 glGenTextures (2, &textures[0]); 1464 glBindTexture (GL_TEXTURE_2D, textures[0]); 1465 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1466 glBindTexture (GL_TEXTURE_2D, textures[1]); 1467 FOR_CUBE_FACES(faceGL, glTexImage2D(faceGL, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);); 1468 expectError (GL_NO_ERROR); 1469 1470 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 1471 glTexSubImage2D(GL_TEXTURE_2D, -1, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1472 expectError(GL_INVALID_VALUE); 1473 m_log << TestLog::EndSection; 1474 1475 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 1476 FOR_CUBE_FACES(faceGL, 1477 { 1478 glTexSubImage2D(faceGL, -1, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1479 expectError(GL_INVALID_VALUE); 1480 }); 1481 m_log << TestLog::EndSection; 1482 1483 glDeleteTextures(2, &textures[0]); 1484 }); 1485 ES3F_ADD_API_CASE(texsubimage2d_max_level, "Invalid glTexSubImage2D() usage", 1486 { 1487 deUint32 textures[2]; 1488 glGenTextures (2, &textures[0]); 1489 glBindTexture (GL_TEXTURE_2D, textures[0]); 1490 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1491 glBindTexture (GL_TEXTURE_CUBE_MAP, textures[1]); 1492 FOR_CUBE_FACES(faceGL, glTexImage2D(faceGL, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);); 1493 expectError (GL_NO_ERROR); 1494 1495 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE)."); 1496 deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1; 1497 glTexSubImage2D(GL_TEXTURE_2D, log2MaxTextureSize, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1498 expectError(GL_INVALID_VALUE); 1499 m_log << TestLog::EndSection; 1500 1501 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE)."); 1502 deUint32 log2MaxCubemapSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1; 1503 FOR_CUBE_FACES(faceGL, 1504 { 1505 glTexSubImage2D(faceGL, log2MaxCubemapSize, 0, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1506 expectError(GL_INVALID_VALUE); 1507 }); 1508 m_log << TestLog::EndSection; 1509 1510 glDeleteTextures(2, &textures[0]); 1511 }); 1512 ES3F_ADD_API_CASE(texsubimage2d_neg_offset, "Invalid glTexSubImage2D() usage", 1513 { 1514 deUint32 texture; 1515 glGenTextures(1, &texture); 1516 glBindTexture(GL_TEXTURE_2D, texture); 1517 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1518 expectError(GL_NO_ERROR); 1519 1520 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset or yoffset are negative."); 1521 glTexSubImage2D(GL_TEXTURE_2D, 0, -1, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1522 expectError(GL_INVALID_VALUE); 1523 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, -1, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1524 expectError(GL_INVALID_VALUE); 1525 glTexSubImage2D(GL_TEXTURE_2D, 0, -1, -1, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 1526 expectError(GL_INVALID_VALUE); 1527 m_log << TestLog::EndSection; 1528 1529 glDeleteTextures(1, &texture); 1530 }); 1531 ES3F_ADD_API_CASE(texsubimage2d_invalid_offset, "Invalid glTexSubImage2D() usage", 1532 { 1533 deUint32 texture; 1534 glGenTextures (1, &texture); 1535 glBindTexture (GL_TEXTURE_2D, texture); 1536 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1537 expectError (GL_NO_ERROR); 1538 1539 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset + width > texture_width or yoffset + height > texture_height."); 1540 glTexSubImage2D(GL_TEXTURE_2D, 0, 30, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1541 expectError(GL_INVALID_VALUE); 1542 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 30, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1543 expectError(GL_INVALID_VALUE); 1544 glTexSubImage2D(GL_TEXTURE_2D, 0, 30, 30, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1545 expectError(GL_INVALID_VALUE); 1546 m_log << TestLog::EndSection; 1547 1548 glDeleteTextures (1, &texture); 1549 }); 1550 ES3F_ADD_API_CASE(texsubimage2d_neg_width_height, "Invalid glTexSubImage2D() usage", 1551 { 1552 deUint32 texture; 1553 glGenTextures (1, &texture); 1554 glBindTexture (GL_TEXTURE_2D, texture); 1555 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1556 expectError (GL_NO_ERROR); 1557 1558 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0."); 1559 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1560 expectError(GL_INVALID_VALUE); 1561 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1562 expectError(GL_INVALID_VALUE); 1563 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1564 expectError(GL_INVALID_VALUE); 1565 m_log << TestLog::EndSection; 1566 1567 glDeleteTextures (1, &texture); 1568 }); 1569 ES3F_ADD_API_CASE(texsubimage2d_invalid_buffer_target, "Invalid glTexSubImage2D() usage", 1570 { 1571 deUint32 buf; 1572 deUint32 texture; 1573 std::vector<GLubyte> data(64); 1574 1575 glGenTextures (1, &texture); 1576 glBindTexture (GL_TEXTURE_2D, texture); 1577 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1578 glGenBuffers (1, &buf); 1579 glBindBuffer (GL_PIXEL_UNPACK_BUFFER, buf); 1580 glBufferData (GL_PIXEL_UNPACK_BUFFER, 64, &data[0], GL_DYNAMIC_COPY); 1581 expectError (GL_NO_ERROR); 1582 1583 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and..."); 1584 m_log << TestLog::Section("", "...the buffer object's data store is currently mapped."); 1585 glMapBufferRange (GL_PIXEL_UNPACK_BUFFER, 0, 32, GL_MAP_WRITE_BIT); 1586 glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1587 expectError (GL_INVALID_OPERATION); 1588 glUnmapBuffer (GL_PIXEL_UNPACK_BUFFER); 1589 m_log << TestLog::EndSection; 1590 1591 m_log << TestLog::Section("", "...the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size."); 1592 glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, 32, 32, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1593 expectError (GL_INVALID_OPERATION); 1594 m_log << TestLog::EndSection; 1595 1596 m_log << TestLog::Section("", "...data is not evenly divisible into the number of bytes needed to store in memory a datum indicated by type."); 1597 m_log << TestLog::Message << "// Set byte offset = 3" << TestLog::EndMessage; 1598 glBindBuffer (GL_PIXEL_UNPACK_BUFFER, 0); 1599 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 0); 1600 glBindBuffer (GL_PIXEL_UNPACK_BUFFER, buf); 1601 expectError (GL_NO_ERROR); 1602 glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, (const GLvoid*)3); 1603 expectError (GL_INVALID_OPERATION); 1604 m_log << TestLog::EndSection; 1605 m_log << TestLog::EndSection; 1606 1607 glDeleteBuffers (1, &buf); 1608 glDeleteTextures (1, &texture); 1609 }); 1610 1611 // glTexParameteri 1612 1613 ES3F_ADD_API_CASE(texparameteri, "Invalid glTexParameteri() usage", 1614 { 1615 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values."); 1616 glTexParameteri(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 1617 expectError(GL_INVALID_ENUM); 1618 glTexParameteri(GL_TEXTURE_2D, 0, GL_LINEAR); 1619 expectError(GL_INVALID_ENUM); 1620 glTexParameteri(0, 0, GL_LINEAR); 1621 expectError(GL_INVALID_ENUM); 1622 m_log << TestLog::EndSection; 1623 1624 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not."); 1625 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 0); 1626 expectError(GL_INVALID_ENUM); 1627 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_REPEAT); 1628 expectError(GL_INVALID_ENUM); 1629 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0); 1630 expectError(GL_INVALID_ENUM); 1631 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NEAREST); 1632 expectError(GL_INVALID_ENUM); 1633 m_log << TestLog::EndSection; 1634 1635 GLuint texture; 1636 glGenTextures(1, &texture); 1637 glBindTexture(GL_TEXTURE_2D, texture); 1638 1639 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values."); 1640 glTexParameteri(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 1641 expectError(GL_INVALID_ENUM); 1642 glTexParameteri(GL_TEXTURE_2D, 0, GL_LINEAR); 1643 expectError(GL_INVALID_ENUM); 1644 glTexParameteri(0, 0, GL_LINEAR); 1645 expectError(GL_INVALID_ENUM); 1646 m_log << TestLog::EndSection; 1647 1648 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not."); 1649 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 0); 1650 expectError(GL_INVALID_ENUM); 1651 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_REPEAT); 1652 expectError(GL_INVALID_ENUM); 1653 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0); 1654 expectError(GL_INVALID_ENUM); 1655 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NEAREST); 1656 expectError(GL_INVALID_ENUM); 1657 m_log << TestLog::EndSection; 1658 1659 glDeleteTextures(1, &texture); 1660 }); 1661 1662 // glTexParameterf 1663 1664 ES3F_ADD_API_CASE(texparameterf, "Invalid glTexParameterf() usage", 1665 { 1666 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values."); 1667 glTexParameterf(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 1668 expectError(GL_INVALID_ENUM); 1669 glTexParameterf(GL_TEXTURE_2D, 0, GL_LINEAR); 1670 expectError(GL_INVALID_ENUM); 1671 glTexParameterf(0, 0, GL_LINEAR); 1672 expectError(GL_INVALID_ENUM); 1673 m_log << TestLog::EndSection; 1674 1675 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not."); 1676 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 0); 1677 expectError(GL_INVALID_ENUM); 1678 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_REPEAT); 1679 expectError(GL_INVALID_ENUM); 1680 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0); 1681 expectError(GL_INVALID_ENUM); 1682 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NEAREST); 1683 expectError(GL_INVALID_ENUM); 1684 m_log << TestLog::EndSection; 1685 1686 GLuint texture; 1687 glGenTextures(1, &texture); 1688 glBindTexture(GL_TEXTURE_2D, texture); 1689 1690 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values."); 1691 glTexParameterf(0, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 1692 expectError(GL_INVALID_ENUM); 1693 glTexParameterf(GL_TEXTURE_2D, 0, GL_LINEAR); 1694 expectError(GL_INVALID_ENUM); 1695 glTexParameterf(0, 0, GL_LINEAR); 1696 expectError(GL_INVALID_ENUM); 1697 m_log << TestLog::EndSection; 1698 1699 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not."); 1700 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 0); 1701 expectError(GL_INVALID_ENUM); 1702 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_REPEAT); 1703 expectError(GL_INVALID_ENUM); 1704 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0); 1705 expectError(GL_INVALID_ENUM); 1706 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NEAREST); 1707 expectError(GL_INVALID_ENUM); 1708 m_log << TestLog::EndSection; 1709 1710 glDeleteTextures(1, &texture); 1711 }); 1712 1713 // glTexParameteriv 1714 1715 ES3F_ADD_API_CASE(texparameteriv, "Invalid glTexParameteriv() usage", 1716 { 1717 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values."); 1718 GLint params[1] = {GL_LINEAR}; 1719 glTexParameteriv(0, GL_TEXTURE_MIN_FILTER, ¶ms[0]); 1720 expectError(GL_INVALID_ENUM); 1721 glTexParameteriv(GL_TEXTURE_2D, 0, ¶ms[0]); 1722 expectError(GL_INVALID_ENUM); 1723 glTexParameteriv(0, 0, ¶ms[0]); 1724 expectError(GL_INVALID_ENUM); 1725 m_log << TestLog::EndSection; 1726 1727 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not."); 1728 params[0] = 0; 1729 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, ¶ms[0]); 1730 expectError(GL_INVALID_ENUM); 1731 params[0] = GL_REPEAT; 1732 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ¶ms[0]); 1733 expectError(GL_INVALID_ENUM); 1734 params[0] = 0; 1735 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, ¶ms[0]); 1736 expectError(GL_INVALID_ENUM); 1737 params[0] = GL_NEAREST; 1738 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, ¶ms[0]); 1739 expectError(GL_INVALID_ENUM); 1740 m_log << TestLog::EndSection; 1741 1742 GLuint texture; 1743 glGenTextures(1, &texture); 1744 glBindTexture(GL_TEXTURE_2D, texture); 1745 1746 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values."); 1747 params[0] = GL_LINEAR; 1748 glTexParameteriv(0, GL_TEXTURE_MIN_FILTER, ¶ms[0]); 1749 expectError(GL_INVALID_ENUM); 1750 glTexParameteriv(GL_TEXTURE_2D, 0, ¶ms[0]); 1751 expectError(GL_INVALID_ENUM); 1752 glTexParameteriv(0, 0, ¶ms[0]); 1753 expectError(GL_INVALID_ENUM); 1754 m_log << TestLog::EndSection; 1755 1756 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not."); 1757 params[0] = 0; 1758 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, ¶ms[0]); 1759 expectError(GL_INVALID_ENUM); 1760 params[0] = GL_REPEAT; 1761 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ¶ms[0]); 1762 expectError(GL_INVALID_ENUM); 1763 params[0] = 0; 1764 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, ¶ms[0]); 1765 expectError(GL_INVALID_ENUM); 1766 params[0] = GL_NEAREST; 1767 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, ¶ms[0]); 1768 expectError(GL_INVALID_ENUM); 1769 m_log << TestLog::EndSection; 1770 1771 glDeleteTextures(1, &texture); 1772 }); 1773 1774 // glTexParameterfv 1775 1776 ES3F_ADD_API_CASE(texparameterfv, "Invalid glTexParameterfv() usage", 1777 { 1778 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values."); 1779 GLfloat params[1] = {GL_LINEAR}; 1780 glTexParameterfv(0, GL_TEXTURE_MIN_FILTER, ¶ms[0]); 1781 expectError(GL_INVALID_ENUM); 1782 glTexParameterfv(GL_TEXTURE_2D, 0, ¶ms[0]); 1783 expectError(GL_INVALID_ENUM); 1784 glTexParameterfv(0, 0, ¶ms[0]); 1785 expectError(GL_INVALID_ENUM); 1786 m_log << TestLog::EndSection; 1787 1788 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not."); 1789 params[0] = 0.0f; 1790 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, ¶ms[0]); 1791 expectError(GL_INVALID_ENUM); 1792 params[0] = GL_REPEAT; 1793 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ¶ms[0]); 1794 expectError(GL_INVALID_ENUM); 1795 params[0] = 0.0f; 1796 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, ¶ms[0]); 1797 expectError(GL_INVALID_ENUM); 1798 params[0] = GL_NEAREST; 1799 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, ¶ms[0]); 1800 expectError(GL_INVALID_ENUM); 1801 m_log << TestLog::EndSection; 1802 1803 GLuint texture; 1804 glGenTextures(1, &texture); 1805 glBindTexture(GL_TEXTURE_2D, texture); 1806 1807 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target or pname is not one of the accepted defined values."); 1808 params[0] = GL_LINEAR; 1809 glTexParameterfv(0, GL_TEXTURE_MIN_FILTER, ¶ms[0]); 1810 expectError(GL_INVALID_ENUM); 1811 glTexParameterfv(GL_TEXTURE_2D, 0, ¶ms[0]); 1812 expectError(GL_INVALID_ENUM); 1813 glTexParameterfv(0, 0, ¶ms[0]); 1814 expectError(GL_INVALID_ENUM); 1815 m_log << TestLog::EndSection; 1816 1817 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined symbolic constant value (based on the value of pname) and does not."); 1818 params[0] = 0.0f; 1819 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, ¶ms[0]); 1820 expectError(GL_INVALID_ENUM); 1821 params[0] = GL_REPEAT; 1822 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ¶ms[0]); 1823 expectError(GL_INVALID_ENUM); 1824 params[0] = 0.0f; 1825 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, ¶ms[0]); 1826 expectError(GL_INVALID_ENUM); 1827 params[0] = GL_NEAREST; 1828 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, ¶ms[0]); 1829 expectError(GL_INVALID_ENUM); 1830 m_log << TestLog::EndSection; 1831 1832 glDeleteTextures(1, &texture); 1833 }); 1834 1835 // glCompressedTexSubImage2D 1836 1837 ES3F_ADD_API_CASE(compressedtexsubimage2d, "Invalid glCompressedTexSubImage2D() usage", 1838 { 1839 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid."); 1840 glCompressedTexSubImage2D(0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGB8_ETC2, 0, 0); 1841 expectError(GL_INVALID_ENUM); 1842 m_log << TestLog::EndSection; 1843 1844 deUint32 texture; 1845 glGenTextures (1, &texture); 1846 glBindTexture (GL_TEXTURE_2D, texture); 1847 glCompressedTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0, etc2EacDataSize(18, 18), 0); 1848 expectError (GL_NO_ERROR); 1849 1850 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if format does not match the internal format of the texture image being modified."); 1851 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_COMPRESSED_RGB8_ETC2, 0, 0); 1852 expectError(GL_INVALID_OPERATION); 1853 m_log << TestLog::EndSection; 1854 1855 m_log << TestLog::Section("", "For ETC2/EAC images GL_INVALID_OPERATION is generated if width is not a multiple of four, and width + xoffset is not equal to the width of the texture level."); 1856 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 4, 0, 10, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(10, 4), 0); 1857 expectError(GL_INVALID_OPERATION); 1858 m_log << TestLog::EndSection; 1859 1860 m_log << TestLog::Section("", "For ETC2/EAC images GL_INVALID_OPERATION is generated if height is not a multiple of four, and height + yoffset is not equal to the height of the texture level."); 1861 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 4, 4, 10, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 10), 0); 1862 expectError(GL_INVALID_OPERATION); 1863 m_log << TestLog::EndSection; 1864 1865 m_log << TestLog::Section("", "For ETC2/EAC images GL_INVALID_OPERATION is generated if xoffset or yoffset is not a multiple of four."); 1866 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 1, 4, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0); 1867 expectError(GL_INVALID_OPERATION); 1868 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 1, 0, 4, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0); 1869 expectError(GL_INVALID_OPERATION); 1870 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 4, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0); 1871 expectError(GL_INVALID_OPERATION); 1872 m_log << TestLog::EndSection; 1873 1874 glDeleteTextures (1, &texture); 1875 }); 1876 ES3F_ADD_API_CASE(compressedtexsubimage2d_neg_level, "Invalid glCompressedTexSubImage2D() usage", 1877 { 1878 deUint32 textures[2]; 1879 glGenTextures (2, &textures[0]); 1880 glBindTexture (GL_TEXTURE_2D, textures[0]); 1881 glCompressedTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0, etc2EacDataSize(18, 18), 0); 1882 glBindTexture (GL_TEXTURE_CUBE_MAP, textures[1]); 1883 FOR_CUBE_FACES(faceGL, glCompressedTexImage2D(faceGL, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0, etc2EacDataSize(18, 18), 0);); 1884 expectError (GL_NO_ERROR); 1885 1886 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 1887 glCompressedTexSubImage2D(GL_TEXTURE_2D, -1, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 1888 expectError(GL_INVALID_VALUE); 1889 m_log << TestLog::EndSection; 1890 1891 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 1892 FOR_CUBE_FACES(faceGL, 1893 { 1894 glCompressedTexSubImage2D(faceGL, -1, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 1895 expectError(GL_INVALID_VALUE); 1896 }); 1897 m_log << TestLog::EndSection; 1898 1899 glDeleteTextures(2, &textures[0]); 1900 }); 1901 ES3F_ADD_API_CASE(compressedtexsubimage2d_max_level, "Invalid glCompressedTexSubImage2D() usage", 1902 { 1903 deUint32 textures[2]; 1904 glGenTextures (2, &textures[0]); 1905 glBindTexture (GL_TEXTURE_2D, textures[0]); 1906 glCompressedTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0, etc2EacDataSize(18, 18), 0); 1907 glBindTexture (GL_TEXTURE_CUBE_MAP, textures[1]); 1908 FOR_CUBE_FACES(faceGL, glCompressedTexImage2D(faceGL, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 0, etc2EacDataSize(18, 18), 0);); 1909 expectError (GL_NO_ERROR); 1910 1911 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE)."); 1912 deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1; 1913 glCompressedTexSubImage2D(GL_TEXTURE_2D, log2MaxTextureSize, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 1914 expectError(GL_INVALID_VALUE); 1915 m_log << TestLog::EndSection; 1916 1917 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_CUBE_MAP_TEXTURE_SIZE)."); 1918 deUint32 log2MaxCubemapSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_CUBE_MAP_TEXTURE_SIZE)) + 1; 1919 FOR_CUBE_FACES(faceGL, 1920 { 1921 glCompressedTexSubImage2D(faceGL, log2MaxCubemapSize, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 1922 expectError(GL_INVALID_VALUE); 1923 }); 1924 m_log << TestLog::EndSection; 1925 1926 glDeleteTextures(2, &textures[0]); 1927 }); 1928 ES3F_ADD_API_CASE(compressedtexsubimage2d_neg_offset, "Invalid glCompressedTexSubImage2D() usage", 1929 { 1930 GLuint texture; 1931 glGenTextures(1, &texture); 1932 glBindTexture(GL_TEXTURE_2D, texture); 1933 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 8, 8, 0, etc2EacDataSize(8, 8), 0); 1934 1935 // \note Both GL_INVALID_VALUE and GL_INVALID_OPERATION are valid here since implementation may 1936 // first check if offsets are valid for certain format and only after that check that they 1937 // are not negative. 1938 m_log << TestLog::Section("", "GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if xoffset or yoffset are negative."); 1939 1940 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, -4, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 1941 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 1942 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, -4, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 1943 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 1944 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, -4, -4, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 1945 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 1946 1947 m_log << TestLog::EndSection; 1948 1949 glDeleteTextures(1, &texture); 1950 }); 1951 ES3F_ADD_API_CASE(compressedtexsubimage2d_invalid_offset, "Invalid glCompressedTexSubImage2D() usage", 1952 { 1953 deUint32 texture; 1954 glGenTextures (1, &texture); 1955 glBindTexture (GL_TEXTURE_2D, texture); 1956 glCompressedTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0); 1957 expectError (GL_NO_ERROR); 1958 1959 m_log << TestLog::Section("", "GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if xoffset + width > texture_width or yoffset + height > texture_height."); 1960 1961 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 12, 0, 8, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(8, 4), 0); 1962 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 1963 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 12, 4, 8, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 8), 0); 1964 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 1965 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 12, 12, 8, 8, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(8, 8), 0); 1966 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 1967 m_log << TestLog::EndSection; 1968 1969 glDeleteTextures (1, &texture); 1970 }); 1971 ES3F_ADD_API_CASE(compressedtexsubimage2d_neg_width_height, "Invalid glCompressedTexSubImage2D() usage", 1972 { 1973 deUint32 texture; 1974 glGenTextures (1, &texture); 1975 glBindTexture (GL_TEXTURE_2D, texture); 1976 glCompressedTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0); 1977 expectError (GL_NO_ERROR); 1978 1979 m_log << TestLog::Section("", "GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if width or height is less than 0."); 1980 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -4, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 1981 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 1982 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, -4, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 1983 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 1984 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -4, -4, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 1985 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 1986 m_log << TestLog::EndSection; 1987 1988 glDeleteTextures(1, &texture); 1989 }); 1990 ES3F_ADD_API_CASE(compressedtexsubimage2d_invalid_size, "Invalid glCompressedTexImage2D() usage", 1991 { 1992 deUint32 texture; 1993 glGenTextures (1, &texture); 1994 glBindTexture (GL_TEXTURE_2D, texture); 1995 glCompressedTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0); 1996 expectError (GL_NO_ERROR); 1997 1998 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if imageSize is not consistent with the format, dimensions, and contents of the specified compressed image data."); 1999 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0); 2000 expectError(GL_INVALID_VALUE); 2001 2002 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 16, 16, GL_COMPRESSED_RGBA8_ETC2_EAC, 4*4*16-1, 0); 2003 expectError(GL_INVALID_VALUE); 2004 m_log << TestLog::EndSection; 2005 2006 glDeleteTextures (1, &texture); 2007 }); 2008 ES3F_ADD_API_CASE(compressedtexsubimage2d_invalid_buffer_target, "Invalid glCompressedTexSubImage2D() usage", 2009 { 2010 deUint32 buf; 2011 deUint32 texture; 2012 std::vector<GLubyte> data(128); 2013 2014 glGenTextures (1, &texture); 2015 glBindTexture (GL_TEXTURE_2D, texture); 2016 glCompressedTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 0, etc2EacDataSize(16, 16), 0); 2017 glGenBuffers (1, &buf); 2018 glBindBuffer (GL_PIXEL_UNPACK_BUFFER, buf); 2019 glBufferData (GL_PIXEL_UNPACK_BUFFER, 128, &data[0], GL_DYNAMIC_COPY); 2020 expectError (GL_NO_ERROR); 2021 2022 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and..."); 2023 m_log << TestLog::Section("", "...the buffer object's data store is currently mapped."); 2024 glMapBufferRange (GL_PIXEL_UNPACK_BUFFER, 0, 128, GL_MAP_WRITE_BIT); 2025 glCompressedTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0); 2026 expectError (GL_INVALID_OPERATION); 2027 glUnmapBuffer (GL_PIXEL_UNPACK_BUFFER); 2028 m_log << TestLog::EndSection; 2029 2030 m_log << TestLog::Section("", "...the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size."); 2031 glCompressedTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, 16, 16, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(16, 16), 0); 2032 expectError (GL_INVALID_OPERATION); 2033 m_log << TestLog::EndSection; 2034 m_log << TestLog::EndSection; 2035 2036 glDeleteBuffers (1, &buf); 2037 glDeleteTextures (1, &texture); 2038 }); 2039 2040 // glTexImage3D 2041 2042 ES3F_ADD_API_CASE(teximage3d, "Invalid glTexImage3D() usage", 2043 { 2044 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid."); 2045 glTexImage3D(0, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2046 expectError(GL_INVALID_ENUM); 2047 glTexImage3D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2048 expectError(GL_INVALID_ENUM); 2049 m_log << TestLog::EndSection; 2050 2051 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if type is not a type constant."); 2052 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, 0, 0); 2053 expectError(GL_INVALID_ENUM); 2054 m_log << TestLog::EndSection; 2055 2056 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if format is not an accepted format constant."); 2057 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, 0, GL_UNSIGNED_BYTE, 0); 2058 expectError(GL_INVALID_ENUM); 2059 m_log << TestLog::EndSection; 2060 2061 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if internalFormat is not one of the accepted resolution and format symbolic constants " 2062 "or GL_INVALID_OPERATION is generated if internalformat, format and type are not compatible."); 2063 glTexImage3D(GL_TEXTURE_3D, 0, 0, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2064 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 2065 m_log << TestLog::EndSection; 2066 2067 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if target is GL_TEXTURE_3D and format is GL_DEPTH_COMPONENT, or GL_DEPTH_STENCIL."); 2068 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_BYTE, 0); 2069 expectError(GL_INVALID_OPERATION); 2070 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0); 2071 expectError(GL_INVALID_OPERATION); 2072 m_log << TestLog::EndSection; 2073 2074 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the combination of internalFormat, format and type is invalid."); 2075 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2076 expectError(GL_INVALID_OPERATION); 2077 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0); 2078 expectError(GL_INVALID_OPERATION); 2079 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB5_A1, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0); 2080 expectError(GL_INVALID_OPERATION); 2081 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB10_A2, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_2_10_10_10_REV, 0); 2082 expectError(GL_INVALID_OPERATION); 2083 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA32UI, 1, 1, 1, 0, GL_RGBA_INTEGER, GL_INT, 0); 2084 expectError(GL_INVALID_OPERATION); 2085 m_log << TestLog::EndSection; 2086 }); 2087 ES3F_ADD_API_CASE(teximage3d_neg_level, "Invalid glTexImage3D() usage", 2088 { 2089 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 2090 glTexImage3D(GL_TEXTURE_3D, -1, GL_RGB, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 2091 expectError(GL_INVALID_VALUE); 2092 glTexImage3D(GL_TEXTURE_2D_ARRAY, -1, GL_RGB, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 2093 expectError(GL_INVALID_VALUE); 2094 m_log << TestLog::EndSection; 2095 }); 2096 ES3F_ADD_API_CASE(teximage3d_max_level, "Invalid glTexImage3D() usage", 2097 { 2098 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_3D_TEXTURE_SIZE)."); 2099 deUint32 log2Max3DTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_3D_TEXTURE_SIZE)) + 1; 2100 glTexImage3D(GL_TEXTURE_3D, log2Max3DTextureSize, GL_RGB, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 2101 expectError(GL_INVALID_VALUE); 2102 m_log << TestLog::EndSection; 2103 2104 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE)."); 2105 deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1; 2106 glTexImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, GL_RGB, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 2107 expectError(GL_INVALID_VALUE); 2108 m_log << TestLog::EndSection; 2109 }); 2110 ES3F_ADD_API_CASE(teximage3d_neg_width_height_depth, "Invalid glTexImage3D() usage", 2111 { 2112 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than 0."); 2113 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, -1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2114 expectError(GL_INVALID_VALUE); 2115 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, -1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2116 expectError(GL_INVALID_VALUE); 2117 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2118 expectError(GL_INVALID_VALUE); 2119 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, -1, -1, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2120 expectError(GL_INVALID_VALUE); 2121 2122 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, -1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2123 expectError(GL_INVALID_VALUE); 2124 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, -1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2125 expectError(GL_INVALID_VALUE); 2126 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, 1, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2127 expectError(GL_INVALID_VALUE); 2128 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, -1, -1, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2129 expectError(GL_INVALID_VALUE); 2130 m_log << TestLog::EndSection; 2131 }); 2132 ES3F_ADD_API_CASE(teximage3d_max_width_height_depth, "Invalid glTexImage3D() usage", 2133 { 2134 int max3DTextureSize = m_context.getContextInfo().getInt(GL_MAX_3D_TEXTURE_SIZE) + 1; 2135 int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE) + 1; 2136 2137 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width, height or depth is greater than GL_MAX_3D_TEXTURE_SIZE."); 2138 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, max3DTextureSize, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2139 expectError(GL_INVALID_VALUE); 2140 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, max3DTextureSize, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2141 expectError(GL_INVALID_VALUE); 2142 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, max3DTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2143 expectError(GL_INVALID_VALUE); 2144 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, max3DTextureSize, max3DTextureSize, max3DTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2145 expectError(GL_INVALID_VALUE); 2146 m_log << TestLog::EndSection; 2147 2148 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width, height or depth is greater than GL_MAX_TEXTURE_SIZE."); 2149 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, maxTextureSize, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2150 expectError(GL_INVALID_VALUE); 2151 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, maxTextureSize, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2152 expectError(GL_INVALID_VALUE); 2153 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, 1, maxTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2154 expectError(GL_INVALID_VALUE); 2155 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, maxTextureSize, maxTextureSize, maxTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2156 expectError(GL_INVALID_VALUE); 2157 m_log << TestLog::EndSection; 2158 }); 2159 ES3F_ADD_API_CASE(teximage3d_invalid_border, "Invalid glTexImage3D() usage", 2160 { 2161 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0 or 1."); 2162 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 1, 1, 1, -1, GL_RGB, GL_UNSIGNED_BYTE, 0); 2163 expectError(GL_INVALID_VALUE); 2164 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 1, 1, 1, 2, GL_RGB, GL_UNSIGNED_BYTE, 0); 2165 expectError(GL_INVALID_VALUE); 2166 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 1, 1, 1, -1, GL_RGB, GL_UNSIGNED_BYTE, 0); 2167 expectError(GL_INVALID_VALUE); 2168 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 1, 1, 1, 2, GL_RGB, GL_UNSIGNED_BYTE, 0); 2169 expectError(GL_INVALID_VALUE); 2170 m_log << TestLog::EndSection; 2171 }); 2172 ES3F_ADD_API_CASE(teximage3d_invalid_buffer_target, "Invalid glTexImage3D() usage", 2173 { 2174 deUint32 buf; 2175 deUint32 texture; 2176 std::vector<GLubyte> data(512); 2177 2178 glGenBuffers (1, &buf); 2179 glBindBuffer (GL_PIXEL_UNPACK_BUFFER, buf); 2180 glBufferData (GL_PIXEL_UNPACK_BUFFER, 512, &data[0], GL_DYNAMIC_COPY); 2181 glGenTextures (1, &texture); 2182 glBindTexture (GL_TEXTURE_3D, texture); 2183 expectError (GL_NO_ERROR); 2184 2185 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and..."); 2186 2187 m_log << TestLog::Section("", "...the buffer object's data store is currently mapped."); 2188 glMapBufferRange (GL_PIXEL_UNPACK_BUFFER, 0, 128, GL_MAP_WRITE_BIT); 2189 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2190 expectError (GL_INVALID_OPERATION); 2191 glUnmapBuffer (GL_PIXEL_UNPACK_BUFFER); 2192 m_log << TestLog::EndSection; 2193 2194 m_log << TestLog::Section("", "...the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size."); 2195 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 64, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2196 expectError (GL_INVALID_OPERATION); 2197 m_log << TestLog::EndSection; 2198 2199 m_log << TestLog::Section("", "...data is not evenly divisible into the number of bytes needed to store in memory a datum indicated by type."); 2200 m_log << TestLog::Message << "// Set byte offset = 3" << TestLog::EndMessage; 2201 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGB5_A1, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, (const GLvoid*)3); 2202 expectError (GL_INVALID_OPERATION); 2203 m_log << TestLog::EndSection; 2204 2205 m_log << TestLog::EndSection; 2206 2207 glDeleteBuffers (1, &buf); 2208 glDeleteTextures (1, &texture); 2209 }); 2210 2211 // glTexSubImage3D 2212 2213 ES3F_ADD_API_CASE(texsubimage3d, "Invalid glTexSubImage3D() usage", 2214 { 2215 deUint32 texture; 2216 glGenTextures (1, &texture); 2217 glBindTexture (GL_TEXTURE_3D, texture); 2218 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2219 expectError (GL_NO_ERROR); 2220 2221 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid."); 2222 glTexSubImage3D(0, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2223 expectError(GL_INVALID_ENUM); 2224 glTexSubImage3D(GL_TEXTURE_2D, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2225 expectError(GL_INVALID_ENUM); 2226 m_log << TestLog::EndSection; 2227 2228 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if format is not an accepted format constant."); 2229 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 4, 4, 4, GL_UNSIGNED_BYTE, 0); 2230 expectError(GL_INVALID_ENUM); 2231 m_log << TestLog::EndSection; 2232 2233 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if type is not a type constant."); 2234 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, 0, 0); 2235 expectError(GL_INVALID_ENUM); 2236 m_log << TestLog::EndSection; 2237 2238 m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if the combination of internalFormat of the previously specified texture array, format and type is not valid."); 2239 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0); 2240 expectError(GL_INVALID_OPERATION); 2241 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0); 2242 expectError(GL_INVALID_OPERATION); 2243 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0); 2244 expectError(GL_INVALID_OPERATION); 2245 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGBA_INTEGER, GL_UNSIGNED_INT, 0); 2246 expectError(GL_INVALID_OPERATION); 2247 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_FLOAT, 0); 2248 expectError(GL_INVALID_OPERATION); 2249 m_log << tcu::TestLog::EndSection; 2250 2251 glDeleteTextures (1, &texture); 2252 }); 2253 ES3F_ADD_API_CASE(texsubimage3d_neg_level, "Invalid glTexSubImage3D() usage", 2254 { 2255 deUint32 textures[2]; 2256 glGenTextures (2, &textures[0]); 2257 glBindTexture (GL_TEXTURE_3D, textures[0]); 2258 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2259 glBindTexture (GL_TEXTURE_2D_ARRAY, textures[1]); 2260 glTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2261 expectError (GL_NO_ERROR); 2262 2263 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 2264 glTexSubImage3D(GL_TEXTURE_3D, -1, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2265 expectError(GL_INVALID_VALUE); 2266 glTexSubImage3D(GL_TEXTURE_2D_ARRAY, -1, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2267 expectError(GL_INVALID_VALUE); 2268 m_log << TestLog::EndSection; 2269 2270 glDeleteTextures (2, &textures[0]); 2271 }); 2272 ES3F_ADD_API_CASE(texsubimage3d_max_level, "Invalid glTexSubImage3D() usage", 2273 { 2274 deUint32 textures[2]; 2275 glGenTextures (2, &textures[0]); 2276 glBindTexture (GL_TEXTURE_3D, textures[0]); 2277 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2278 glBindTexture (GL_TEXTURE_2D_ARRAY, textures[1]); 2279 glTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2280 expectError (GL_NO_ERROR); 2281 2282 deUint32 log2Max3DTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_3D_TEXTURE_SIZE)) + 1; 2283 deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1; 2284 2285 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_3D_TEXTURE_SIZE)."); 2286 glTexSubImage3D(GL_TEXTURE_3D, log2Max3DTextureSize, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2287 expectError(GL_INVALID_VALUE); 2288 m_log << TestLog::EndSection; 2289 2290 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE)."); 2291 glTexSubImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2292 expectError(GL_INVALID_VALUE); 2293 m_log << TestLog::EndSection; 2294 2295 glDeleteTextures (2, &textures[0]); 2296 }); 2297 ES3F_ADD_API_CASE(texsubimage3d_neg_offset, "Invalid glTexSubImage3D() usage", 2298 { 2299 deUint32 textures[2]; 2300 glGenTextures (2, &textures[0]); 2301 glBindTexture (GL_TEXTURE_3D, textures[0]); 2302 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2303 glBindTexture (GL_TEXTURE_2D_ARRAY, textures[1]); 2304 glTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2305 expectError (GL_NO_ERROR); 2306 2307 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset, yoffset or zoffset are negative."); 2308 glTexSubImage3D(GL_TEXTURE_3D, 0, -1, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2309 expectError(GL_INVALID_VALUE); 2310 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2311 expectError(GL_INVALID_VALUE); 2312 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2313 expectError(GL_INVALID_VALUE); 2314 glTexSubImage3D(GL_TEXTURE_3D, 0, -1, -1, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2315 expectError(GL_INVALID_VALUE); 2316 glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -1, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2317 expectError(GL_INVALID_VALUE); 2318 glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, -1, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2319 expectError(GL_INVALID_VALUE); 2320 glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2321 expectError(GL_INVALID_VALUE); 2322 glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -1, -1, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2323 expectError(GL_INVALID_VALUE); 2324 m_log << TestLog::EndSection; 2325 2326 glDeleteTextures (2, &textures[0]); 2327 }); 2328 ES3F_ADD_API_CASE(texsubimage3d_invalid_offset, "Invalid glTexSubImage3D() usage", 2329 { 2330 deUint32 texture; 2331 glGenTextures (1, &texture); 2332 glBindTexture (GL_TEXTURE_3D, texture); 2333 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2334 expectError (GL_NO_ERROR); 2335 2336 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset + width > texture_width."); 2337 glTexSubImage3D(GL_TEXTURE_3D, 0, 2, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2338 expectError(GL_INVALID_VALUE); 2339 m_log << TestLog::EndSection; 2340 2341 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if yoffset + height > texture_height."); 2342 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 2, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2343 expectError(GL_INVALID_VALUE); 2344 m_log << TestLog::EndSection; 2345 2346 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if zoffset + depth > texture_depth."); 2347 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 2, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2348 expectError(GL_INVALID_VALUE); 2349 m_log << TestLog::EndSection; 2350 2351 glDeleteTextures (1, &texture); 2352 }); 2353 ES3F_ADD_API_CASE(texsubimage3d_neg_width_height, "Invalid glTexSubImage3D() usage", 2354 { 2355 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width, height or depth is less than 0."); 2356 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, -1, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2357 expectError(GL_INVALID_VALUE); 2358 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2359 expectError(GL_INVALID_VALUE); 2360 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2361 expectError(GL_INVALID_VALUE); 2362 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, -1, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2363 expectError(GL_INVALID_VALUE); 2364 m_log << TestLog::EndSection; 2365 }); 2366 ES3F_ADD_API_CASE(texsubimage3d_invalid_buffer_target, "Invalid glTexSubImage3D() usage", 2367 { 2368 deUint32 buf; 2369 deUint32 texture; 2370 std::vector<GLubyte> data(512); 2371 2372 glGenTextures (1, &texture); 2373 glBindTexture (GL_TEXTURE_3D, texture); 2374 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 16, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2375 glGenBuffers (1, &buf); 2376 glBindBuffer (GL_PIXEL_UNPACK_BUFFER, buf); 2377 glBufferData (GL_PIXEL_UNPACK_BUFFER, 512, &data[0], GL_DYNAMIC_COPY); 2378 expectError (GL_NO_ERROR); 2379 2380 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and..."); 2381 2382 m_log << TestLog::Section("", "...the buffer object's data store is currently mapped."); 2383 glMapBufferRange (GL_PIXEL_UNPACK_BUFFER, 0, 512, GL_MAP_WRITE_BIT); 2384 glTexSubImage3D (GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2385 expectError (GL_INVALID_OPERATION); 2386 glUnmapBuffer (GL_PIXEL_UNPACK_BUFFER); 2387 m_log << TestLog::EndSection; 2388 2389 m_log << TestLog::Section("", "...the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size."); 2390 glTexSubImage3D (GL_TEXTURE_3D, 0, 0, 0, 0, 16, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2391 expectError (GL_INVALID_OPERATION); 2392 m_log << TestLog::EndSection; 2393 2394 m_log << TestLog::Section("", "...data is not evenly divisible into the number of bytes needed to store in memory a datum indicated by type."); 2395 m_log << TestLog::Message << "// Set byte offset = 3" << TestLog::EndMessage; 2396 glBindBuffer (GL_PIXEL_UNPACK_BUFFER, 0); 2397 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA4, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 0); 2398 glBindBuffer (GL_PIXEL_UNPACK_BUFFER, buf); 2399 expectError (GL_NO_ERROR); 2400 glTexSubImage3D (GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, (const GLvoid*)3); 2401 expectError (GL_INVALID_OPERATION); 2402 m_log << TestLog::EndSection; 2403 2404 m_log << TestLog::EndSection; 2405 2406 glDeleteBuffers (1, &buf); 2407 glDeleteTextures (1, &texture); 2408 }); 2409 2410 // glCopyTexSubImage3D 2411 2412 ES3F_ADD_API_CASE(copytexsubimage3d, "Invalid glCopyTexSubImage3D() usage", 2413 { 2414 GLuint texture; 2415 glGenTextures (1, &texture); 2416 glBindTexture (GL_TEXTURE_3D, texture); 2417 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2418 2419 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid."); 2420 glCopyTexSubImage3D(0, 0, 0, 0, 0, 0, 0, 4, 4); 2421 expectError(GL_INVALID_ENUM); 2422 m_log << TestLog::EndSection; 2423 2424 glDeleteTextures(1, &texture); 2425 }); 2426 ES3F_ADD_API_CASE(copytexsubimage3d_neg_level, "Invalid glCopyTexSubImage3D() usage", 2427 { 2428 deUint32 textures[2]; 2429 glGenTextures (2, &textures[0]); 2430 glBindTexture (GL_TEXTURE_3D, textures[0]); 2431 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2432 glBindTexture (GL_TEXTURE_2D_ARRAY, textures[1]); 2433 glTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2434 expectError (GL_NO_ERROR); 2435 2436 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 2437 glCopyTexSubImage3D(GL_TEXTURE_3D, -1, 0, 0, 0, 0, 0, 4, 4); 2438 expectError(GL_INVALID_VALUE); 2439 glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, -1, 0, 0, 0, 0, 0, 4, 4); 2440 expectError(GL_INVALID_VALUE); 2441 m_log << TestLog::EndSection; 2442 2443 glDeleteTextures(2, &textures[0]); 2444 }); 2445 ES3F_ADD_API_CASE(copytexsubimage3d_max_level, "Invalid glCopyTexSubImage3D() usage", 2446 { 2447 deUint32 log2Max3DTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_3D_TEXTURE_SIZE)) + 1; 2448 deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1; 2449 2450 deUint32 textures[2]; 2451 glGenTextures (2, &textures[0]); 2452 glBindTexture (GL_TEXTURE_3D, textures[0]); 2453 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2454 glBindTexture (GL_TEXTURE_2D_ARRAY, textures[1]); 2455 glTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2456 expectError (GL_NO_ERROR); 2457 2458 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_3D_TEXTURE_SIZE)."); 2459 glCopyTexSubImage3D(GL_TEXTURE_3D, log2Max3DTextureSize, 0, 0, 0, 0, 0, 4, 4); 2460 expectError(GL_INVALID_VALUE); 2461 m_log << TestLog::EndSection; 2462 2463 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE)."); 2464 glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, 0, 0, 0, 0, 0, 4, 4); 2465 expectError(GL_INVALID_VALUE); 2466 m_log << TestLog::EndSection; 2467 2468 glDeleteTextures(2, &textures[0]); 2469 }); 2470 ES3F_ADD_API_CASE(copytexsubimage3d_neg_offset, "Invalid glCopyTexSubImage3D() usage", 2471 { 2472 GLuint texture; 2473 glGenTextures (1, &texture); 2474 glBindTexture (GL_TEXTURE_3D, texture); 2475 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2476 2477 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset, yoffset or zoffset is negative."); 2478 glCopyTexSubImage3D(GL_TEXTURE_3D, 0, -1, 0, 0, 0, 0, 4, 4); 2479 expectError(GL_INVALID_VALUE); 2480 glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, -1, 0, 0, 0, 4, 4); 2481 expectError(GL_INVALID_VALUE); 2482 glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, -1, 0, 0, 4, 4); 2483 expectError(GL_INVALID_VALUE); 2484 glCopyTexSubImage3D(GL_TEXTURE_3D, 0, -1, -1, -1, 0, 0, 4, 4); 2485 expectError(GL_INVALID_VALUE); 2486 m_log << TestLog::EndSection; 2487 2488 glDeleteTextures(1, &texture); 2489 }); 2490 ES3F_ADD_API_CASE(copytexsubimage3d_invalid_offset, "Invalid glCopyTexSubImage3D() usage", 2491 { 2492 GLuint texture; 2493 glGenTextures (1, &texture); 2494 glBindTexture (GL_TEXTURE_3D, texture); 2495 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2496 2497 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if xoffset + width > texture_width."); 2498 glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 1, 0, 0, 0, 0, 4, 4); 2499 expectError(GL_INVALID_VALUE); 2500 m_log << TestLog::EndSection; 2501 2502 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if yoffset + height > texture_height."); 2503 glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 1, 0, 0, 0, 4, 4); 2504 expectError(GL_INVALID_VALUE); 2505 m_log << TestLog::EndSection; 2506 2507 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if zoffset + 1 > texture_depth."); 2508 glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 4, 0, 0, 4, 4); 2509 expectError(GL_INVALID_VALUE); 2510 m_log << TestLog::EndSection; 2511 2512 glDeleteTextures(1, &texture); 2513 }); 2514 ES3F_ADD_API_CASE(copytexsubimage3d_neg_width_height, "Invalid glCopyTexSubImage3D() usage", 2515 { 2516 GLuint texture; 2517 glGenTextures (1, &texture); 2518 glBindTexture (GL_TEXTURE_3D, texture); 2519 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2520 2521 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width < 0."); 2522 glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, -4, 4); 2523 expectError(GL_INVALID_VALUE); 2524 m_log << TestLog::EndSection; 2525 2526 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if height < 0."); 2527 glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 4, -4); 2528 expectError(GL_INVALID_VALUE); 2529 m_log << TestLog::EndSection; 2530 2531 glDeleteTextures(1, &texture); 2532 }); 2533 ES3F_ADD_API_CASE(copytexsubimage3d_incomplete_framebuffer, "Invalid glCopyTexSubImage3D() usage", 2534 { 2535 GLuint fbo; 2536 GLuint texture[2]; 2537 2538 glGenTextures (2, texture); 2539 glBindTexture (GL_TEXTURE_3D, texture[0]); 2540 glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2541 glBindTexture (GL_TEXTURE_2D_ARRAY, texture[1]); 2542 glTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 2543 glGenFramebuffers (1, &fbo); 2544 glBindFramebuffer (GL_READ_FRAMEBUFFER, fbo); 2545 glCheckFramebufferStatus(GL_READ_FRAMEBUFFER); 2546 2547 m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete."); 2548 glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 4, 4); 2549 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 2550 glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, 4, 4); 2551 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 2552 m_log << tcu::TestLog::EndSection; 2553 2554 glBindFramebuffer(GL_FRAMEBUFFER, 0); 2555 glDeleteFramebuffers(1, &fbo); 2556 glDeleteTextures(2, texture); 2557 }); 2558 2559 // glCompressedTexImage3D 2560 2561 ES3F_ADD_API_CASE(compressedteximage3d, "Invalid glCompressedTexImage3D() usage", 2562 { 2563 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid."); 2564 glCompressedTexImage3D(0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0, 0); 2565 expectError(GL_INVALID_ENUM); 2566 glCompressedTexImage3D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0, 0); 2567 expectError(GL_INVALID_ENUM); 2568 m_log << TestLog::EndSection; 2569 2570 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if internalformat is not one of the specific compressed internal formats."); 2571 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, 0, 0); 2572 expectError(GL_INVALID_ENUM); 2573 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 0, 0, 0, 0, 0, 0); 2574 expectError(GL_INVALID_ENUM); 2575 m_log << TestLog::EndSection; 2576 }); 2577 ES3F_ADD_API_CASE(compressedteximage3d_neg_level, "Invalid glCompressedTexImage3D() usage", 2578 { 2579 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 2580 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, -1, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0, 0); 2581 expectError(GL_INVALID_VALUE); 2582 m_log << TestLog::EndSection; 2583 }); 2584 ES3F_ADD_API_CASE(compressedteximage3d_max_level, "Invalid glCompressedTexImage3D() usage", 2585 { 2586 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE)."); 2587 deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1; 2588 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0, 0); 2589 expectError(GL_INVALID_VALUE); 2590 m_log << TestLog::EndSection; 2591 }); 2592 ES3F_ADD_API_CASE(compressedteximage3d_neg_width_height_depth, "Invalid glCompressedTexImage3D() usage", 2593 { 2594 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width, height or depth is less than 0."); 2595 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0, 0, 0, 0, 0); 2596 expectError(GL_INVALID_VALUE); 2597 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, -1, 0, 0, 0, 0); 2598 expectError(GL_INVALID_VALUE); 2599 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0, 0); 2600 expectError(GL_INVALID_VALUE); 2601 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, -1, -1, 0, 0, 0); 2602 expectError(GL_INVALID_VALUE); 2603 m_log << TestLog::EndSection; 2604 }); 2605 ES3F_ADD_API_CASE(compressedteximage3d_max_width_height_depth, "Invalid glCompressedTexImage3D() usage", 2606 { 2607 int maxTextureSize = m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE) + 1; 2608 2609 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width, height or depth is greater than GL_MAX_TEXTURE_SIZE."); 2610 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxTextureSize, 0, 0, 0, 0, 0); 2611 expectError(GL_INVALID_VALUE); 2612 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, maxTextureSize, 0, 0, 0, 0); 2613 expectError(GL_INVALID_VALUE); 2614 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, maxTextureSize, 0, 0, 0); 2615 expectError(GL_INVALID_VALUE); 2616 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxTextureSize, maxTextureSize, maxTextureSize, 0, 0, 0); 2617 expectError(GL_INVALID_VALUE); 2618 m_log << TestLog::EndSection; 2619 }); 2620 ES3F_ADD_API_CASE(compressedteximage3d_invalid_border, "Invalid glCompressedTexImage3D() usage", 2621 { 2622 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if border is not 0."); 2623 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, -1, 0, 0); 2624 expectError(GL_INVALID_VALUE); 2625 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 1, 0, 0); 2626 expectError(GL_INVALID_VALUE); 2627 m_log << TestLog::EndSection; 2628 }); 2629 ES3F_ADD_API_CASE(compressedteximage3d_invalid_size, "Invalid glCompressedTexImage3D() usage", 2630 { 2631 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if imageSize is not consistent with the format, dimensions, and contents of the specified compressed image data."); 2632 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, -1, 0); 2633 expectError(GL_INVALID_VALUE); 2634 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, 4*4*8, 0); 2635 expectError(GL_INVALID_VALUE); 2636 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 1, 0, 4*4*16, 0); 2637 expectError(GL_INVALID_VALUE); 2638 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_SIGNED_R11_EAC, 16, 16, 1, 0, 4*4*16, 0); 2639 expectError(GL_INVALID_VALUE); 2640 m_log << TestLog::EndSection; 2641 }); 2642 ES3F_ADD_API_CASE(compressedteximage3d_invalid_buffer_target, "Invalid glCompressedTexImage3D() usage", 2643 { 2644 deUint32 buf; 2645 std::vector<GLubyte> data(512); 2646 2647 glGenBuffers (1, &buf); 2648 glBindBuffer (GL_PIXEL_UNPACK_BUFFER, buf); 2649 glBufferData (GL_PIXEL_UNPACK_BUFFER, 64, &data[0], GL_DYNAMIC_COPY); 2650 expectError (GL_NO_ERROR); 2651 2652 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and the buffer object's data store is currently mapped."); 2653 glMapBufferRange (GL_PIXEL_UNPACK_BUFFER, 0, 64, GL_MAP_WRITE_BIT); 2654 glCompressedTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGB8_ETC2, 4, 4, 1, 0, etc2DataSize(4, 4), 0); 2655 expectError (GL_INVALID_OPERATION); 2656 glUnmapBuffer (GL_PIXEL_UNPACK_BUFFER); 2657 m_log << TestLog::EndSection; 2658 2659 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size."); 2660 glCompressedTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 1, 0, etc2DataSize(16, 16), 0); 2661 expectError (GL_INVALID_OPERATION); 2662 m_log << TestLog::EndSection; 2663 2664 glDeleteBuffers (1, &buf); 2665 }); 2666 ES3F_ADD_API_CASE(compressedteximage3d_invalid_astc_target, "Invalid glCompressedTexImage3D() ASTC 3D targets", 2667 { 2668 // GLES 3.0.4, Sec 3.8.6, p.147: For example, the 2669 // compressed image format might be supported only for 2D 2670 // textures ... result in an INVALID_OPERATION error. 2671 // Also, if LDR is supported, formats cannot be invalid enums 2672 2673 if (m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_hdr") || 2674 m_context.getContextInfo().isExtensionSupported("GL_OES_texture_compression_astc")) 2675 { 2676 m_log.writeMessage("Full ASTC supported. No negative API requirements."); 2677 } 2678 else 2679 { 2680 const GLuint requiredError = m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_ldr") ? GL_INVALID_OPERATION : GL_INVALID_ENUM; 2681 2682 if (requiredError == GL_INVALID_OPERATION) 2683 m_log.writeMessage("GL_INVALID_OPERATION should be generated if using TEXTURE_3D with LDR ASTC."); 2684 else 2685 m_log.writeMessage("GL_INVALID_ENUM should be generated if no ASTC extensions are present."); 2686 2687 for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_astcFormats); formatNdx++) 2688 { 2689 const GLuint format = s_astcFormats[formatNdx]; 2690 const CompressedTexFormat tcuFormat = mapGLCompressedTexFormat(format); 2691 const IVec3 blockPixels = getBlockPixelSize(tcuFormat); 2692 const size_t blockBytes = getBlockSize(tcuFormat); 2693 const vector<deUint8> dummyData (blockBytes); 2694 2695 glCompressedTexImage3D(GL_TEXTURE_3D, 0, format, blockPixels.x(), blockPixels.y(), blockPixels.z(), 0, blockBytes, &dummyData[0]); 2696 expectError(requiredError); 2697 } 2698 } 2699 }); 2700 2701 // glCompressedTexSubImage3D 2702 2703 ES3F_ADD_API_CASE(compressedtexsubimage3d, "Invalid glCompressedTexSubImage3D() usage", 2704 { 2705 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is invalid."); 2706 glCompressedTexSubImage3D(0, 0, 0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 2707 expectError(GL_INVALID_ENUM); 2708 m_log << TestLog::EndSection; 2709 2710 deUint32 texture; 2711 glGenTextures (1, &texture); 2712 glBindTexture (GL_TEXTURE_2D_ARRAY, texture); 2713 glCompressedTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 18, 18, 1, 0, etc2EacDataSize(18, 18), 0); 2714 expectError (GL_NO_ERROR); 2715 2716 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if format does not match the internal format of the texture image being modified."); 2717 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGB8_ETC2, 0, 0); 2718 expectError(GL_INVALID_OPERATION); 2719 m_log << TestLog::EndSection; 2720 2721 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if internalformat is an ETC2/EAC format and target is not GL_TEXTURE_2D_ARRAY."); 2722 glCompressedTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 18, 18, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(18, 18), 0); 2723 expectError(GL_INVALID_OPERATION); 2724 m_log << TestLog::EndSection; 2725 2726 m_log << TestLog::Section("", "For ETC2/EAC images GL_INVALID_OPERATION is generated if width is not a multiple of four, and width + xoffset is not equal to the width of the texture level."); 2727 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 4, 0, 0, 10, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(10, 4), 0); 2728 expectError(GL_INVALID_OPERATION); 2729 m_log << TestLog::EndSection; 2730 2731 m_log << TestLog::Section("", "For ETC2/EAC images GL_INVALID_OPERATION is generated if height is not a multiple of four, and height + yoffset is not equal to the height of the texture level."); 2732 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 4, 0, 4, 10, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 10), 0); 2733 expectError(GL_INVALID_OPERATION); 2734 m_log << TestLog::EndSection; 2735 2736 m_log << TestLog::Section("", "For ETC2/EAC images GL_INVALID_OPERATION is generated if xoffset or yoffset is not a multiple of four."); 2737 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 1, 0, 0, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0); 2738 expectError(GL_INVALID_OPERATION); 2739 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 1, 0, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0); 2740 expectError(GL_INVALID_OPERATION); 2741 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 1, 1, 0, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0); 2742 expectError(GL_INVALID_OPERATION); 2743 m_log << TestLog::EndSection; 2744 2745 glDeleteTextures (1, &texture); 2746 }); 2747 ES3F_ADD_API_CASE(compressedtexsubimage3d_neg_level, "Invalid glCompressedTexSubImage3D() usage", 2748 { 2749 deUint32 texture; 2750 glGenTextures (1, &texture); 2751 glBindTexture (GL_TEXTURE_2D_ARRAY, texture); 2752 glCompressedTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, etc2EacDataSize(16, 16), 0); 2753 expectError (GL_NO_ERROR); 2754 2755 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is less than 0."); 2756 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, -1, 0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 2757 expectError(GL_INVALID_VALUE); 2758 m_log << TestLog::EndSection; 2759 2760 glDeleteTextures (1, &texture); 2761 }); 2762 ES3F_ADD_API_CASE(compressedtexsubimage3d_max_level, "Invalid glCompressedTexSubImage3D() usage", 2763 { 2764 deUint32 texture; 2765 glGenTextures (1, &texture); 2766 glBindTexture (GL_TEXTURE_2D_ARRAY, texture); 2767 glCompressedTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, etc2EacDataSize(16, 16), 0); 2768 expectError (GL_NO_ERROR); 2769 2770 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if level is greater than log_2(GL_MAX_TEXTURE_SIZE)."); 2771 deUint32 log2MaxTextureSize = deLog2Floor32(m_context.getContextInfo().getInt(GL_MAX_TEXTURE_SIZE)) + 1; 2772 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, log2MaxTextureSize, 0, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 2773 expectError(GL_INVALID_VALUE); 2774 m_log << TestLog::EndSection; 2775 2776 glDeleteTextures (1, &texture); 2777 }); 2778 ES3F_ADD_API_CASE(compressedtexsubimage3d_neg_offset, "Invalid glCompressedTexSubImage3D() usage", 2779 { 2780 deUint32 texture; 2781 glGenTextures (1, &texture); 2782 glBindTexture (GL_TEXTURE_2D_ARRAY, texture); 2783 glCompressedTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, etc2EacDataSize(16, 16), 0); 2784 expectError (GL_NO_ERROR); 2785 2786 m_log << TestLog::Section("", "GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if xoffset, yoffset or zoffset are negative."); 2787 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -4, 0, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 2788 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 2789 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, -4, 0, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 2790 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 2791 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, -4, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 2792 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 2793 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -4, -4, -4, 0, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 2794 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 2795 m_log << TestLog::EndSection; 2796 2797 glDeleteTextures (1, &texture); 2798 }); 2799 ES3F_ADD_API_CASE(compressedtexsubimage3d_invalid_offset, "Invalid glCompressedTexSubImage3D() usage", 2800 { 2801 deUint32 texture; 2802 glGenTextures (1, &texture); 2803 glBindTexture (GL_TEXTURE_2D_ARRAY, texture); 2804 glCompressedTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 4, 4, 1, 0, etc2EacDataSize(4, 4), 0); 2805 expectError (GL_NO_ERROR); 2806 2807 m_log << TestLog::Section("", "GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if xoffset + width > texture_width or yoffset + height > texture_height."); 2808 2809 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 12, 0, 0, 8, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(8, 4), 0); 2810 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 2811 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 12, 0, 4, 8, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 8), 0); 2812 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 2813 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 12, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0); 2814 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 2815 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 12, 12, 12, 8, 8, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(8, 8), 0); 2816 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 2817 m_log << TestLog::EndSection; 2818 2819 glDeleteTextures (1, &texture); 2820 }); 2821 ES3F_ADD_API_CASE(compressedtexsubimage3d_neg_width_height_depth, "Invalid glCompressedTexSubImage3D() usage", 2822 { 2823 deUint32 texture; 2824 glGenTextures (1, &texture); 2825 glBindTexture (GL_TEXTURE_2D_ARRAY, texture); 2826 glCompressedTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, etc2EacDataSize(16, 16), 0); 2827 expectError (GL_NO_ERROR); 2828 2829 m_log << TestLog::Section("", "GL_INVALID_VALUE or GL_INVALID_OPERATION is generated if width, height or depth are negative."); 2830 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, -4, 0, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 2831 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 2832 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, -4, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 2833 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 2834 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, -4, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 2835 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 2836 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, -4, -4, -4, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0); 2837 expectError(GL_INVALID_VALUE, GL_INVALID_OPERATION); 2838 m_log << TestLog::EndSection; 2839 2840 glDeleteTextures (1, &texture); 2841 }); 2842 ES3F_ADD_API_CASE(compressedtexsubimage3d_invalid_size, "Invalid glCompressedTexSubImage3D() usage", 2843 { 2844 deUint32 texture; 2845 glGenTextures (1, &texture); 2846 glBindTexture (GL_TEXTURE_2D_ARRAY, texture); 2847 glCompressedTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, 4*4*16, 0); 2848 expectError (GL_NO_ERROR); 2849 2850 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if imageSize is not consistent with the format, dimensions, and contents of the specified compressed image data."); 2851 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 16, 16, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, -1, 0); 2852 expectError(GL_INVALID_VALUE); 2853 2854 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 16, 16, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, 4*4*16-1, 0); 2855 expectError(GL_INVALID_VALUE); 2856 m_log << TestLog::EndSection; 2857 2858 glDeleteTextures (1, &texture); 2859 }); 2860 ES3F_ADD_API_CASE(compressedtexsubimage3d_invalid_buffer_target, "Invalid glCompressedTexSubImage3D() usage", 2861 { 2862 deUint32 buf; 2863 deUint32 texture; 2864 GLsizei bufferSize = etc2EacDataSize(4, 4); 2865 std::vector<GLubyte> data(bufferSize); 2866 2867 glGenTextures (1, &texture); 2868 glBindTexture (GL_TEXTURE_2D_ARRAY, texture); 2869 glCompressedTexImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 16, 1, 0, etc2EacDataSize(16, 16), 0); 2870 glGenBuffers (1, &buf); 2871 glBindBuffer (GL_PIXEL_UNPACK_BUFFER, buf); 2872 glBufferData (GL_PIXEL_UNPACK_BUFFER, bufferSize, &data[0], GL_DYNAMIC_COPY); 2873 expectError (GL_NO_ERROR); 2874 2875 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to the GL_PIXEL_UNPACK_BUFFER target and..."); 2876 m_log << TestLog::Section("", "...the buffer object's data store is currently mapped."); 2877 glMapBufferRange (GL_PIXEL_UNPACK_BUFFER, 0, bufferSize, GL_MAP_WRITE_BIT); 2878 glCompressedTexSubImage3D (GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 4, 4, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(4, 4), 0); 2879 expectError (GL_INVALID_OPERATION); 2880 glUnmapBuffer (GL_PIXEL_UNPACK_BUFFER); 2881 m_log << TestLog::EndSection; 2882 2883 m_log << TestLog::Section("", "...the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size."); 2884 glCompressedTexSubImage3D (GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 16, 16, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, etc2EacDataSize(16, 16), 0); 2885 expectError (GL_INVALID_OPERATION); 2886 m_log << TestLog::EndSection; 2887 m_log << TestLog::EndSection; 2888 2889 glDeleteBuffers (1, &buf); 2890 glDeleteTextures (1, &texture); 2891 }); 2892 2893 // glTexStorage2D 2894 2895 ES3F_ADD_API_CASE(texstorage2d, "Invalid glTexStorage2D() usage", 2896 { 2897 deUint32 texture; 2898 glGenTextures (1, &texture); 2899 glBindTexture (GL_TEXTURE_2D, texture); 2900 2901 m_log << TestLog::Section("", "GL_INVALID_ENUM or GL_INVALID_VALUE is generated if internalformat is not a valid sized internal format."); 2902 glTexStorage2D (GL_TEXTURE_2D, 1, 0, 16, 16); 2903 expectError (GL_INVALID_ENUM, GL_INVALID_VALUE); 2904 glTexStorage2D (GL_TEXTURE_2D, 1, GL_RGBA_INTEGER, 16, 16); 2905 expectError (GL_INVALID_ENUM, GL_INVALID_VALUE); 2906 m_log << TestLog::EndSection; 2907 2908 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not one of the accepted target enumerants."); 2909 glTexStorage2D (0, 1, GL_RGBA8, 16, 16); 2910 expectError (GL_INVALID_ENUM); 2911 glTexStorage2D (GL_TEXTURE_3D, 1, GL_RGBA8, 16, 16); 2912 expectError (GL_INVALID_ENUM); 2913 glTexStorage2D (GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 16, 16); 2914 expectError (GL_INVALID_ENUM); 2915 m_log << TestLog::EndSection; 2916 2917 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height are less than 1."); 2918 glTexStorage2D (GL_TEXTURE_2D, 1, GL_RGBA8, 0, 16); 2919 expectError (GL_INVALID_VALUE); 2920 glTexStorage2D (GL_TEXTURE_2D, 1, GL_RGBA8, 16, 0); 2921 expectError (GL_INVALID_VALUE); 2922 glTexStorage2D (GL_TEXTURE_2D, 1, GL_RGBA8, 0, 0); 2923 expectError (GL_INVALID_VALUE); 2924 m_log << TestLog::EndSection; 2925 2926 glDeleteTextures(1, &texture); 2927 }); 2928 2929 ES3F_ADD_API_CASE(texstorage2d_invalid_binding, "Invalid glTexStorage2D() usage", 2930 { 2931 glBindTexture (GL_TEXTURE_2D, 0); 2932 2933 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the default texture object is curently bound to target."); 2934 glTexStorage2D (GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16); 2935 expectError (GL_INVALID_OPERATION); 2936 m_log << TestLog::EndSection; 2937 2938 deUint32 texture; 2939 glGenTextures (1, &texture); 2940 glBindTexture (GL_TEXTURE_2D, texture); 2941 2942 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the texture object currently bound to target already has GL_TEXTURE_IMMUTABLE_FORMAT set to GL_TRUE."); 2943 deInt32 immutable = -1; 2944 glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable); 2945 m_log << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage; 2946 glTexStorage2D (GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16); 2947 expectError (GL_NO_ERROR); 2948 glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable); 2949 m_log << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage; 2950 glTexStorage2D (GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16); 2951 expectError (GL_INVALID_OPERATION); 2952 m_log << TestLog::EndSection; 2953 2954 glDeleteTextures(1, &texture); 2955 }); 2956 ES3F_ADD_API_CASE(texstorage2d_invalid_levels, "Invalid glTexStorage2D() usage", 2957 { 2958 deUint32 texture; 2959 glGenTextures (1, &texture); 2960 glBindTexture (GL_TEXTURE_2D, texture); 2961 2962 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if levels is less than 1."); 2963 glTexStorage2D (GL_TEXTURE_2D, 0, GL_RGBA8, 16, 16); 2964 expectError (GL_INVALID_VALUE); 2965 glTexStorage2D (GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0); 2966 expectError (GL_INVALID_VALUE); 2967 m_log << TestLog::EndSection; 2968 2969 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if levels is greater than floor(log_2(max(width, height))) + 1"); 2970 deUint32 log2MaxSize = deLog2Floor32(deMax32(16, 4)) + 1 + 1; 2971 glTexStorage2D (GL_TEXTURE_2D, log2MaxSize, GL_RGBA8, 16, 4); 2972 expectError (GL_INVALID_OPERATION); 2973 glTexStorage2D (GL_TEXTURE_2D, log2MaxSize, GL_RGBA8, 4, 16); 2974 expectError (GL_INVALID_OPERATION); 2975 glTexStorage2D (GL_TEXTURE_2D, log2MaxSize, GL_RGBA8, 16, 16); 2976 expectError (GL_INVALID_OPERATION); 2977 m_log << TestLog::EndSection; 2978 2979 glDeleteTextures(1, &texture); 2980 }); 2981 ES3F_ADD_API_CASE(texstorage2d_invalid_astc_target, "ASTC formats require extensions present.", 2982 { 2983 // GLES 3.0.4, Sec 3.8.4, p.136: If there is no imageSize 2984 // for which this command would have been valid, an 2985 // INVALID_OPERATION error is generated. Also: If 2986 // executing the pseudo-code would result in any other 2987 // error, the error is generated and the command will have 2988 // no effect. 2989 // In conclusion: Expect same errors as with TexImage?D 2990 2991 if (m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_ldr")) 2992 { 2993 m_log.writeMessage("ASTC supported. No negative API requirements."); 2994 } 2995 else 2996 { 2997 // In earlier tests both codes are accepted for invalid target format. 2998 m_log.writeMessage("GL_INVALID_ENUM or GL_INVALID_VALUE should be generated if no ASTC extensions are present."); 2999 3000 for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_astcFormats); formatNdx++) 3001 { 3002 const GLuint format = s_astcFormats[formatNdx]; 3003 const CompressedTexFormat tcuFormat = mapGLCompressedTexFormat(format); 3004 const IVec3 blockPixels = getBlockPixelSize(tcuFormat); 3005 const deInt32 cubeSize = blockPixels.x() * blockPixels.y(); // Divisible by the block size and square 3006 deUint32 texture = 0; 3007 3008 glGenTextures (1, &texture); 3009 glBindTexture (GL_TEXTURE_2D, texture); 3010 3011 glTexStorage2D (GL_TEXTURE_2D, 1, format, blockPixels.x(), blockPixels.y()); 3012 expectError (GL_INVALID_ENUM, GL_INVALID_VALUE); 3013 3014 glDeleteTextures(1, &texture); 3015 3016 glGenTextures (1, &texture); 3017 glBindTexture (GL_TEXTURE_CUBE_MAP, texture); 3018 3019 glTexStorage2D (GL_TEXTURE_CUBE_MAP, 1, format, cubeSize, cubeSize); 3020 expectError (GL_INVALID_ENUM, GL_INVALID_VALUE); 3021 3022 glDeleteTextures(1, &texture); 3023 } 3024 } 3025 }); 3026 3027 // glTexStorage3D 3028 3029 ES3F_ADD_API_CASE(texstorage3d, "Invalid glTexStorage3D() usage", 3030 { 3031 deUint32 texture; 3032 glGenTextures (1, &texture); 3033 glBindTexture (GL_TEXTURE_3D, texture); 3034 3035 m_log << TestLog::Section("", "GL_INVALID_ENUM or GL_INVALID_VALUE is generated if internalformat is not a valid sized internal format."); 3036 glTexStorage3D (GL_TEXTURE_3D, 1, 0, 4, 4, 4); 3037 expectError (GL_INVALID_ENUM, GL_INVALID_VALUE); 3038 glTexStorage3D (GL_TEXTURE_3D, 1, GL_RGBA_INTEGER, 4, 4, 4); 3039 expectError (GL_INVALID_ENUM, GL_INVALID_VALUE); 3040 m_log << TestLog::EndSection; 3041 3042 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not one of the accepted target enumerants."); 3043 glTexStorage3D (0, 1, GL_RGBA8, 4, 4, 4); 3044 expectError (GL_INVALID_ENUM); 3045 glTexStorage3D (GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 4, 4, 4); 3046 expectError (GL_INVALID_ENUM); 3047 glTexStorage3D (GL_TEXTURE_2D, 1, GL_RGBA8, 4, 4, 4); 3048 expectError (GL_INVALID_ENUM); 3049 m_log << TestLog::EndSection; 3050 3051 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width, height or depth are less than 1."); 3052 glTexStorage3D (GL_TEXTURE_3D, 1, GL_RGBA8, 0, 4, 4); 3053 expectError (GL_INVALID_VALUE); 3054 glTexStorage3D (GL_TEXTURE_3D, 1, GL_RGBA8, 4, 0, 4); 3055 expectError (GL_INVALID_VALUE); 3056 glTexStorage3D (GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 0); 3057 expectError (GL_INVALID_VALUE); 3058 glTexStorage3D (GL_TEXTURE_3D, 1, GL_RGBA8, 0, 0, 0); 3059 expectError (GL_INVALID_VALUE); 3060 m_log << TestLog::EndSection; 3061 3062 glDeleteTextures(1, &texture); 3063 }); 3064 ES3F_ADD_API_CASE(texstorage3d_invalid_binding, "Invalid glTexStorage3D() usage", 3065 { 3066 glBindTexture (GL_TEXTURE_3D, 0); 3067 3068 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the default texture object is curently bound to target."); 3069 glTexStorage3D (GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 4); 3070 expectError (GL_INVALID_OPERATION); 3071 m_log << TestLog::EndSection; 3072 3073 deUint32 texture; 3074 glGenTextures (1, &texture); 3075 glBindTexture (GL_TEXTURE_3D, texture); 3076 3077 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if the texture object currently bound to target already has GL_TEXTURE_IMMUTABLE_FORMAT set to GL_TRUE."); 3078 deInt32 immutable = -1; 3079 glGetTexParameteriv(GL_TEXTURE_3D, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable); 3080 m_log << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage; 3081 glTexStorage3D (GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 4); 3082 expectError (GL_NO_ERROR); 3083 glGetTexParameteriv(GL_TEXTURE_3D, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable); 3084 m_log << TestLog::Message << "// GL_TEXTURE_IMMUTABLE_FORMAT = " << ((immutable != 0) ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage; 3085 glTexStorage3D (GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 4); 3086 expectError (GL_INVALID_OPERATION); 3087 m_log << TestLog::EndSection; 3088 3089 glDeleteTextures(1, &texture); 3090 }); 3091 ES3F_ADD_API_CASE(texstorage3d_invalid_levels, "Invalid glTexStorage3D() usage", 3092 { 3093 deUint32 texture; 3094 glGenTextures (1, &texture); 3095 glBindTexture (GL_TEXTURE_3D, texture); 3096 3097 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if levels is less than 1."); 3098 glTexStorage3D (GL_TEXTURE_3D, 0, GL_RGBA8, 4, 4, 4); 3099 expectError (GL_INVALID_VALUE); 3100 glTexStorage3D (GL_TEXTURE_3D, 0, GL_RGBA8, 0, 0, 0); 3101 expectError (GL_INVALID_VALUE); 3102 m_log << TestLog::EndSection; 3103 3104 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if levels is greater than floor(log_2(max(width, height, depth))) + 1"); 3105 deUint32 log2MaxSize = deLog2Floor32(8) + 1 + 1; 3106 glTexStorage3D (GL_TEXTURE_3D, log2MaxSize, GL_RGBA8, 8, 2, 2); 3107 expectError (GL_INVALID_OPERATION); 3108 glTexStorage3D (GL_TEXTURE_3D, log2MaxSize, GL_RGBA8, 2, 8, 2); 3109 expectError (GL_INVALID_OPERATION); 3110 glTexStorage3D (GL_TEXTURE_3D, log2MaxSize, GL_RGBA8, 2, 2, 8); 3111 expectError (GL_INVALID_OPERATION); 3112 glTexStorage3D (GL_TEXTURE_3D, log2MaxSize, GL_RGBA8, 8, 8, 8); 3113 expectError (GL_INVALID_OPERATION); 3114 m_log << TestLog::EndSection; 3115 3116 glDeleteTextures(1, &texture); 3117 }); 3118 3119 ES3F_ADD_API_CASE(texstorage3d_invalid_astc_target, "Invalid glTexStorage3D() ASTC 3D targets", 3120 { 3121 // GLES 3.0.4, Sec 3.8.4, p.136: If there is no imageSize 3122 // for which this command would have been valid, an 3123 // INVALID_OPERATION error is generated. Also: If 3124 // executing the pseudo-code would result in any other 3125 // error, the error is generated and the command will have 3126 // no effect. 3127 // In conclusion: Expect same errors as with TexImage?D 3128 3129 if (m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_hdr") || 3130 m_context.getContextInfo().isExtensionSupported("GL_OES_texture_compression_astc")) 3131 { 3132 m_log.writeMessage("Full ASTC supported. No negative API requirements."); 3133 } 3134 else 3135 { 3136 const bool ldrAstcSupported = m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_ldr"); 3137 if (ldrAstcSupported) 3138 m_log.writeMessage("GL_INVALID_OPERATION should be generated if using TEXTURE_3D with LDR."); 3139 else 3140 // In earlier tests both codes are accepted for invalid target format. 3141 m_log.writeMessage("GL_INVALID_ENUM or GL_INVALID_VALUE should be generated if no ASTC extensions are present."); 3142 3143 for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_astcFormats); formatNdx++) 3144 { 3145 const GLuint format = s_astcFormats[formatNdx]; 3146 const CompressedTexFormat tcuFormat = mapGLCompressedTexFormat(format); 3147 const IVec3 blockPixels = getBlockPixelSize(tcuFormat); 3148 deUint32 texture = 0; 3149 3150 glGenTextures (1, &texture); 3151 glBindTexture (GL_TEXTURE_3D, texture); 3152 3153 glTexStorage3D (GL_TEXTURE_3D, 1, format, blockPixels.x(), blockPixels.y(), blockPixels.z()); 3154 3155 if (ldrAstcSupported) 3156 expectError(GL_INVALID_OPERATION); 3157 else 3158 expectError(GL_INVALID_ENUM, GL_INVALID_VALUE); 3159 3160 glDeleteTextures(1, &texture); 3161 } 3162 } 3163 }); 3164} 3165 3166} // Functional 3167} // gles3 3168} // deqp 3169