18852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry/*------------------------------------------------------------------------- 28852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * drawElements Quality Program OpenGL ES 3.1 Module 38852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * ------------------------------------------------- 48852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * 58852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * Copyright 2014 The Android Open Source Project 68852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * 78852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 88852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * you may not use this file except in compliance with the License. 98852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * You may obtain a copy of the License at 108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * 118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * 138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * See the License for the specific language governing permissions and 178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * limitations under the License. 188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * 198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry *//*! 208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * \file 218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * \brief FBO colorbuffer tests. 228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry *//*--------------------------------------------------------------------*/ 238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "es31fFboColorbufferTests.hpp" 258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "es31fFboTestCase.hpp" 268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "es31fFboTestUtil.hpp" 278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluTextureUtil.hpp" 298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluContextInfo.hpp" 308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuCommandLine.hpp" 328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuImageCompare.hpp" 338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuRGBA.hpp" 348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuTestLog.hpp" 358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuTextureUtil.hpp" 368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "sglrContextUtil.hpp" 388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "deRandom.hpp" 408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "deString.h" 418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "glwEnums.hpp" 438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrynamespace deqp 458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrynamespace gles31 478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrynamespace Functional 498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing std::string; 528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::Vec2; 538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::Vec3; 548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::Vec4; 558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::IVec2; 568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::IVec3; 578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::IVec4; 588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::UVec4; 598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::TestLog; 608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing namespace FboTestUtil; 618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryconst tcu::RGBA MIN_THRESHOLD(12, 12, 12, 12); 638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic tcu::Vec4 generateRandomColor (de::Random& random) 658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::Vec4 retVal; 678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry retVal[0] = random.getFloat(); 698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry retVal[1] = random.getFloat(); 708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry retVal[2] = random.getFloat(); 718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry retVal[3] = 1.0f; 728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return retVal; 748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic tcu::CubeFace getCubeFaceFromNdx (int ndx) 778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (ndx) 798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case 0: return tcu::CUBEFACE_POSITIVE_X; 818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case 1: return tcu::CUBEFACE_NEGATIVE_X; 828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case 2: return tcu::CUBEFACE_POSITIVE_Y; 838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case 3: return tcu::CUBEFACE_NEGATIVE_Y; 848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case 4: return tcu::CUBEFACE_POSITIVE_Z; 858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case 5: return tcu::CUBEFACE_NEGATIVE_Z; 868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(false); 888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::CUBEFACE_LAST; 898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryclass FboColorbufferCase : public FboTestCase 938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrypublic: 958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry FboColorbufferCase (Context& context, const char* name, const char* desc, const deUint32 format) 968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : FboTestCase (context, name, desc) 978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_format (format) 988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 1008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry bool compare (const tcu::Surface& reference, const tcu::Surface& result) 1028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 1038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::RGBA threshold (tcu::max(getFormatThreshold(m_format), MIN_THRESHOLD)); 1048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_testCtx.getLog() << TestLog::Message << "Comparing images, threshold: " << threshold << TestLog::EndMessage; 1068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::bilinearCompare(m_testCtx.getLog(), "Result", "Image comparison result", reference.getAccess(), result.getAccess(), threshold, tcu::COMPARE_LOG_RESULT); 1088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 1098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprotected: 1118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 m_format; 1128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}; 1138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryclass FboColorTexCubeArrayCase : public FboColorbufferCase 1158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 1168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrypublic: 1178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry FboColorTexCubeArrayCase (Context& context, const char* name, const char* description, deUint32 texFmt, const IVec3& texSize) 1188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : FboColorbufferCase (context, name, description, texFmt) 1198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_texSize (texSize) 1208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 1218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(texSize.z() % 6 == 0); 1228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 1238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprotected: 1258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry void preCheck (void) 1268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 1275ed2b23bea6e56762a7aef8c8a086ec724517f26Daniel Andrade Groppe if (!glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array")) 1285ed2b23bea6e56762a7aef8c8a086ec724517f26Daniel Andrade Groppe TCU_THROW(NotSupportedError, "Test requires extension GL_EXT_texture_cube_map_array or a context version equal or higher than 3.2"); 1298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry checkFormatSupport(m_format); 1318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 1328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry void render (tcu::Surface& dst) 1348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 1358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry TestLog& log = m_testCtx.getLog(); 1368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry de::Random rnd (deStringHash(getName()) ^ 0xed607a89 ^ m_testCtx.getCommandLine().getBaseSeed()); 1378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::TextureFormat texFmt = glu::mapGLInternalFormat(m_format); 1388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::TextureFormatInfo fmtInfo = tcu::getTextureFormatInfo(texFmt); 1398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry Texture2DShader texToFboShader (DataTypes() << glu::TYPE_SAMPLER_2D, getFragmentOutputType(texFmt), fmtInfo.valueMax-fmtInfo.valueMin, fmtInfo.valueMin); 141cb24d85a6dae33dd3a658b831cd5f0c34918126aPyry Haulos TextureCubeArrayShader arrayTexShader (glu::getSamplerCubeArrayType(texFmt), glu::TYPE_FLOAT_VEC4, glu::getContextTypeGLSLVersion(m_context.getRenderContext().getType())); 1428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 texToFboShaderID = getCurrentContext()->createProgram(&texToFboShader); 1448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 arrayTexShaderID = getCurrentContext()->createProgram(&arrayTexShader); 1458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Setup textures 1478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry texToFboShader.setUniforms(*getCurrentContext(), texToFboShaderID); 1488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry arrayTexShader.setTexScaleBias(fmtInfo.lookupScale, fmtInfo.lookupBias); 1498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Framebuffers. 1518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry std::vector<deUint32> fbos; 1528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 tex; 1538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 1558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::TransferFormat transferFmt = glu::getTransferFormat(texFmt); 1568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry bool isFilterable = glu::isGLInternalColorFormatFilterable(m_format); 1578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const IVec3& size = m_texSize; 1588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message 1608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << "Creating a cube map array texture (" 1618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << size.x() << "x" << size.y() 1628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << ", depth: " 1638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << size.z() << ")" 1648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << TestLog::EndMessage; 1658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glGenTextures(1, &tex); 1678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex); 1698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 1708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 1718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 1728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, isFilterable ? GL_LINEAR : GL_NEAREST); 1738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, isFilterable ? GL_LINEAR : GL_NEAREST); 1748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, m_format, size.x(), size.y(), size.z(), 0, transferFmt.format, transferFmt.dataType, DE_NULL); 1758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message << "Creating a framebuffer object for each layer-face" << TestLog::EndMessage; 1778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Generate an FBO for each layer-face 1798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int ndx = 0; ndx < m_texSize.z(); ndx++) 1808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 1818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 layerFbo; 1828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glGenFramebuffers(1, &layerFbo); 1848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glBindFramebuffer(GL_FRAMEBUFFER, layerFbo); 1858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, ndx); 1868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry checkError(); 1878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry checkFramebufferStatus(GL_FRAMEBUFFER); 1888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry fbos.push_back(layerFbo); 1908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 1918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 1928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message << "Rendering test images to layer-faces in randomized order" << TestLog::EndMessage; 1948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 1968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry std::vector<int> order(fbos.size()); 1978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (size_t n = 0; n < order.size(); n++) 1998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry order[n] = (int)n; 2008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry rnd.shuffle(order.begin(), order.end()); 2018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (size_t ndx = 0; ndx < order.size(); ndx++) 2038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int layerFace = order[ndx]; 2058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 format = GL_RGBA; 2068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 dataType = GL_UNSIGNED_BYTE; 2078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int texW = 128; 2088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int texH = 128; 2098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 tmpTex = 0; 2108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 fbo = fbos[layerFace]; 2118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const IVec3& viewport = m_texSize; 2128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::TextureLevel data (glu::mapGLTransferFormat(format, dataType), texW, texH, 1); 2138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::fillWithGrid(data.getAccess(), 8, generateRandomColor(rnd), Vec4(0.0f)); 2158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glGenTextures(1, &tmpTex); 2178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glBindTexture(GL_TEXTURE_2D, tmpTex); 2188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 2198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 2208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 2218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 2228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glTexImage2D(GL_TEXTURE_2D, 0, format, texW, texH, 0, format, dataType, data.getAccess().getDataPtr()); 2238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glBindFramebuffer(GL_FRAMEBUFFER, fbo); 2258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glViewport(0, 0, viewport.x(), viewport.y()); 2268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry sglr::drawQuad(*getCurrentContext(), texToFboShaderID, Vec3(-1.0f, -1.0f, 0.0f), Vec3(1.0f, 1.0f, 0.0f)); 2278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry checkError(); 2288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Render to framebuffer 2308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec3 p0 = Vec3(float(ndx % 2) - 1.0f, float(ndx / 2) - 1.0f, 0.0f); 2328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec3 p1 = p0 + Vec3(1.0f, 1.0f, 0.0f); 2338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int layer = layerFace / 6; 2348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::CubeFace face = getCubeFaceFromNdx(layerFace % 6); 2358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glBindFramebuffer(GL_FRAMEBUFFER, 0); 2378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glViewport(0, 0, getWidth(), getHeight()); 2388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glActiveTexture(GL_TEXTURE0); 2408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex); 2418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry arrayTexShader.setLayer(layer); 2438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry arrayTexShader.setFace(face); 2448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry arrayTexShader.setUniforms(*getCurrentContext(), arrayTexShaderID); 2458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry sglr::drawQuad(*getCurrentContext(), arrayTexShaderID, p0, p1); 2478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry checkError(); 2488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry readPixels(dst, 0, 0, getWidth(), getHeight()); 2538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprivate: 2568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry IVec3 m_texSize; 2578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}; 2588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryFboColorTests::FboColorTests (Context& context) 2608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : TestCaseGroup(context, "color", "Colorbuffer tests") 2618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 2628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 2638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryFboColorTests::~FboColorTests (void) 2658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 2668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 2678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid FboColorTests::init (void) 2698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 2708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry static const deUint32 colorFormats[] = 2718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // RGBA formats 2738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGBA32I, 2748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGBA32UI, 2758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGBA16I, 2768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGBA16UI, 2778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGBA8, 2788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGBA8I, 2798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGBA8UI, 2808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_SRGB8_ALPHA8, 2818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGB10_A2, 2828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGB10_A2UI, 2838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGBA4, 2848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGB5_A1, 2858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // RGB formats 2878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGB8, 2888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGB565, 2898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // RG formats 2918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RG32I, 2928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RG32UI, 2938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RG16I, 2948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RG16UI, 2958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RG8, 2968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RG8I, 2978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RG8UI, 2988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // R formats 3008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_R32I, 3018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_R32UI, 3028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_R16I, 3038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_R16UI, 3048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_R8, 3058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_R8I, 3068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_R8UI, 3078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // GL_EXT_color_buffer_float 3098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGBA32F, 3108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGBA16F, 3118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_R11F_G11F_B10F, 3128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RG32F, 3138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RG16F, 3148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_R32F, 3158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_R16F, 3168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // GL_EXT_color_buffer_half_float 3188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGB16F 3198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry }; 3208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // .texcubearray 3228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 3238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::TestCaseGroup* texCubeArrayGroup = new tcu::TestCaseGroup(m_testCtx, "texcubearray", "Cube map array texture tests"); 3248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry addChild(texCubeArrayGroup); 3258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(colorFormats); fmtNdx++) 3278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry texCubeArrayGroup->addChild(new FboColorTexCubeArrayCase(m_context, getFormatName(colorFormats[fmtNdx]), "", 3288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry colorFormats[fmtNdx], IVec3(128, 128, 12))); 3298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 3308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 3318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // Functional 3338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // gles31 3348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // deqp 335