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 Texture format tests. 22 * 23 * Constants: 24 * + nearest-neighbor filtering 25 * + no mipmaps 26 * + full texture coordinate range (but not outside) tested 27 * + accessed from fragment shader 28 * + texture unit 0 29 * + named texture object 30 * 31 * Variables: 32 * + texture format 33 * + texture type: 2D or cubemap 34 *//*--------------------------------------------------------------------*/ 35 36 #include "es3fTextureFormatTests.hpp" 37 #include "gluPixelTransfer.hpp" 38 #include "gluStrUtil.hpp" 39 #include "gluTexture.hpp" 40 #include "gluTextureUtil.hpp" 41 #include "glsTextureTestUtil.hpp" 42 #include "tcuTextureUtil.hpp" 43 #include "deStringUtil.hpp" 44 #include "deRandom.hpp" 45 #include "glwEnums.hpp" 46 #include "glwFunctions.hpp" 47 48 using std::vector; 49 using std::string; 50 using tcu::TestLog; 51 52 namespace deqp 53 { 54 namespace gles3 55 { 56 namespace Functional 57 { 58 59 using namespace deqp::gls; 60 using namespace deqp::gls::TextureTestUtil; 61 using tcu::Sampler; 62 63 // Texture2DFormatCase 64 65 class Texture2DFormatCase : public tcu::TestCase 66 { 67 public: 68 Texture2DFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height); 69 Texture2DFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height); 70 ~Texture2DFormatCase (void); 71 72 void init (void); 73 void deinit (void); 74 IterateResult iterate (void); 75 76 private: 77 Texture2DFormatCase (const Texture2DFormatCase& other); 78 Texture2DFormatCase& operator= (const Texture2DFormatCase& other); 79 80 glu::RenderContext& m_renderCtx; 81 82 deUint32 m_format; 83 deUint32 m_dataType; 84 int m_width; 85 int m_height; 86 87 glu::Texture2D* m_texture; 88 TextureRenderer m_renderer; 89 }; 90 91 Texture2DFormatCase::Texture2DFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height) 92 : TestCase (testCtx, name, description) 93 , m_renderCtx (renderCtx) 94 , m_format (format) 95 , m_dataType (dataType) 96 , m_width (width) 97 , m_height (height) 98 , m_texture (DE_NULL) 99 , m_renderer (renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP) 100 { 101 } 102 103 Texture2DFormatCase::Texture2DFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height) 104 : TestCase (testCtx, name, description) 105 , m_renderCtx (renderCtx) 106 , m_format (internalFormat) 107 , m_dataType (GL_NONE) 108 , m_width (width) 109 , m_height (height) 110 , m_texture (DE_NULL) 111 , m_renderer (renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP) 112 { 113 } 114 115 Texture2DFormatCase::~Texture2DFormatCase (void) 116 { 117 deinit(); 118 } 119 120 void Texture2DFormatCase::init (void) 121 { 122 TestLog& log = m_testCtx.getLog(); 123 tcu::TextureFormat fmt = m_dataType ? glu::mapGLTransferFormat(m_format, m_dataType) : glu::mapGLInternalFormat(m_format); 124 tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(fmt); 125 std::ostringstream fmtName; 126 127 if (m_dataType) 128 fmtName << glu::getTextureFormatStr(m_format) << ", " << glu::getTypeStr(m_dataType); 129 else 130 fmtName << glu::getTextureFormatStr(m_format); 131 132 log << TestLog::Message << "2D texture, " << fmtName.str() << ", " << m_width << "x" << m_height 133 << ",\n fill with " << formatGradient(&spec.valueMin, &spec.valueMax) << " gradient" 134 << TestLog::EndMessage; 135 136 m_texture = m_dataType != GL_NONE 137 ? new glu::Texture2D(m_renderCtx, m_format, m_dataType, m_width, m_height) // Implicit internal format. 138 : new glu::Texture2D(m_renderCtx, m_format, m_width, m_height); // Explicit internal format. 139 140 // Fill level 0. 141 m_texture->getRefTexture().allocLevel(0); 142 tcu::fillWithComponentGradients(m_texture->getRefTexture().getLevel(0), spec.valueMin, spec.valueMax); 143 } 144 145 void Texture2DFormatCase::deinit (void) 146 { 147 delete m_texture; 148 m_texture = DE_NULL; 149 150 m_renderer.clear(); 151 } 152 153 Texture2DFormatCase::IterateResult Texture2DFormatCase::iterate (void) 154 { 155 TestLog& log = m_testCtx.getLog(); 156 const glw::Functions& gl = m_renderCtx.getFunctions(); 157 RandomViewport viewport (m_renderCtx.getRenderTarget(), m_width, m_height, deStringHash(getName())); 158 tcu::Surface renderedFrame (viewport.width, viewport.height); 159 tcu::Surface referenceFrame (viewport.width, viewport.height); 160 tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); 161 vector<float> texCoord; 162 ReferenceParams renderParams (TEXTURETYPE_2D); 163 tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat()); 164 const deUint32 wrapS = GL_CLAMP_TO_EDGE; 165 const deUint32 wrapT = GL_CLAMP_TO_EDGE; 166 const deUint32 minFilter = GL_NEAREST; 167 const deUint32 magFilter = GL_NEAREST; 168 169 renderParams.flags |= RenderParams::LOG_ALL; 170 renderParams.samplerType = getSamplerType(m_texture->getRefTexture().getFormat()); 171 renderParams.sampler = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST); 172 renderParams.colorScale = spec.lookupScale; 173 renderParams.colorBias = spec.lookupBias; 174 175 computeQuadTexCoord2D(texCoord, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f)); 176 177 log << TestLog::Message << "Texture parameters:" 178 << "\n WRAP_S = " << glu::getTextureParameterValueStr(GL_TEXTURE_WRAP_S, wrapS) 179 << "\n WRAP_T = " << glu::getTextureParameterValueStr(GL_TEXTURE_WRAP_T, wrapT) 180 << "\n MIN_FILTER = " << glu::getTextureParameterValueStr(GL_TEXTURE_MIN_FILTER, minFilter) 181 << "\n MAG_FILTER = " << glu::getTextureParameterValueStr(GL_TEXTURE_MAG_FILTER, magFilter) 182 << TestLog::EndMessage; 183 184 // Setup base viewport. 185 gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 186 187 // Upload texture data to GL. 188 m_texture->upload(); 189 190 // Bind to unit 0. 191 gl.activeTexture(GL_TEXTURE0); 192 gl.bindTexture(GL_TEXTURE_2D, m_texture->getGLTexture()); 193 194 // Setup nearest neighbor filtering and clamp-to-edge. 195 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapS); 196 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapT); 197 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter); 198 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter); 199 200 GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state"); 201 202 // Draw. 203 m_renderer.renderQuad(0, &texCoord[0], renderParams); 204 glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess()); 205 GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels()"); 206 207 // Compute reference. 208 sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], renderParams); 209 210 // Compare and log. 211 bool isOk = compareImages(log, referenceFrame, renderedFrame, threshold); 212 213 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, 214 isOk ? "Pass" : "Image comparison failed"); 215 216 return STOP; 217 } 218 219 // TextureCubeFormatCase 220 221 class TextureCubeFormatCase : public tcu::TestCase 222 { 223 public: 224 TextureCubeFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height); 225 TextureCubeFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height); 226 ~TextureCubeFormatCase (void); 227 228 void init (void); 229 void deinit (void); 230 IterateResult iterate (void); 231 232 private: 233 TextureCubeFormatCase (const TextureCubeFormatCase& other); 234 TextureCubeFormatCase& operator= (const TextureCubeFormatCase& other); 235 236 bool testFace (tcu::CubeFace face); 237 238 glu::RenderContext& m_renderCtx; 239 240 deUint32 m_format; 241 deUint32 m_dataType; 242 int m_width; 243 int m_height; 244 245 glu::TextureCube* m_texture; 246 TextureRenderer m_renderer; 247 248 int m_curFace; 249 bool m_isOk; 250 }; 251 252 TextureCubeFormatCase::TextureCubeFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height) 253 : TestCase (testCtx, name, description) 254 , m_renderCtx (renderCtx) 255 , m_format (format) 256 , m_dataType (dataType) 257 , m_width (width) 258 , m_height (height) 259 , m_texture (DE_NULL) 260 , m_renderer (renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP) 261 , m_curFace (0) 262 , m_isOk (false) 263 { 264 } 265 266 TextureCubeFormatCase::TextureCubeFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height) 267 : TestCase (testCtx, name, description) 268 , m_renderCtx (renderCtx) 269 , m_format (internalFormat) 270 , m_dataType (GL_NONE) 271 , m_width (width) 272 , m_height (height) 273 , m_texture (DE_NULL) 274 , m_renderer (renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP) 275 , m_curFace (0) 276 , m_isOk (false) 277 { 278 } 279 280 TextureCubeFormatCase::~TextureCubeFormatCase (void) 281 { 282 deinit(); 283 } 284 285 void TextureCubeFormatCase::init (void) 286 { 287 TestLog& log = m_testCtx.getLog(); 288 tcu::TextureFormat fmt = m_dataType ? glu::mapGLTransferFormat(m_format, m_dataType) : glu::mapGLInternalFormat(m_format); 289 tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(fmt); 290 std::ostringstream fmtName; 291 292 if (m_dataType) 293 fmtName << glu::getTextureFormatStr(m_format) << ", " << glu::getTypeStr(m_dataType); 294 else 295 fmtName << glu::getTextureFormatStr(m_format); 296 297 log << TestLog::Message << "Cube map texture, " << fmtName.str() << ", " << m_width << "x" << m_height 298 << ",\n fill with " << formatGradient(&spec.valueMin, &spec.valueMax) << " gradient" 299 << TestLog::EndMessage; 300 301 DE_ASSERT(m_width == m_height); 302 m_texture = m_dataType != GL_NONE 303 ? new glu::TextureCube(m_renderCtx, m_format, m_dataType, m_width) // Implicit internal format. 304 : new glu::TextureCube(m_renderCtx, m_format, m_width); // Explicit internal format. 305 306 // Fill level 0. 307 for (int face = 0; face < tcu::CUBEFACE_LAST; face++) 308 { 309 tcu::Vec4 gMin, gMax; 310 311 switch (face) 312 { 313 case 0: gMin = spec.valueMin.swizzle(0, 1, 2, 3); gMax = spec.valueMax.swizzle(0, 1, 2, 3); break; 314 case 1: gMin = spec.valueMin.swizzle(2, 1, 0, 3); gMax = spec.valueMax.swizzle(2, 1, 0, 3); break; 315 case 2: gMin = spec.valueMin.swizzle(1, 2, 0, 3); gMax = spec.valueMax.swizzle(1, 2, 0, 3); break; 316 case 3: gMin = spec.valueMax.swizzle(0, 1, 2, 3); gMax = spec.valueMin.swizzle(0, 1, 2, 3); break; 317 case 4: gMin = spec.valueMax.swizzle(2, 1, 0, 3); gMax = spec.valueMin.swizzle(2, 1, 0, 3); break; 318 case 5: gMin = spec.valueMax.swizzle(1, 2, 0, 3); gMax = spec.valueMin.swizzle(1, 2, 0, 3); break; 319 default: 320 DE_ASSERT(false); 321 } 322 323 m_texture->getRefTexture().allocLevel((tcu::CubeFace)face, 0); 324 tcu::fillWithComponentGradients(m_texture->getRefTexture().getLevelFace(0, (tcu::CubeFace)face), gMin, gMax); 325 } 326 327 // Upload texture data to GL. 328 m_texture->upload(); 329 330 // Initialize iteration state. 331 m_curFace = 0; 332 m_isOk = true; 333 } 334 335 void TextureCubeFormatCase::deinit (void) 336 { 337 delete m_texture; 338 m_texture = DE_NULL; 339 340 m_renderer.clear(); 341 } 342 343 bool TextureCubeFormatCase::testFace (tcu::CubeFace face) 344 { 345 TestLog& log = m_testCtx.getLog(); 346 const glw::Functions& gl = m_renderCtx.getFunctions(); 347 RandomViewport viewport (m_renderCtx.getRenderTarget(), m_width, m_height, deStringHash(getName())+(deUint32)face); 348 tcu::Surface renderedFrame (viewport.width, viewport.height); 349 tcu::Surface referenceFrame (viewport.width, viewport.height); 350 tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); 351 vector<float> texCoord; 352 ReferenceParams renderParams (TEXTURETYPE_CUBE); 353 tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat()); 354 355 renderParams.samplerType = getSamplerType(m_texture->getRefTexture().getFormat()); 356 renderParams.sampler = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST); 357 renderParams.sampler.seamlessCubeMap = true; 358 renderParams.colorScale = spec.lookupScale; 359 renderParams.colorBias = spec.lookupBias; 360 361 // Log render info on first face. 362 if (face == tcu::CUBEFACE_NEGATIVE_X) 363 renderParams.flags |= RenderParams::LOG_ALL; 364 365 computeQuadTexCoordCube(texCoord, face); 366 367 // \todo [2011-10-28 pyry] Image set name / section? 368 log << TestLog::Message << face << TestLog::EndMessage; 369 370 // Setup base viewport. 371 gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 372 373 // Bind to unit 0. 374 gl.activeTexture(GL_TEXTURE0); 375 gl.bindTexture(GL_TEXTURE_CUBE_MAP, m_texture->getGLTexture()); 376 377 // Setup nearest neighbor filtering and clamp-to-edge. 378 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 379 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 380 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 381 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 382 383 GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state"); 384 385 m_renderer.renderQuad(0, &texCoord[0], renderParams); 386 glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess()); 387 GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels()"); 388 389 // Compute reference. 390 sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], renderParams); 391 392 // Compare and log. 393 return compareImages(log, referenceFrame, renderedFrame, threshold); 394 } 395 396 TextureCubeFormatCase::IterateResult TextureCubeFormatCase::iterate (void) 397 { 398 // Execute test for all faces. 399 if (!testFace((tcu::CubeFace)m_curFace)) 400 m_isOk = false; 401 402 m_curFace += 1; 403 404 if (m_curFace == tcu::CUBEFACE_LAST) 405 { 406 m_testCtx.setTestResult(m_isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, 407 m_isOk ? "Pass" : "Image comparison failed"); 408 return STOP; 409 } 410 else 411 return CONTINUE; 412 } 413 414 // Texture2DArrayFormatCase 415 416 class Texture2DArrayFormatCase : public tcu::TestCase 417 { 418 public: 419 Texture2DArrayFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height, int numLayers); 420 Texture2DArrayFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height, int numLayers); 421 ~Texture2DArrayFormatCase (void); 422 423 void init (void); 424 void deinit (void); 425 IterateResult iterate (void); 426 427 private: 428 Texture2DArrayFormatCase (const Texture2DArrayFormatCase& other); 429 Texture2DArrayFormatCase& operator= (const Texture2DArrayFormatCase& other); 430 431 bool testLayer (int layerNdx); 432 433 glu::RenderContext& m_renderCtx; 434 435 deUint32 m_format; 436 deUint32 m_dataType; 437 int m_width; 438 int m_height; 439 int m_numLayers; 440 441 glu::Texture2DArray* m_texture; 442 TextureTestUtil::TextureRenderer m_renderer; 443 444 int m_curLayer; 445 }; 446 447 Texture2DArrayFormatCase::Texture2DArrayFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height, int numLayers) 448 : TestCase (testCtx, name, description) 449 , m_renderCtx (renderCtx) 450 , m_format (format) 451 , m_dataType (dataType) 452 , m_width (width) 453 , m_height (height) 454 , m_numLayers (numLayers) 455 , m_texture (DE_NULL) 456 , m_renderer (renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP) 457 , m_curLayer (0) 458 { 459 } 460 461 Texture2DArrayFormatCase::Texture2DArrayFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height, int numLayers) 462 : TestCase (testCtx, name, description) 463 , m_renderCtx (renderCtx) 464 , m_format (internalFormat) 465 , m_dataType (GL_NONE) 466 , m_width (width) 467 , m_height (height) 468 , m_numLayers (numLayers) 469 , m_texture (DE_NULL) 470 , m_renderer (renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP) 471 , m_curLayer (0) 472 { 473 } 474 475 Texture2DArrayFormatCase::~Texture2DArrayFormatCase (void) 476 { 477 deinit(); 478 } 479 480 void Texture2DArrayFormatCase::init (void) 481 { 482 m_texture = m_dataType != GL_NONE 483 ? new glu::Texture2DArray(m_renderCtx, m_format, m_dataType, m_width, m_height, m_numLayers) // Implicit internal format. 484 : new glu::Texture2DArray(m_renderCtx, m_format, m_width, m_height, m_numLayers); // Explicit internal format. 485 486 tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat()); 487 488 // Fill level 0. 489 m_texture->getRefTexture().allocLevel(0); 490 tcu::fillWithComponentGradients(m_texture->getRefTexture().getLevel(0), spec.valueMin, spec.valueMax); 491 492 // Initialize state. 493 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 494 m_curLayer = 0; 495 } 496 497 void Texture2DArrayFormatCase::deinit (void) 498 { 499 delete m_texture; 500 m_texture = DE_NULL; 501 502 m_renderer.clear(); 503 } 504 505 bool Texture2DArrayFormatCase::testLayer (int layerNdx) 506 { 507 const glw::Functions& gl = m_renderCtx.getFunctions(); 508 TestLog& log = m_testCtx.getLog(); 509 RandomViewport viewport (m_renderCtx.getRenderTarget(), m_width, m_height, deStringHash(getName())); 510 tcu::Surface renderedFrame (viewport.width, viewport.height); 511 tcu::Surface referenceFrame (viewport.width, viewport.height); 512 tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); 513 vector<float> texCoord; 514 ReferenceParams renderParams (TEXTURETYPE_2D_ARRAY); 515 tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat()); 516 517 renderParams.samplerType = getSamplerType(m_texture->getRefTexture().getFormat()); 518 renderParams.sampler = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST); 519 renderParams.colorScale = spec.lookupScale; 520 renderParams.colorBias = spec.lookupBias; 521 522 computeQuadTexCoord2DArray(texCoord, layerNdx, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f)); 523 524 // Setup base viewport. 525 gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 526 527 // Upload texture data to GL. 528 m_texture->upload(); 529 530 // Bind to unit 0. 531 gl.activeTexture(GL_TEXTURE0); 532 gl.bindTexture(GL_TEXTURE_2D_ARRAY, m_texture->getGLTexture()); 533 534 // Setup nearest neighbor filtering and clamp-to-edge. 535 gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 536 gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 537 gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 538 gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 539 540 GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state"); 541 542 // Draw. 543 m_renderer.renderQuad(0, &texCoord[0], renderParams); 544 glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess()); 545 546 // Compute reference. 547 sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], renderParams); 548 549 // Compare and log. 550 return compareImages(log, (string("Layer" + de::toString(layerNdx))).c_str(), (string("Layer " + de::toString(layerNdx))).c_str(), referenceFrame, renderedFrame, threshold); 551 } 552 553 Texture2DArrayFormatCase::IterateResult Texture2DArrayFormatCase::iterate (void) 554 { 555 // Execute test for all layers. 556 bool isOk = testLayer(m_curLayer); 557 558 if (!isOk && m_testCtx.getTestResult() == QP_TEST_RESULT_PASS) 559 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image comparison failed"); 560 561 m_curLayer += 1; 562 563 return m_curLayer < m_texture->getRefTexture().getNumLayers() ? CONTINUE : STOP; 564 } 565 566 // Texture2DFormatCase 567 568 class Texture3DFormatCase : public tcu::TestCase 569 { 570 public: 571 Texture3DFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height, int depth); 572 Texture3DFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height, int depth); 573 ~Texture3DFormatCase (void); 574 575 void init (void); 576 void deinit (void); 577 IterateResult iterate (void); 578 579 private: 580 Texture3DFormatCase (const Texture3DFormatCase& other); 581 Texture3DFormatCase& operator= (const Texture3DFormatCase& other); 582 583 bool testSlice (int sliceNdx); 584 585 glu::RenderContext& m_renderCtx; 586 587 deUint32 m_format; 588 deUint32 m_dataType; 589 int m_width; 590 int m_height; 591 int m_depth; 592 593 glu::Texture3D* m_texture; 594 TextureTestUtil::TextureRenderer m_renderer; 595 596 int m_curSlice; 597 }; 598 599 Texture3DFormatCase::Texture3DFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height, int depth) 600 : TestCase (testCtx, name, description) 601 , m_renderCtx (renderCtx) 602 , m_format (format) 603 , m_dataType (dataType) 604 , m_width (width) 605 , m_height (height) 606 , m_depth (depth) 607 , m_texture (DE_NULL) 608 , m_renderer (renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP) 609 , m_curSlice (0) 610 { 611 } 612 613 Texture3DFormatCase::Texture3DFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height, int depth) 614 : TestCase (testCtx, name, description) 615 , m_renderCtx (renderCtx) 616 , m_format (internalFormat) 617 , m_dataType (GL_NONE) 618 , m_width (width) 619 , m_height (height) 620 , m_depth (depth) 621 , m_texture (DE_NULL) 622 , m_renderer (renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP) 623 , m_curSlice (0) 624 { 625 } 626 627 Texture3DFormatCase::~Texture3DFormatCase (void) 628 { 629 deinit(); 630 } 631 632 void Texture3DFormatCase::init (void) 633 { 634 m_texture = m_dataType != GL_NONE 635 ? new glu::Texture3D(m_renderCtx, m_format, m_dataType, m_width, m_height, m_depth) // Implicit internal format. 636 : new glu::Texture3D(m_renderCtx, m_format, m_width, m_height, m_depth); // Explicit internal format. 637 638 tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat()); 639 640 // Fill level 0. 641 m_texture->getRefTexture().allocLevel(0); 642 tcu::fillWithComponentGradients(m_texture->getRefTexture().getLevel(0), spec.valueMin, spec.valueMax); 643 644 // Initialize state. 645 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 646 m_curSlice = 0; 647 } 648 649 void Texture3DFormatCase::deinit (void) 650 { 651 delete m_texture; 652 m_texture = DE_NULL; 653 654 m_renderer.clear(); 655 } 656 657 bool Texture3DFormatCase::testSlice (int sliceNdx) 658 { 659 TestLog& log = m_testCtx.getLog(); 660 const glw::Functions& gl = m_renderCtx.getFunctions(); 661 RandomViewport viewport (m_renderCtx.getRenderTarget(), m_width, m_height, deStringHash(getName())); 662 tcu::Surface renderedFrame (viewport.width, viewport.height); 663 tcu::Surface referenceFrame (viewport.width, viewport.height); 664 tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); 665 vector<float> texCoord; 666 ReferenceParams renderParams (TEXTURETYPE_3D); 667 tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat()); 668 float r = ((float)sliceNdx + 0.5f) / (float)m_depth; 669 670 renderParams.samplerType = getSamplerType(m_texture->getRefTexture().getFormat()); 671 renderParams.sampler = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST); 672 renderParams.colorScale = spec.lookupScale; 673 renderParams.colorBias = spec.lookupBias; 674 675 computeQuadTexCoord3D(texCoord, tcu::Vec3(0.0f, 0.0f, r), tcu::Vec3(1.0f, 1.0f, r), tcu::IVec3(0,1,2)); 676 677 // Setup base viewport. 678 gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 679 680 // Upload texture data to GL. 681 m_texture->upload(); 682 683 // Bind to unit 0. 684 gl.activeTexture(GL_TEXTURE0); 685 gl.bindTexture(GL_TEXTURE_3D, m_texture->getGLTexture()); 686 687 // Setup nearest neighbor filtering and clamp-to-edge. 688 gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 689 gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 690 gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 691 gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 692 693 GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state"); 694 695 // Draw. 696 m_renderer.renderQuad(0, &texCoord[0], renderParams); 697 glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess()); 698 699 // Compute reference. 700 sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], renderParams); 701 702 // Compare and log. 703 return compareImages(log, (string("Slice" + de::toString(sliceNdx))).c_str(), (string("Slice " + de::toString(sliceNdx))).c_str(), referenceFrame, renderedFrame, threshold); 704 } 705 706 Texture3DFormatCase::IterateResult Texture3DFormatCase::iterate (void) 707 { 708 // Execute test for all slices. 709 bool isOk = testSlice(m_curSlice); 710 711 if (!isOk && m_testCtx.getTestResult() == QP_TEST_RESULT_PASS) 712 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image comparison failed"); 713 714 m_curSlice += 1; 715 716 return m_curSlice < m_texture->getRefTexture().getDepth() ? CONTINUE : STOP; 717 } 718 719 // Compressed2FormatCase 720 721 class Compressed2DFormatCase : public tcu::TestCase 722 { 723 public: 724 Compressed2DFormatCase (tcu::TestContext& testCtx, 725 glu::RenderContext& renderCtx, 726 const glu::ContextInfo& renderCtxInfo, 727 const char* name, 728 const char* description, 729 tcu::CompressedTexFormat format, 730 deUint32 randomSeed, 731 int width, 732 int height); 733 ~Compressed2DFormatCase (void); 734 735 void init (void); 736 void deinit (void); 737 IterateResult iterate (void); 738 739 private: 740 Compressed2DFormatCase (const Compressed2DFormatCase& other); 741 Compressed2DFormatCase& operator= (const Compressed2DFormatCase& other); 742 743 glu::RenderContext& m_renderCtx; 744 const glu::ContextInfo& m_renderCtxInfo; 745 746 tcu::CompressedTexFormat m_format; 747 748 deUint32 m_randomSeed; 749 int m_width; 750 int m_height; 751 752 glu::Texture2D* m_texture; 753 TextureTestUtil::TextureRenderer m_renderer; 754 }; 755 756 Compressed2DFormatCase::Compressed2DFormatCase (tcu::TestContext& testCtx, 757 glu::RenderContext& renderCtx, 758 const glu::ContextInfo& renderCtxInfo, 759 const char* name, 760 const char* description, 761 tcu::CompressedTexFormat format, 762 deUint32 randomSeed, 763 int width, 764 int height) 765 : TestCase (testCtx, name, description) 766 , m_renderCtx (renderCtx) 767 , m_renderCtxInfo (renderCtxInfo) 768 , m_format (format) 769 , m_randomSeed (randomSeed) 770 , m_width (width) 771 , m_height (height) 772 , m_texture (DE_NULL) 773 , m_renderer (renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP) 774 { 775 } 776 777 Compressed2DFormatCase::~Compressed2DFormatCase (void) 778 { 779 deinit(); 780 } 781 782 void Compressed2DFormatCase::init (void) 783 { 784 // Create texture. 785 tcu::CompressedTexture compressedTexture (m_format, m_width, m_height); 786 int dataSize = compressedTexture.getDataSize(); 787 deUint8* data = (deUint8*)compressedTexture.getData(); 788 de::Random rnd (m_randomSeed); 789 790 for (int i = 0; i < dataSize; i++) 791 data[i] = rnd.getUint32() & 0xff; 792 793 m_texture = new glu::Texture2D(m_renderCtx, m_renderCtxInfo, 1, &compressedTexture); 794 } 795 796 void Compressed2DFormatCase::deinit (void) 797 { 798 delete m_texture; 799 m_texture = DE_NULL; 800 801 m_renderer.clear(); 802 } 803 804 Compressed2DFormatCase::IterateResult Compressed2DFormatCase::iterate (void) 805 { 806 const glw::Functions& gl = m_renderCtx.getFunctions(); 807 TestLog& log = m_testCtx.getLog(); 808 RandomViewport viewport (m_renderCtx.getRenderTarget(), m_texture->getRefTexture().getWidth(), m_texture->getRefTexture().getHeight(), deStringHash(getName())); 809 tcu::Surface renderedFrame (viewport.width, viewport.height); 810 tcu::Surface referenceFrame (viewport.width, viewport.height); 811 tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); 812 vector<float> texCoord; 813 ReferenceParams renderParams (TEXTURETYPE_2D); 814 tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat()); 815 816 renderParams.samplerType = getSamplerType(m_texture->getRefTexture().getFormat()); 817 renderParams.sampler = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST); 818 renderParams.colorScale = spec.lookupScale; 819 renderParams.colorBias = spec.lookupBias; 820 821 computeQuadTexCoord2D(texCoord, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f)); 822 823 // Setup base viewport. 824 gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 825 826 // Bind to unit 0. 827 gl.activeTexture(GL_TEXTURE0); 828 gl.bindTexture(GL_TEXTURE_2D, m_texture->getGLTexture()); 829 830 // Setup nearest neighbor filtering and clamp-to-edge. 831 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 832 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 833 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 834 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 835 836 GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state"); 837 838 // Draw. 839 m_renderer.renderQuad(0, &texCoord[0], renderParams); 840 glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess()); 841 842 // Compute reference. 843 sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], renderParams); 844 845 // Compare and log. 846 bool isOk = compareImages(log, referenceFrame, renderedFrame, threshold); 847 848 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, 849 isOk ? "Pass" : "Image comparison failed"); 850 851 return STOP; 852 } 853 854 // CompressedCubeFormatCase 855 856 class CompressedCubeFormatCase : public tcu::TestCase 857 { 858 public: 859 CompressedCubeFormatCase (tcu::TestContext& testCtx, 860 glu::RenderContext& renderCtx, 861 const glu::ContextInfo& renderCtxInfo, 862 const char* name, 863 const char* description, 864 tcu::CompressedTexFormat format, 865 deUint32 randomSeed, 866 int width, 867 int height); 868 869 ~CompressedCubeFormatCase (void); 870 871 void init (void); 872 void deinit (void); 873 IterateResult iterate (void); 874 875 private: 876 CompressedCubeFormatCase (const CompressedCubeFormatCase& other); 877 CompressedCubeFormatCase& operator= (const CompressedCubeFormatCase& other); 878 879 bool testFace (tcu::CubeFace face); 880 881 glu::RenderContext& m_renderCtx; 882 const glu::ContextInfo& m_renderCtxInfo; 883 884 tcu::CompressedTexFormat m_format; 885 886 deUint32 m_randomSeed; 887 int m_width; 888 int m_height; 889 890 glu::TextureCube* m_texture; 891 TextureTestUtil::TextureRenderer m_renderer; 892 893 int m_curFace; 894 bool m_isOk; 895 }; 896 897 CompressedCubeFormatCase::CompressedCubeFormatCase (tcu::TestContext& testCtx, 898 glu::RenderContext& renderCtx, 899 const glu::ContextInfo& renderCtxInfo, 900 const char* name, 901 const char* description, 902 tcu::CompressedTexFormat format, 903 deUint32 randomSeed, 904 int width, 905 int height) 906 : TestCase (testCtx, name, description) 907 , m_renderCtx (renderCtx) 908 , m_renderCtxInfo (renderCtxInfo) 909 , m_format (format) 910 , m_randomSeed (randomSeed) 911 , m_width (width) 912 , m_height (height) 913 , m_texture (DE_NULL) 914 , m_renderer (renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP) 915 , m_curFace (0) 916 , m_isOk (false) 917 { 918 } 919 920 CompressedCubeFormatCase::~CompressedCubeFormatCase (void) 921 { 922 deinit(); 923 } 924 925 void CompressedCubeFormatCase::init (void) 926 { 927 vector<tcu::CompressedTexture> levels (tcu::CUBEFACE_LAST); 928 de::Random rnd (m_randomSeed); 929 930 for (int face = 0; face < tcu::CUBEFACE_LAST; face++) 931 { 932 levels[face].setStorage(m_format, m_width, m_height); 933 934 int dataSize = levels[face].getDataSize(); 935 deUint8* data = (deUint8*)levels[face].getData(); 936 937 for (int i = 0; i < dataSize; i++) 938 data[i] = rnd.getUint32() & 0xff; 939 } 940 941 m_texture = new glu::TextureCube(m_renderCtx, m_renderCtxInfo, 1, &levels[0]); 942 943 m_curFace = 0; 944 m_isOk = true; 945 } 946 947 void CompressedCubeFormatCase::deinit (void) 948 { 949 delete m_texture; 950 m_texture = DE_NULL; 951 952 m_renderer.clear(); 953 } 954 955 bool CompressedCubeFormatCase::testFace (tcu::CubeFace face) 956 { 957 const glw::Functions& gl = m_renderCtx.getFunctions(); 958 TestLog& log = m_testCtx.getLog(); 959 RandomViewport viewport (m_renderCtx.getRenderTarget(), m_texture->getRefTexture().getSize(), m_texture->getRefTexture().getSize(), deStringHash(getName())+(deUint32)face); 960 tcu::Surface renderedFrame (viewport.width, viewport.height); 961 tcu::Surface referenceFrame (viewport.width, viewport.height); 962 tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); 963 vector<float> texCoord; 964 ReferenceParams renderParams (TEXTURETYPE_CUBE); 965 tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat()); 966 967 renderParams.samplerType = getSamplerType(m_texture->getRefTexture().getFormat()); 968 renderParams.sampler = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST); 969 renderParams.sampler.seamlessCubeMap = true; 970 renderParams.colorScale = spec.lookupScale; 971 renderParams.colorBias = spec.lookupBias; 972 973 computeQuadTexCoordCube(texCoord, face); 974 975 log << TestLog::Message << face << TestLog::EndMessage; 976 977 // Setup base viewport. 978 gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 979 980 // Bind to unit 0. 981 gl.activeTexture(GL_TEXTURE0); 982 gl.bindTexture(GL_TEXTURE_CUBE_MAP, m_texture->getGLTexture()); 983 984 // Setup nearest neighbor filtering and clamp-to-edge. 985 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 986 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 987 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 988 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 989 990 GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state"); 991 992 m_renderer.renderQuad(0, &texCoord[0], renderParams); 993 glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess()); 994 995 // Compute reference. 996 sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], renderParams); 997 998 // Compare and log. 999 return compareImages(log, referenceFrame, renderedFrame, threshold); 1000 } 1001 1002 CompressedCubeFormatCase::IterateResult CompressedCubeFormatCase::iterate (void) 1003 { 1004 // Execute test for all faces. 1005 if (!testFace((tcu::CubeFace)m_curFace)) 1006 m_isOk = false; 1007 1008 m_curFace += 1; 1009 1010 if (m_curFace == tcu::CUBEFACE_LAST) 1011 { 1012 m_testCtx.setTestResult(m_isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, 1013 m_isOk ? "Pass" : "Image comparison failed"); 1014 return STOP; 1015 } 1016 else 1017 return CONTINUE; 1018 } 1019 1020 // Texture2DFileCase 1021 1022 class Texture2DFileCase : public tcu::TestCase 1023 { 1024 public: 1025 Texture2DFileCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const glu::ContextInfo& renderCtxInfo, const char* name, const char* description, const std::vector<std::string>& filenames); 1026 ~Texture2DFileCase (void); 1027 1028 void init (void); 1029 void deinit (void); 1030 IterateResult iterate (void); 1031 1032 private: 1033 Texture2DFileCase (const Texture2DFileCase& other); 1034 Texture2DFileCase& operator= (const Texture2DFileCase& other); 1035 1036 glu::RenderContext& m_renderCtx; 1037 const glu::ContextInfo& m_renderCtxInfo; 1038 1039 std::vector<std::string> m_filenames; 1040 1041 glu::Texture2D* m_texture; 1042 TextureRenderer m_renderer; 1043 }; 1044 1045 Texture2DFileCase::Texture2DFileCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const glu::ContextInfo& renderCtxInfo, const char* name, const char* description, const std::vector<std::string>& filenames) 1046 : TestCase (testCtx, name, description) 1047 , m_renderCtx (renderCtx) 1048 , m_renderCtxInfo (renderCtxInfo) 1049 , m_filenames (filenames) 1050 , m_texture (DE_NULL) 1051 , m_renderer (renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP) 1052 { 1053 } 1054 1055 Texture2DFileCase::~Texture2DFileCase (void) 1056 { 1057 deinit(); 1058 } 1059 1060 void Texture2DFileCase::init (void) 1061 { 1062 // Create texture. 1063 m_texture = glu::Texture2D::create(m_renderCtx, m_renderCtxInfo, m_testCtx.getArchive(), (int)m_filenames.size(), m_filenames); 1064 } 1065 1066 void Texture2DFileCase::deinit (void) 1067 { 1068 delete m_texture; 1069 m_texture = DE_NULL; 1070 1071 m_renderer.clear(); 1072 } 1073 1074 Texture2DFileCase::IterateResult Texture2DFileCase::iterate (void) 1075 { 1076 const glw::Functions& gl = m_renderCtx.getFunctions(); 1077 TestLog& log = m_testCtx.getLog(); 1078 RandomViewport viewport (m_renderCtx.getRenderTarget(), m_texture->getRefTexture().getWidth(), m_texture->getRefTexture().getHeight(), deStringHash(getName())); 1079 tcu::Surface renderedFrame (viewport.width, viewport.height); 1080 tcu::Surface referenceFrame (viewport.width, viewport.height); 1081 tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); 1082 vector<float> texCoord; 1083 1084 computeQuadTexCoord2D(texCoord, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f)); 1085 1086 // Setup base viewport. 1087 gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 1088 1089 // Bind to unit 0. 1090 gl.activeTexture(GL_TEXTURE0); 1091 gl.bindTexture(GL_TEXTURE_2D, m_texture->getGLTexture()); 1092 1093 // Setup nearest neighbor filtering and clamp-to-edge. 1094 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 1095 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 1096 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1097 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1098 1099 GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state"); 1100 1101 // Draw. 1102 m_renderer.renderQuad(0, &texCoord[0], TEXTURETYPE_2D); 1103 glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess()); 1104 GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels()"); 1105 1106 // Compute reference. 1107 ReferenceParams refParams(TEXTURETYPE_2D); 1108 refParams.sampler = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST); 1109 sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], refParams); 1110 1111 // Compare and log. 1112 bool isOk = compareImages(log, referenceFrame, renderedFrame, threshold); 1113 1114 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, 1115 isOk ? "Pass" : "Image comparison failed"); 1116 1117 return STOP; 1118 } 1119 1120 // TextureCubeFileCase 1121 1122 class TextureCubeFileCase : public tcu::TestCase 1123 { 1124 public: 1125 TextureCubeFileCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const glu::ContextInfo& renderCtxInfo, const char* name, const char* description, const std::vector<std::string>& filenames); 1126 ~TextureCubeFileCase (void); 1127 1128 void init (void); 1129 void deinit (void); 1130 IterateResult iterate (void); 1131 1132 private: 1133 TextureCubeFileCase (const TextureCubeFileCase& other); 1134 TextureCubeFileCase& operator= (const TextureCubeFileCase& other); 1135 1136 bool testFace (tcu::CubeFace face); 1137 1138 glu::RenderContext& m_renderCtx; 1139 const glu::ContextInfo& m_renderCtxInfo; 1140 1141 std::vector<std::string> m_filenames; 1142 1143 glu::TextureCube* m_texture; 1144 TextureRenderer m_renderer; 1145 1146 int m_curFace; 1147 bool m_isOk; 1148 }; 1149 1150 TextureCubeFileCase::TextureCubeFileCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const glu::ContextInfo& renderCtxInfo, const char* name, const char* description, const std::vector<std::string>& filenames) 1151 : TestCase (testCtx, name, description) 1152 , m_renderCtx (renderCtx) 1153 , m_renderCtxInfo (renderCtxInfo) 1154 , m_filenames (filenames) 1155 , m_texture (DE_NULL) 1156 , m_renderer (renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP) 1157 , m_curFace (0) 1158 , m_isOk (false) 1159 { 1160 } 1161 1162 TextureCubeFileCase::~TextureCubeFileCase (void) 1163 { 1164 deinit(); 1165 } 1166 1167 void TextureCubeFileCase::init (void) 1168 { 1169 // Create texture. 1170 DE_ASSERT(m_filenames.size() % 6 == 0); 1171 m_texture = glu::TextureCube::create(m_renderCtx, m_renderCtxInfo, m_testCtx.getArchive(), (int)m_filenames.size()/6, m_filenames); 1172 1173 m_curFace = 0; 1174 m_isOk = true; 1175 } 1176 1177 void TextureCubeFileCase::deinit (void) 1178 { 1179 delete m_texture; 1180 m_texture = DE_NULL; 1181 1182 m_renderer.clear(); 1183 } 1184 1185 bool TextureCubeFileCase::testFace (tcu::CubeFace face) 1186 { 1187 const glw::Functions& gl = m_renderCtx.getFunctions(); 1188 TestLog& log = m_testCtx.getLog(); 1189 RandomViewport viewport (m_renderCtx.getRenderTarget(), m_texture->getRefTexture().getSize(), m_texture->getRefTexture().getSize(), deStringHash(getName())+(deUint32)face); 1190 tcu::Surface renderedFrame (viewport.width, viewport.height); 1191 tcu::Surface referenceFrame (viewport.width, viewport.height); 1192 Sampler sampler (Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST); 1193 tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); 1194 vector<float> texCoord; 1195 1196 computeQuadTexCoordCube(texCoord, face); 1197 1198 // \todo [2011-10-28 pyry] Image set name / section? 1199 log << TestLog::Message << face << TestLog::EndMessage; 1200 1201 // Setup base viewport. 1202 gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 1203 1204 // Bind to unit 0. 1205 gl.activeTexture(GL_TEXTURE0); 1206 gl.bindTexture(GL_TEXTURE_CUBE_MAP, m_texture->getGLTexture()); 1207 1208 // Setup nearest neighbor filtering and clamp-to-edge. 1209 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 1210 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 1211 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1212 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1213 1214 GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state"); 1215 1216 m_renderer.renderQuad(0, &texCoord[0], TEXTURETYPE_CUBE); 1217 glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess()); 1218 GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels()"); 1219 1220 // Compute reference. 1221 sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], ReferenceParams(TEXTURETYPE_CUBE, sampler)); 1222 1223 // Compare and log. 1224 return compareImages(log, referenceFrame, renderedFrame, threshold); 1225 } 1226 1227 TextureCubeFileCase::IterateResult TextureCubeFileCase::iterate (void) 1228 { 1229 // Execute test for all faces. 1230 if (!testFace((tcu::CubeFace)m_curFace)) 1231 m_isOk = false; 1232 1233 m_curFace += 1; 1234 1235 if (m_curFace == tcu::CUBEFACE_LAST) 1236 { 1237 m_testCtx.setTestResult(m_isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, 1238 m_isOk ? "Pass" : "Image comparison failed"); 1239 return STOP; 1240 } 1241 else 1242 return CONTINUE; 1243 } 1244 1245 // TextureFormatTests 1246 1247 TextureFormatTests::TextureFormatTests (Context& context) 1248 : TestCaseGroup(context, "format", "Texture Format Tests") 1249 { 1250 } 1251 1252 TextureFormatTests::~TextureFormatTests (void) 1253 { 1254 } 1255 1256 vector<string> toStringVector (const char* const* str, int numStr) 1257 { 1258 vector<string> v; 1259 v.resize(numStr); 1260 for (int i = 0; i < numStr; i++) 1261 v[i] = str[i]; 1262 return v; 1263 } 1264 1265 void TextureFormatTests::init (void) 1266 { 1267 tcu::TestCaseGroup* unsizedGroup = DE_NULL; 1268 tcu::TestCaseGroup* sizedGroup = DE_NULL; 1269 tcu::TestCaseGroup* compressedGroup = DE_NULL; 1270 addChild((unsizedGroup = new tcu::TestCaseGroup(m_testCtx, "unsized", "Unsized formats"))); 1271 addChild((sizedGroup = new tcu::TestCaseGroup(m_testCtx, "sized", "Sized formats"))); 1272 addChild((compressedGroup = new tcu::TestCaseGroup(m_testCtx, "compressed", "Compressed formats"))); 1273 1274 tcu::TestCaseGroup* sized2DGroup = DE_NULL; 1275 tcu::TestCaseGroup* sizedCubeGroup = DE_NULL; 1276 tcu::TestCaseGroup* sized2DArrayGroup = DE_NULL; 1277 tcu::TestCaseGroup* sized3DGroup = DE_NULL; 1278 sizedGroup->addChild((sized2DGroup = new tcu::TestCaseGroup(m_testCtx, "2d", "Sized formats (2D)"))); 1279 sizedGroup->addChild((sizedCubeGroup = new tcu::TestCaseGroup(m_testCtx, "cube", "Sized formats (Cubemap)"))); 1280 sizedGroup->addChild((sized2DArrayGroup = new tcu::TestCaseGroup(m_testCtx, "2d_array", "Sized formats (2D Array)"))); 1281 sizedGroup->addChild((sized3DGroup = new tcu::TestCaseGroup(m_testCtx, "3d", "Sized formats (3D)"))); 1282 1283 struct 1284 { 1285 const char* name; 1286 deUint32 format; 1287 deUint32 dataType; 1288 } texFormats[] = 1289 { 1290 { "alpha", GL_ALPHA, GL_UNSIGNED_BYTE }, 1291 { "luminance", GL_LUMINANCE, GL_UNSIGNED_BYTE }, 1292 { "luminance_alpha", GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE }, 1293 { "rgb_unsigned_short_5_6_5", GL_RGB, GL_UNSIGNED_SHORT_5_6_5 }, 1294 { "rgb_unsigned_byte", GL_RGB, GL_UNSIGNED_BYTE }, 1295 { "rgba_unsigned_short_4_4_4_4", GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4 }, 1296 { "rgba_unsigned_short_5_5_5_1", GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1 }, 1297 { "rgba_unsigned_byte", GL_RGBA, GL_UNSIGNED_BYTE } 1298 }; 1299 1300 for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(texFormats); formatNdx++) 1301 { 1302 deUint32 format = texFormats[formatNdx].format; 1303 deUint32 dataType = texFormats[formatNdx].dataType; 1304 string nameBase = texFormats[formatNdx].name; 1305 string descriptionBase = string(glu::getTextureFormatName(format)) + ", " + glu::getTypeName(dataType); 1306 1307 unsizedGroup->addChild(new Texture2DFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_2d_pot").c_str(), (descriptionBase + ", GL_TEXTURE_2D").c_str(), format, dataType, 128, 128)); 1308 unsizedGroup->addChild(new Texture2DFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_2d_npot").c_str(), (descriptionBase + ", GL_TEXTURE_2D").c_str(), format, dataType, 63, 112)); 1309 unsizedGroup->addChild(new TextureCubeFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_cube_pot").c_str(), (descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(), format, dataType, 64, 64)); 1310 unsizedGroup->addChild(new TextureCubeFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_cube_npot").c_str(), (descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(), format, dataType, 57, 57)); 1311 unsizedGroup->addChild(new Texture2DArrayFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_2d_array_pot").c_str(), (descriptionBase + ", GL_TEXTURE_2D_ARRAY").c_str(), format, dataType, 64, 64, 8)); 1312 unsizedGroup->addChild(new Texture2DArrayFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_2d_array_npot").c_str(), (descriptionBase + ", GL_TEXTURE_2D_ARRAY").c_str(), format, dataType, 63, 57, 7)); 1313 unsizedGroup->addChild(new Texture3DFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_3d_pot").c_str(), (descriptionBase + ", GL_TEXTURE_3D").c_str(), format, dataType, 8, 32, 16)); 1314 unsizedGroup->addChild(new Texture3DFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_3d_npot").c_str(), (descriptionBase + ", GL_TEXTURE_3D").c_str(), format, dataType, 11, 31, 7)); 1315 } 1316 1317 struct 1318 { 1319 const char* name; 1320 deUint32 internalFormat; 1321 } sizedColorFormats[] = 1322 { 1323 { "rgba32f", GL_RGBA32F, }, 1324 { "rgba32i", GL_RGBA32I, }, 1325 { "rgba32ui", GL_RGBA32UI, }, 1326 { "rgba16f", GL_RGBA16F, }, 1327 { "rgba16i", GL_RGBA16I, }, 1328 { "rgba16ui", GL_RGBA16UI, }, 1329 { "rgba8", GL_RGBA8, }, 1330 { "rgba8i", GL_RGBA8I, }, 1331 { "rgba8ui", GL_RGBA8UI, }, 1332 { "srgb8_alpha8", GL_SRGB8_ALPHA8, }, 1333 { "rgb10_a2", GL_RGB10_A2, }, 1334 { "rgb10_a2ui", GL_RGB10_A2UI, }, 1335 { "rgba4", GL_RGBA4, }, 1336 { "rgb5_a1", GL_RGB5_A1, }, 1337 { "rgba8_snorm", GL_RGBA8_SNORM, }, 1338 { "rgb8", GL_RGB8, }, 1339 { "rgb565", GL_RGB565, }, 1340 { "r11f_g11f_b10f", GL_R11F_G11F_B10F, }, 1341 { "rgb32f", GL_RGB32F, }, 1342 { "rgb32i", GL_RGB32I, }, 1343 { "rgb32ui", GL_RGB32UI, }, 1344 { "rgb16f", GL_RGB16F, }, 1345 { "rgb16i", GL_RGB16I, }, 1346 { "rgb16ui", GL_RGB16UI, }, 1347 { "rgb8_snorm", GL_RGB8_SNORM, }, 1348 { "rgb8i", GL_RGB8I, }, 1349 { "rgb8ui", GL_RGB8UI, }, 1350 { "srgb8", GL_SRGB8, }, 1351 { "rgb9_e5", GL_RGB9_E5, }, 1352 { "rg32f", GL_RG32F, }, 1353 { "rg32i", GL_RG32I, }, 1354 { "rg32ui", GL_RG32UI, }, 1355 { "rg16f", GL_RG16F, }, 1356 { "rg16i", GL_RG16I, }, 1357 { "rg16ui", GL_RG16UI, }, 1358 { "rg8", GL_RG8, }, 1359 { "rg8i", GL_RG8I, }, 1360 { "rg8ui", GL_RG8UI, }, 1361 { "rg8_snorm", GL_RG8_SNORM, }, 1362 { "r32f", GL_R32F, }, 1363 { "r32i", GL_R32I, }, 1364 { "r32ui", GL_R32UI, }, 1365 { "r16f", GL_R16F, }, 1366 { "r16i", GL_R16I, }, 1367 { "r16ui", GL_R16UI, }, 1368 { "r8", GL_R8, }, 1369 { "r8i", GL_R8I, }, 1370 { "r8ui", GL_R8UI, }, 1371 { "r8_snorm", GL_R8_SNORM, } 1372 }; 1373 1374 struct 1375 { 1376 const char* name; 1377 deUint32 internalFormat; 1378 } sizedDepthStencilFormats[] = 1379 { 1380 // Depth and stencil formats 1381 { "depth_component32f", GL_DEPTH_COMPONENT32F }, 1382 { "depth_component24", GL_DEPTH_COMPONENT24 }, 1383 { "depth_component16", GL_DEPTH_COMPONENT16 }, 1384 { "depth32f_stencil8", GL_DEPTH32F_STENCIL8 }, 1385 { "depth24_stencil8", GL_DEPTH24_STENCIL8 } 1386 }; 1387 1388 for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(sizedColorFormats); formatNdx++) 1389 { 1390 deUint32 internalFormat = sizedColorFormats[formatNdx].internalFormat; 1391 string nameBase = sizedColorFormats[formatNdx].name; 1392 string descriptionBase = glu::getTextureFormatName(internalFormat); 1393 1394 sized2DGroup->addChild (new Texture2DFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_pot").c_str(), (descriptionBase + ", GL_TEXTURE_2D").c_str(), internalFormat, 128, 128)); 1395 sized2DGroup->addChild (new Texture2DFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_npot").c_str(), (descriptionBase + ", GL_TEXTURE_2D").c_str(), internalFormat, 63, 112)); 1396 sizedCubeGroup->addChild (new TextureCubeFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_pot").c_str(), (descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(), internalFormat, 64, 64)); 1397 sizedCubeGroup->addChild (new TextureCubeFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_npot").c_str(), (descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(), internalFormat, 57, 57)); 1398 sized2DArrayGroup->addChild (new Texture2DArrayFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_pot").c_str(), (descriptionBase + ", GL_TEXTURE_2D_ARRAY").c_str(), internalFormat, 64, 64, 8)); 1399 sized2DArrayGroup->addChild (new Texture2DArrayFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_npot").c_str(), (descriptionBase + ", GL_TEXTURE_2D_ARRAY").c_str(), internalFormat, 63, 57, 7)); 1400 sized3DGroup->addChild (new Texture3DFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_pot").c_str(), (descriptionBase + ", GL_TEXTURE_3D").c_str(), internalFormat, 8, 32, 16)); 1401 sized3DGroup->addChild (new Texture3DFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_npot").c_str(), (descriptionBase + ", GL_TEXTURE_3D").c_str(), internalFormat, 11, 31, 7)); 1402 } 1403 1404 for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(sizedDepthStencilFormats); formatNdx++) 1405 { 1406 deUint32 internalFormat = sizedDepthStencilFormats[formatNdx].internalFormat; 1407 string nameBase = sizedDepthStencilFormats[formatNdx].name; 1408 string descriptionBase = glu::getTextureFormatName(internalFormat); 1409 1410 sized2DGroup->addChild (new Texture2DFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_pot").c_str(), (descriptionBase + ", GL_TEXTURE_2D").c_str(), internalFormat, 128, 128)); 1411 sized2DGroup->addChild (new Texture2DFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_npot").c_str(), (descriptionBase + ", GL_TEXTURE_2D").c_str(), internalFormat, 63, 112)); 1412 sizedCubeGroup->addChild (new TextureCubeFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_pot").c_str(), (descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(), internalFormat, 64, 64)); 1413 sizedCubeGroup->addChild (new TextureCubeFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_npot").c_str(), (descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(), internalFormat, 57, 57)); 1414 sized2DArrayGroup->addChild (new Texture2DArrayFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_pot").c_str(), (descriptionBase + ", GL_TEXTURE_2D_ARRAY").c_str(), internalFormat, 64, 64, 8)); 1415 sized2DArrayGroup->addChild (new Texture2DArrayFormatCase (m_testCtx, m_context.getRenderContext(), (nameBase + "_npot").c_str(), (descriptionBase + ", GL_TEXTURE_2D_ARRAY").c_str(), internalFormat, 63, 57, 7)); 1416 } 1417 1418 // ETC-1 compressed formats. 1419 { 1420 static const char* filenames[] = 1421 { 1422 "data/etc1/photo_helsinki_mip_0.pkm", 1423 "data/etc1/photo_helsinki_mip_1.pkm", 1424 "data/etc1/photo_helsinki_mip_2.pkm", 1425 "data/etc1/photo_helsinki_mip_3.pkm", 1426 "data/etc1/photo_helsinki_mip_4.pkm", 1427 "data/etc1/photo_helsinki_mip_5.pkm", 1428 "data/etc1/photo_helsinki_mip_6.pkm", 1429 "data/etc1/photo_helsinki_mip_7.pkm" 1430 }; 1431 compressedGroup->addChild(new Texture2DFileCase(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), "etc1_2d_pot", "GL_ETC1_RGB8_OES, GL_TEXTURE_2D", toStringVector(filenames, DE_LENGTH_OF_ARRAY(filenames)))); 1432 } 1433 1434 { 1435 vector<string> filenames; 1436 filenames.push_back("data/etc1/photo_helsinki_113x89.pkm"); 1437 compressedGroup->addChild(new Texture2DFileCase(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), "etc1_2d_npot", "GL_ETC1_RGB8_OES, GL_TEXTURE_2D", filenames)); 1438 } 1439 1440 { 1441 static const char* faceExt[] = { "neg_x", "pos_x", "neg_y", "pos_y", "neg_z", "pos_z" }; 1442 1443 const int potNumLevels = 7; 1444 vector<string> potFilenames; 1445 for (int level = 0; level < potNumLevels; level++) 1446 for (int face = 0; face < tcu::CUBEFACE_LAST; face++) 1447 potFilenames.push_back(string("data/etc1/skybox_") + faceExt[face] + "_mip_" + de::toString(level) + ".pkm"); 1448 1449 compressedGroup->addChild(new TextureCubeFileCase(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), "etc1_cube_pot", "GL_ETC1_RGB8_OES, GL_TEXTURE_CUBE_MAP", potFilenames)); 1450 1451 vector<string> npotFilenames; 1452 for (int face = 0; face < tcu::CUBEFACE_LAST; face++) 1453 npotFilenames.push_back(string("data/etc1/skybox_61x61_") + faceExt[face] + ".pkm"); 1454 1455 compressedGroup->addChild(new TextureCubeFileCase(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), "etc1_cube_npot", "GL_ETC_RGB8_OES, GL_TEXTURE_CUBE_MAP", npotFilenames)); 1456 } 1457 1458 // ETC-2 and EAC compressed formats. 1459 struct { 1460 const char* descriptionBase; 1461 const char* nameBase; 1462 tcu::CompressedTexFormat format; 1463 } etc2Formats[] = 1464 { 1465 { "GL_COMPRESSED_R11_EAC", "eac_r11", tcu::COMPRESSEDTEXFORMAT_EAC_R11, }, 1466 { "GL_COMPRESSED_SIGNED_R11_EAC", "eac_signed_r11", tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_R11, }, 1467 { "GL_COMPRESSED_RG11_EAC", "eac_rg11", tcu::COMPRESSEDTEXFORMAT_EAC_RG11, }, 1468 { "GL_COMPRESSED_SIGNED_RG11_EAC", "eac_signed_rg11", tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_RG11, }, 1469 { "GL_COMPRESSED_RGB8_ETC2", "etc2_rgb8", tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8, }, 1470 { "GL_COMPRESSED_SRGB8_ETC2", "etc2_srgb8", tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8, }, 1471 { "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2", "etc2_rgb8_punchthrough_alpha1", tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1, }, 1472 { "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2", "etc2_srgb8_punchthrough_alpha1", tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1, }, 1473 { "GL_COMPRESSED_RGBA8_ETC2_EAC", "etc2_eac_rgba8", tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_RGBA8, }, 1474 { "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC", "etc2_eac_srgb8_alpha8", tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_SRGB8_ALPHA8, } 1475 }; 1476 1477 for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(etc2Formats); formatNdx++) 1478 { 1479 string descriptionBase = etc2Formats[formatNdx].descriptionBase; 1480 string nameBase = etc2Formats[formatNdx].nameBase; 1481 1482 compressedGroup->addChild(new Compressed2DFormatCase (m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), (nameBase + "_2d_pot").c_str(), (descriptionBase + ", GL_TEXTURE_2D").c_str(), etc2Formats[formatNdx].format, 1, 128, 64)); 1483 compressedGroup->addChild(new CompressedCubeFormatCase (m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), (nameBase + "_cube_pot").c_str(), (descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(), etc2Formats[formatNdx].format, 1, 64, 64)); 1484 compressedGroup->addChild(new Compressed2DFormatCase (m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), (nameBase + "_2d_npot").c_str(), (descriptionBase + ", GL_TEXTURE_2D").c_str(), etc2Formats[formatNdx].format, 1, 51, 65)); 1485 compressedGroup->addChild(new CompressedCubeFormatCase (m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), (nameBase + "_cube_npot").c_str(), (descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(), etc2Formats[formatNdx].format, 1, 51, 51)); 1486 } 1487 1488 1489 } 1490 1491 } // Functional 1492 } // gles3 1493 } // deqp 1494