13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.1 Module 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ------------------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief FBO test utilities. 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es31fFboTestUtil.hpp" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "sglrContextUtil.hpp" 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "sglrGLContext.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "sglrReferenceContext.hpp" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluTextureUtil.hpp" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTextureUtil.hpp" 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deStringUtil.hpp" 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMath.h" 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp" 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp" 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <limits> 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles31 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace FboTestUtil 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string; 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector; 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::Vec2; 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::Vec3; 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::Vec4; 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::IVec2; 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::IVec3; 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::IVec4; 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic rr::GenericVecType mapDataTypeToGenericVecType(glu::DataType type) 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (type) 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case glu::TYPE_FLOAT_VEC4: return rr::GENERICVECTYPE_FLOAT; 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case glu::TYPE_INT_VEC4: return rr::GENERICVECTYPE_INT32; 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case glu::TYPE_UINT_VEC4: return rr::GENERICVECTYPE_UINT32; 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return rr::GENERICVECTYPE_LAST; 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T> 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic tcu::Vector<T, 4> castVectorSaturate (const tcu::Vec4& in) 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 71674ddbb09a7bb6b16f839e129d5f0f2ac6dc9e74Pyry Haulos return tcu::Vector<T, 4>(((double)in.x() + 0.5 >= (double)std::numeric_limits<T>::max()) ? (std::numeric_limits<T>::max()) : (((double)in.x() - 0.5 <= (double)std::numeric_limits<T>::min()) ? (std::numeric_limits<T>::min()) : (T(in.x()))), 72674ddbb09a7bb6b16f839e129d5f0f2ac6dc9e74Pyry Haulos ((double)in.y() + 0.5 >= (double)std::numeric_limits<T>::max()) ? (std::numeric_limits<T>::max()) : (((double)in.y() - 0.5 <= (double)std::numeric_limits<T>::min()) ? (std::numeric_limits<T>::min()) : (T(in.y()))), 73674ddbb09a7bb6b16f839e129d5f0f2ac6dc9e74Pyry Haulos ((double)in.z() + 0.5 >= (double)std::numeric_limits<T>::max()) ? (std::numeric_limits<T>::max()) : (((double)in.z() - 0.5 <= (double)std::numeric_limits<T>::min()) ? (std::numeric_limits<T>::min()) : (T(in.z()))), 74674ddbb09a7bb6b16f839e129d5f0f2ac6dc9e74Pyry Haulos ((double)in.w() + 0.5 >= (double)std::numeric_limits<T>::max()) ? (std::numeric_limits<T>::max()) : (((double)in.w() - 0.5 <= (double)std::numeric_limits<T>::min()) ? (std::numeric_limits<T>::min()) : (T(in.w())))); 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic string genTexFragmentShader (const vector<glu::DataType>& samplerTypes, glu::DataType outputType) 788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* precision = "highp"; 808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry std::ostringstream src; 818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry src << "#version 300 es\n" 838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << "layout(location = 0) out highp " << glu::getDataTypeName(outputType) << " o_color0;\n"; 848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry src << "in highp vec2 v_coord;\n"; 868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int samplerNdx = 0; samplerNdx < (int)samplerTypes.size(); samplerNdx++) 888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry src << "uniform " << precision << " " << glu::getDataTypeName(samplerTypes[samplerNdx]) << " u_sampler" << samplerNdx << ";\n"; 908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry src << "uniform " << precision << " vec4 u_texScale" << samplerNdx << ";\n"; 918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry src << "uniform " << precision << " vec4 u_texBias" << samplerNdx << ";\n"; 928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Output scale & bias 958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry src << "uniform " << precision << " vec4 u_outScale0;\n" 968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << "uniform " << precision << " vec4 u_outBias0;\n"; 978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry src << "\n" 998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << "void main (void)\n" 1008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << "{\n" 1018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << " " << precision << " vec4 out0 = vec4(0.0);\n"; 1028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Texture input fetch and combine. 1048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int inNdx = 0; inNdx < (int)samplerTypes.size(); inNdx++) 1058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry src << "\tout0 += vec4(" 1068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << "texture(u_sampler" << inNdx << ", v_coord)) * u_texScale" << inNdx << " + u_texBias" << inNdx << ";\n"; 1078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Write output. 1098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry src << " o_color0 = " << glu::getDataTypeName(outputType) << "(out0 * u_outScale0 + u_outBias0);\n"; 1108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry src << "}\n"; 1128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return src.str(); 1148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 1158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic sglr::pdec::ShaderProgramDeclaration genTexture2DShaderDecl (const DataTypes& samplerTypes, glu::DataType outputType) 1178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 1188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry sglr::pdec::ShaderProgramDeclaration decl; 1198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry decl << sglr::pdec::VertexAttribute("a_position", rr::GENERICVECTYPE_FLOAT); 1218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry decl << sglr::pdec::VertexAttribute("a_coord", rr::GENERICVECTYPE_FLOAT); 1228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry decl << sglr::pdec::VertexToFragmentVarying(rr::GENERICVECTYPE_FLOAT); 1238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry decl << sglr::pdec::FragmentOutput(mapDataTypeToGenericVecType(outputType)); 1248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry decl << sglr::pdec::VertexSource( 1268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "#version 300 es\n" 1278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "in highp vec4 a_position;\n" 1288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "in highp vec2 a_coord;\n" 1298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "out highp vec2 v_coord;\n" 1308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "void main(void)\n" 1318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "{\n" 1328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry " gl_Position = a_position;\n" 1338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry " v_coord = a_coord;\n" 1348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "}\n"); 1358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry decl << sglr::pdec::FragmentSource(genTexFragmentShader(samplerTypes.vec, outputType)); 1368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry decl << sglr::pdec::Uniform("u_outScale0", glu::TYPE_FLOAT_VEC4); 1388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry decl << sglr::pdec::Uniform("u_outBias0", glu::TYPE_FLOAT_VEC4); 1398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (size_t ndx = 0; ndx < samplerTypes.vec.size(); ++ndx) 1418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 1428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry decl << sglr::pdec::Uniform(std::string("u_sampler") + de::toString(ndx), samplerTypes.vec[ndx]); 1438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry decl << sglr::pdec::Uniform(std::string("u_texScale") + de::toString(ndx), glu::TYPE_FLOAT_VEC4); 1448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry decl << sglr::pdec::Uniform(std::string("u_texBias") + de::toString(ndx), glu::TYPE_FLOAT_VEC4); 1458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 1468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return decl; 1488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 1498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryTexture2DShader::Texture2DShader (const DataTypes& samplerTypes, glu::DataType outputType, const Vec4& outScale, const Vec4& outBias) 1518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : sglr::ShaderProgram (genTexture2DShaderDecl(samplerTypes, outputType)) 1528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_outScale (outScale) 1538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_outBias (outBias) 1548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_outputType (outputType) 1558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 1568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_inputs.resize(samplerTypes.vec.size()); 1578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Initialize units. 1598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int ndx = 0; ndx < (int)m_inputs.size(); ndx++) 1608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 1618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_inputs[ndx].unitNdx = ndx; 1628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_inputs[ndx].scale = Vec4(1.0f); 1638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_inputs[ndx].bias = Vec4(0.0f); 1648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 1658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 1668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid Texture2DShader::setUnit (int inputNdx, int unitNdx) 1688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 1698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_inputs[inputNdx].unitNdx = unitNdx; 1708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 1718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid Texture2DShader::setTexScaleBias (int inputNdx, const Vec4& scale, const Vec4& bias) 1738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 1748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_inputs[inputNdx].scale = scale; 1758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_inputs[inputNdx].bias = bias; 1768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 1778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid Texture2DShader::setOutScaleBias (const Vec4& scale, const Vec4& bias) 1798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 1808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_outScale = scale; 1818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_outBias = bias; 1828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 1838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid Texture2DShader::setUniforms (sglr::Context& gl, deUint32 program) const 1858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 1868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.useProgram(program); 1878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int texNdx = 0; texNdx < (int)m_inputs.size(); texNdx++) 1898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 1908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry string samplerName = string("u_sampler") + de::toString(texNdx); 1918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry string scaleName = string("u_texScale") + de::toString(texNdx); 1928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry string biasName = string("u_texBias") + de::toString(texNdx); 1938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.uniform1i(gl.getUniformLocation(program, samplerName.c_str()), m_inputs[texNdx].unitNdx); 1958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.uniform4fv(gl.getUniformLocation(program, scaleName.c_str()), 1, m_inputs[texNdx].scale.getPtr()); 1968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.uniform4fv(gl.getUniformLocation(program, biasName.c_str()), 1, m_inputs[texNdx].bias.getPtr()); 1978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 1988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.uniform4fv(gl.getUniformLocation(program, "u_outScale0"), 1, m_outScale.getPtr()); 2008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.uniform4fv(gl.getUniformLocation(program, "u_outBias0"), 1, m_outBias.getPtr()); 2018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 2028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid Texture2DShader::shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const 2048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 2058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx) 2068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry rr::VertexPacket& packet = *packets[packetNdx]; 2088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry packet.position = rr::readVertexAttribFloat(inputs[0], packet.instanceNdx, packet.vertexNdx); 2108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry packet.outputs[0] = rr::readVertexAttribFloat(inputs[1], packet.instanceNdx, packet.vertexNdx); 2118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 2138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid Texture2DShader::shadeFragments (rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const 2158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 2168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::Vec4 outScale (m_uniforms[0].value.f4); 2178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::Vec4 outBias (m_uniforms[1].value.f4); 2188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::Vec2 texCoords[4]; 2208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::Vec4 colors[4]; 2218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx) 2238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // setup tex coords 2258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int fragNdx = 0; fragNdx < 4; ++fragNdx) 2268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::Vec4 coord = rr::readTriangleVarying<float>(packets[packetNdx], context, 0, fragNdx); 2288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry texCoords[fragNdx] = tcu::Vec2(coord.x(), coord.y()); 2298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // clear result 2328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int fragNdx = 0; fragNdx < 4; ++fragNdx) 2338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry colors[fragNdx] = tcu::Vec4(0.0f); 2348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // sample each texture 2368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int ndx = 0; ndx < (int)m_inputs.size(); ndx++) 2378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const sglr::rc::Texture2D* tex = m_uniforms[2 + ndx*3].sampler.tex2D; 2398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::Vec4 scale (m_uniforms[2 + ndx*3 + 1].value.f4); 2408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::Vec4 bias (m_uniforms[2 + ndx*3 + 2].value.f4); 2418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::Vec4 tmpColors[4]; 2428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tex->sample4(tmpColors, texCoords); 2448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int fragNdx = 0; fragNdx < 4; ++fragNdx) 2468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry colors[fragNdx] += tmpColors[fragNdx] * scale + bias; 2478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // write out 2508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int fragNdx = 0; fragNdx < 4; ++fragNdx) 2518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::Vec4 color = colors[fragNdx] * outScale + outBias; 2538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::IVec4 icolor = castVectorSaturate<deInt32>(color); 2548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::UVec4 uicolor = castVectorSaturate<deUint32>(color); 2558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (m_outputType == glu::TYPE_FLOAT_VEC4) rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color); 2578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry else if (m_outputType == glu::TYPE_INT_VEC4) rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, icolor); 2588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry else if (m_outputType == glu::TYPE_UINT_VEC4) rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, uicolor); 2598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry else 2608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(DE_FALSE); 2618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 2648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 265cb24d85a6dae33dd3a658b831cd5f0c34918126aPyry HaulosTextureCubeArrayShader::TextureCubeArrayShader (glu::DataType samplerType, glu::DataType outputType, glu::GLSLVersion glslVersion) 2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : sglr::ShaderProgram(sglr::pdec::ShaderProgramDeclaration() 2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << sglr::pdec::VertexAttribute("a_position", rr::GENERICVECTYPE_FLOAT) 2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << sglr::pdec::VertexAttribute("a_coord", rr::GENERICVECTYPE_FLOAT) 2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << sglr::pdec::VertexToFragmentVarying(rr::GENERICVECTYPE_FLOAT) 2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << sglr::pdec::FragmentOutput(mapDataTypeToGenericVecType(outputType)) 2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << sglr::pdec::Uniform("u_coordMat", glu::TYPE_FLOAT_MAT3) 2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << sglr::pdec::Uniform("u_sampler0", samplerType) 2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << sglr::pdec::Uniform("u_scale", glu::TYPE_FLOAT_VEC4) 2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << sglr::pdec::Uniform("u_bias", glu::TYPE_FLOAT_VEC4) 2758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << sglr::pdec::Uniform("u_layer", glu::TYPE_INT) 2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << sglr::pdec::VertexSource( 277cb24d85a6dae33dd3a658b831cd5f0c34918126aPyry Haulos string("") + 278cb24d85a6dae33dd3a658b831cd5f0c34918126aPyry Haulos ((glslVersion == glu::GLSL_VERSION_310_ES) ? 2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "#version 310 es\n" 2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "#extension GL_EXT_texture_cube_map_array : require\n" 281cb24d85a6dae33dd3a658b831cd5f0c34918126aPyry Haulos : "#version 320 es\n") + 2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "in highp vec4 a_position;\n" 2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "in mediump vec2 a_coord;\n" 2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "uniform mat3 u_coordMat;\n" 2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "out highp vec3 v_coord;\n" 2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "void main (void)\n" 2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "{\n" 2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " gl_Position = a_position;\n" 2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " v_coord = u_coordMat * vec3(a_coord, 1.0);\n" 2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "}\n") 2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << sglr::pdec::FragmentSource( 2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry string("") + 293cb24d85a6dae33dd3a658b831cd5f0c34918126aPyry Haulos ((glslVersion == glu::GLSL_VERSION_310_ES) ? 2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "#version 310 es\n" 2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "#extension GL_EXT_texture_cube_map_array : require\n" 296cb24d85a6dae33dd3a658b831cd5f0c34918126aPyry Haulos : "#version 320 es\n") + 2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "uniform highp " + glu::getDataTypeName(samplerType) + " u_sampler0;\n" 2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "uniform highp vec4 u_scale;\n" 2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "uniform highp vec4 u_bias;\n" 3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "uniform highp int u_layer;\n" 3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "in highp vec3 v_coord;\n" 3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "layout(location = 0) out highp " + glu::getDataTypeName(outputType) + " o_color;\n" 3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "void main (void)\n" 3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "{\n" 3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " o_color = " + glu::getDataTypeName(outputType) + "(vec4(texture(u_sampler0, vec4(v_coord, u_layer))) * u_scale + u_bias);\n" 3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "}\n")) 3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_texScale (1.0f) 3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_texBias (0.0f) 3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_layer (0) 3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_outputType (outputType) 3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 312cb24d85a6dae33dd3a658b831cd5f0c34918126aPyry Haulos TCU_CHECK_INTERNAL(glslVersion == glu::GLSL_VERSION_310_ES || glslVersion == glu::GLSL_VERSION_320_ES); 3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureCubeArrayShader::setLayer (int layer) 3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_layer = layer; 3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureCubeArrayShader::setFace (tcu::CubeFace face) 3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const float s_cubeTransforms[][3*3] = 3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Face -X: (x, y, 1) -> (-1, -(2*y-1), +(2*x-1)) 3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 0.0f, 0.0f, -1.0f, 3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, -2.0f, 1.0f, 3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2.0f, 0.0f, -1.0f }, 3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Face +X: (x, y, 1) -> (+1, -(2*y-1), -(2*x-1)) 3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 0.0f, 0.0f, 1.0f, 3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, -2.0f, 1.0f, 3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry -2.0f, 0.0f, 1.0f }, 3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Face -Y: (x, y, 1) -> (+(2*x-1), -1, -(2*y-1)) 3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2.0f, 0.0f, -1.0f, 3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, -1.0f, 3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, -2.0f, 1.0f }, 3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Face +Y: (x, y, 1) -> (+(2*x-1), +1, +(2*y-1)) 3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2.0f, 0.0f, -1.0f, 3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 1.0f, 3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 2.0f, -1.0f }, 3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Face -Z: (x, y, 1) -> (-(2*x-1), -(2*y-1), -1) 3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { -2.0f, 0.0f, 1.0f, 3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, -2.0f, 1.0f, 3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, -1.0f }, 3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Face +Z: (x, y, 1) -> (+(2*x-1), -(2*y-1), +1) 3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2.0f, 0.0f, -1.0f, 3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, -2.0f, 1.0f, 3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 1.0f } 3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(de::inBounds<int>(face, 0, tcu::CUBEFACE_LAST)); 3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_coordMat = tcu::Mat3(s_cubeTransforms[face]); 3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureCubeArrayShader::setTexScaleBias (const Vec4& scale, const Vec4& bias) 3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texScale = scale; 3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texBias = bias; 3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureCubeArrayShader::setUniforms (sglr::Context& gl, deUint32 program) const 3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.useProgram(program); 3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform1i(gl.getUniformLocation(program, "u_sampler0"), 0); 3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniformMatrix3fv(gl.getUniformLocation(program, "u_coordMat"), 1, GL_FALSE, m_coordMat.getColumnMajorData().getPtr()); 3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform1i(gl.getUniformLocation(program, "u_layer"), m_layer); 3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform4fv(gl.getUniformLocation(program, "u_scale"), 1, m_texScale.getPtr()); 3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform4fv(gl.getUniformLocation(program, "u_bias"), 1, m_texBias.getPtr()); 3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureCubeArrayShader::shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const 3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Mat3 texCoordMat = tcu::Mat3(m_uniforms[0].value.m3); 3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx) 3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rr::VertexPacket& packet = *packets[packetNdx]; 3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec2 a_coord = rr::readVertexAttribFloat(inputs[1], packet.instanceNdx, packet.vertexNdx).xy(); 3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec3 v_coord = texCoordMat * tcu::Vec3(a_coord.x(), a_coord.y(), 1.0f); 3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry packet.position = rr::readVertexAttribFloat(inputs[0], packet.instanceNdx, packet.vertexNdx); 3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry packet.outputs[0] = tcu::Vec4(v_coord.x(), v_coord.y(), v_coord.z(), 0.0f); 3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureCubeArrayShader::shadeFragments (rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const 3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec4 texScale (m_uniforms[2].value.f4); 3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec4 texBias (m_uniforms[3].value.f4); 3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec4 texCoords[4]; 3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec4 colors[4]; 3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx) 3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const sglr::rc::TextureCubeArray* tex = m_uniforms[1].sampler.texCubeArray; 3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int fragNdx = 0; fragNdx < 4; ++fragNdx) 3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec4 coord = rr::readTriangleVarying<float>(packets[packetNdx], context, 0, fragNdx); 4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry texCoords[fragNdx] = tcu::Vec4(coord.x(), coord.y(), coord.z(), (float)m_layer); 4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tex->sample4(colors, texCoords); 4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int fragNdx = 0; fragNdx < 4; ++fragNdx) 4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec4 color = colors[fragNdx] * texScale + texBias; 4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::IVec4 icolor = castVectorSaturate<deInt32>(color); 4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::UVec4 uicolor = castVectorSaturate<deUint32>(color); 4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_outputType == glu::TYPE_FLOAT_VEC4) rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color); 4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (m_outputType == glu::TYPE_INT_VEC4) rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, icolor); 4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (m_outputType == glu::TYPE_UINT_VEC4) rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, uicolor); 4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid clearColorBuffer (sglr::Context& ctx, const tcu::TextureFormat& format, const tcu::Vec4& value) 4218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::TextureChannelClass fmtClass = tcu::getTextureChannelClass(format.type); 4238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (fmtClass) 4258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 4278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 4288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 4298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ctx.clearBufferfv(GL_COLOR, 0, value.getPtr()); 4308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 4318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 4338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ctx.clearBufferuiv(GL_COLOR, 0, value.asUint().getPtr()); 4348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 4358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 4378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ctx.clearBufferiv(GL_COLOR, 0, value.asInt().getPtr()); 4388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 4398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 4418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(DE_FALSE); 4428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 4438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 4448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid readPixels (sglr::Context& ctx, tcu::Surface& dst, int x, int y, int width, int height, const tcu::TextureFormat& format, const tcu::Vec4& scale, const tcu::Vec4& bias) 4468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::TextureFormat readFormat = getFramebufferReadFormat(format); 4488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::TransferFormat transferFmt = glu::getTransferFormat(readFormat); 4498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int alignment = 4; // \note GL_PACK_ALIGNMENT = 4 is assumed. 4508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int rowSize = deAlign32(readFormat.getPixelSize()*width, alignment); 4518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry vector<deUint8> data (rowSize*height); 4528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ctx.readPixels(x, y, width, height, transferFmt.format, transferFmt.dataType, &data[0]); 4548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Convert to surface. 4568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::ConstPixelBufferAccess src(readFormat, width, height, 1, rowSize, 0, &data[0]); 4578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry dst.setSize(width, height); 4598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::PixelBufferAccess dstAccess = dst.getAccess(); 4608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int yo = 0; yo < height; yo++) 4628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int xo = 0; xo < width; xo++) 4638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry dstAccess.setPixel(src.getPixel(xo, yo) * scale + bias, xo, yo); 4648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 4658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic const char* getFboIncompleteReasonName (deUint32 reason) 4678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (reason) 4698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: return "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"; 4718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: return "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"; 4728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: return "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS"; 4738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_FRAMEBUFFER_UNSUPPORTED: return "GL_FRAMEBUFFER_UNSUPPORTED"; 4748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_FRAMEBUFFER_COMPLETE: return "GL_FRAMEBUFFER_COMPLETE"; 4758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: return "UNKNOWN"; 4768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 4778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 4788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryFboIncompleteException::FboIncompleteException (deUint32 reason, const char* file, int line) 4808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : TestError ("Framebuffer is not complete", getFboIncompleteReasonName(reason), file, line) 4818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_reason (reason) 4828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 4848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryconst char* getFormatName (deUint32 format) 4868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (format) 4888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB565: return "rgb565"; 4908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB5_A1: return "rgb5_a1"; 4918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA4: return "rgba4"; 4928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_DEPTH_COMPONENT16: return "depth_component16"; 4938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_STENCIL_INDEX8: return "stencil_index8"; 4948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA32F: return "rgba32f"; 4958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA32I: return "rgba32i"; 4968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA32UI: return "rgba32ui"; 4978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA16F: return "rgba16f"; 4988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA16I: return "rgba16i"; 4998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA16UI: return "rgba16ui"; 5008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8: return "rgba8"; 5018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8I: return "rgba8i"; 5028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8UI: return "rgba8ui"; 5038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_SRGB8_ALPHA8: return "srgb8_alpha8"; 5048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB10_A2: return "rgb10_a2"; 5058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB10_A2UI: return "rgb10_a2ui"; 5068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8_SNORM: return "rgba8_snorm"; 5078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB8: return "rgb8"; 5088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R11F_G11F_B10F: return "r11f_g11f_b10f"; 5098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB32F: return "rgb32f"; 5108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB32I: return "rgb32i"; 5118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB32UI: return "rgb32ui"; 5128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB16F: return "rgb16f"; 5138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB16I: return "rgb16i"; 5148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB16UI: return "rgb16ui"; 5158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB8_SNORM: return "rgb8_snorm"; 5168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB8I: return "rgb8i"; 5178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB8UI: return "rgb8ui"; 5188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_SRGB8: return "srgb8"; 5198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB9_E5: return "rgb9_e5"; 5208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG32F: return "rg32f"; 5218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG32I: return "rg32i"; 5228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG32UI: return "rg32ui"; 5238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG16F: return "rg16f"; 5248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG16I: return "rg16i"; 5258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG16UI: return "rg16ui"; 5268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG8: return "rg8"; 5278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG8I: return "rg8i"; 5288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG8UI: return "rg8ui"; 5298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG8_SNORM: return "rg8_snorm"; 5308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R32F: return "r32f"; 5318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R32I: return "r32i"; 5328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R32UI: return "r32ui"; 5338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R16F: return "r16f"; 5348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R16I: return "r16i"; 5358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R16UI: return "r16ui"; 5368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R8: return "r8"; 5378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R8I: return "r8i"; 5388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R8UI: return "r8ui"; 5398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R8_SNORM: return "r8_snorm"; 5408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_DEPTH_COMPONENT32F: return "depth_component32f"; 5418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_DEPTH_COMPONENT24: return "depth_component24"; 5428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_DEPTH32F_STENCIL8: return "depth32f_stencil8"; 5438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_DEPTH24_STENCIL8: return "depth24_stencil8"; 5448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 5468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry TCU_FAIL("Unknown format"); 5478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 5498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryglu::DataType getFragmentOutputType (const tcu::TextureFormat& format) 5518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 5528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (tcu::getTextureChannelClass(format.type)) 5538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 5558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 5568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 5578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return glu::TYPE_FLOAT_VEC4; 5588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 5608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return glu::TYPE_UINT_VEC4; 5618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 5638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return glu::TYPE_INT_VEC4; 5648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 5661cc61b7d03cad727bbddd00cea8d78f4f6cc9047Jarkko Pöyry DE_FATAL("Unknown format"); 5678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return glu::TYPE_LAST; 5688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 5708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::TextureFormat getFramebufferReadFormat (const tcu::TextureFormat& format) 5728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 5738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (tcu::getTextureChannelClass(format.type)) 5748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 5768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT); 5778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 5798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 5808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8); 5818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 5838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32); 5848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 5868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32); 5878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 5891cc61b7d03cad727bbddd00cea8d78f4f6cc9047Jarkko Pöyry DE_FATAL("Unknown format"); 5908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::TextureFormat(); 5918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 5938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic int calculateU8ConversionError (int srcBits) 5958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 5968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (srcBits > 0) 5978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int clampedBits = de::clamp<int>(srcBits, 0, 8); 5998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int srcMaxValue = de::max((1<<clampedBits) - 1, 1); 6008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int error = int(deFloatCeil(255.0f * 2.0f / float(srcMaxValue))); 6018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return de::clamp<int>(error, 0, 255); 6038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 6048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry else 6058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return 1; 6068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 6078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::RGBA getFormatThreshold (const tcu::TextureFormat& format) 6098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 6108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::IVec4 bits = tcu::getTextureFormatBitDepth(format); 6118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::RGBA(calculateU8ConversionError(bits.x()), 6138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry calculateU8ConversionError(bits.y()), 6148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry calculateU8ConversionError(bits.z()), 6158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry calculateU8ConversionError(bits.w())); 6168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 6178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::RGBA getFormatThreshold (deUint32 glFormat) 6198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 6208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::TextureFormat format = glu::mapGLInternalFormat(glFormat); 6218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return getFormatThreshold(format); 6238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 6248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // FboTestUtil 6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional 6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles31 6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp 629