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{ 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return tcu::Vector<T, 4>((in.x() + 0.5f >= std::numeric_limits<T>::max()) ? (std::numeric_limits<T>::max()) : ((in.x() - 0.5f <= std::numeric_limits<T>::min()) ? (std::numeric_limits<T>::min()) : (T(in.x()))), 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry (in.y() + 0.5f >= std::numeric_limits<T>::max()) ? (std::numeric_limits<T>::max()) : ((in.y() - 0.5f <= std::numeric_limits<T>::min()) ? (std::numeric_limits<T>::min()) : (T(in.y()))), 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry (in.z() + 0.5f >= std::numeric_limits<T>::max()) ? (std::numeric_limits<T>::max()) : ((in.z() - 0.5f <= std::numeric_limits<T>::min()) ? (std::numeric_limits<T>::min()) : (T(in.z()))), 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry (in.w() + 0.5f >= std::numeric_limits<T>::max()) ? (std::numeric_limits<T>::max()) : ((in.w() - 0.5f <= 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 2653c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTextureCubeArrayShader::TextureCubeArrayShader (glu::DataType samplerType, glu::DataType outputType) 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( 2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "#version 310 es\n" 2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "#extension GL_EXT_texture_cube_map_array : require\n" 2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "in highp vec4 a_position;\n" 2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "in mediump vec2 a_coord;\n" 2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "uniform mat3 u_coordMat;\n" 2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "out highp vec3 v_coord;\n" 2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "void main (void)\n" 2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "{\n" 2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " gl_Position = a_position;\n" 2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " v_coord = u_coordMat * vec3(a_coord, 1.0);\n" 2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "}\n") 2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << sglr::pdec::FragmentSource( 2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry string("") + 2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "#version 310 es\n" 2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "#extension GL_EXT_texture_cube_map_array : require\n" 2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "uniform highp " + glu::getDataTypeName(samplerType) + " u_sampler0;\n" 2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "uniform highp vec4 u_scale;\n" 2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "uniform highp vec4 u_bias;\n" 2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "uniform highp int u_layer;\n" 2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "in highp vec3 v_coord;\n" 2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "layout(location = 0) out highp " + glu::getDataTypeName(outputType) + " o_color;\n" 2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "void main (void)\n" 2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "{\n" 3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " o_color = " + glu::getDataTypeName(outputType) + "(vec4(texture(u_sampler0, vec4(v_coord, u_layer))) * u_scale + u_bias);\n" 3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "}\n")) 3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_texScale (1.0f) 3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_texBias (0.0f) 3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_layer (0) 3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_outputType (outputType) 3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureCubeArrayShader::setLayer (int layer) 3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_layer = layer; 3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureCubeArrayShader::setFace (tcu::CubeFace face) 3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const float s_cubeTransforms[][3*3] = 3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Face -X: (x, y, 1) -> (-1, -(2*y-1), +(2*x-1)) 3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 0.0f, 0.0f, -1.0f, 3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, -2.0f, 1.0f, 3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2.0f, 0.0f, -1.0f }, 3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Face +X: (x, y, 1) -> (+1, -(2*y-1), -(2*x-1)) 3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 0.0f, 0.0f, 1.0f, 3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, -2.0f, 1.0f, 3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry -2.0f, 0.0f, 1.0f }, 3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Face -Y: (x, y, 1) -> (+(2*x-1), -1, -(2*y-1)) 3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2.0f, 0.0f, -1.0f, 3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, -1.0f, 3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, -2.0f, 1.0f }, 3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Face +Y: (x, y, 1) -> (+(2*x-1), +1, +(2*y-1)) 3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2.0f, 0.0f, -1.0f, 3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 1.0f, 3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 2.0f, -1.0f }, 3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Face -Z: (x, y, 1) -> (-(2*x-1), -(2*y-1), -1) 3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { -2.0f, 0.0f, 1.0f, 3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, -2.0f, 1.0f, 3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, -1.0f }, 3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Face +Z: (x, y, 1) -> (+(2*x-1), -(2*y-1), +1) 3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2.0f, 0.0f, -1.0f, 3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, -2.0f, 1.0f, 3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 1.0f } 3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(de::inBounds<int>(face, 0, tcu::CUBEFACE_LAST)); 3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_coordMat = tcu::Mat3(s_cubeTransforms[face]); 3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureCubeArrayShader::setTexScaleBias (const Vec4& scale, const Vec4& bias) 3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texScale = scale; 3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texBias = bias; 3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureCubeArrayShader::setUniforms (sglr::Context& gl, deUint32 program) const 3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.useProgram(program); 3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform1i(gl.getUniformLocation(program, "u_sampler0"), 0); 3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniformMatrix3fv(gl.getUniformLocation(program, "u_coordMat"), 1, GL_FALSE, m_coordMat.getColumnMajorData().getPtr()); 3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform1i(gl.getUniformLocation(program, "u_layer"), m_layer); 3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform4fv(gl.getUniformLocation(program, "u_scale"), 1, m_texScale.getPtr()); 3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform4fv(gl.getUniformLocation(program, "u_bias"), 1, m_texBias.getPtr()); 3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureCubeArrayShader::shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const 3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Mat3 texCoordMat = tcu::Mat3(m_uniforms[0].value.m3); 3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx) 3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rr::VertexPacket& packet = *packets[packetNdx]; 3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec2 a_coord = rr::readVertexAttribFloat(inputs[1], packet.instanceNdx, packet.vertexNdx).xy(); 3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec3 v_coord = texCoordMat * tcu::Vec3(a_coord.x(), a_coord.y(), 1.0f); 3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry packet.position = rr::readVertexAttribFloat(inputs[0], packet.instanceNdx, packet.vertexNdx); 3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry packet.outputs[0] = tcu::Vec4(v_coord.x(), v_coord.y(), v_coord.z(), 0.0f); 3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureCubeArrayShader::shadeFragments (rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const 3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec4 texScale (m_uniforms[2].value.f4); 3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec4 texBias (m_uniforms[3].value.f4); 3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec4 texCoords[4]; 3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec4 colors[4]; 3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx) 3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const sglr::rc::TextureCubeArray* tex = m_uniforms[1].sampler.texCubeArray; 3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int fragNdx = 0; fragNdx < 4; ++fragNdx) 3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec4 coord = rr::readTriangleVarying<float>(packets[packetNdx], context, 0, fragNdx); 3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry texCoords[fragNdx] = tcu::Vec4(coord.x(), coord.y(), coord.z(), (float)m_layer); 3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tex->sample4(colors, texCoords); 3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int fragNdx = 0; fragNdx < 4; ++fragNdx) 4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec4 color = colors[fragNdx] * texScale + texBias; 4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::IVec4 icolor = castVectorSaturate<deInt32>(color); 4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::UVec4 uicolor = castVectorSaturate<deUint32>(color); 4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_outputType == glu::TYPE_FLOAT_VEC4) rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color); 4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (m_outputType == glu::TYPE_INT_VEC4) rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, icolor); 4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (m_outputType == glu::TYPE_UINT_VEC4) rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, uicolor); 4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid clearColorBuffer (sglr::Context& ctx, const tcu::TextureFormat& format, const tcu::Vec4& value) 4158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::TextureChannelClass fmtClass = tcu::getTextureChannelClass(format.type); 4178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (fmtClass) 4198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 4218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 4228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 4238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ctx.clearBufferfv(GL_COLOR, 0, value.getPtr()); 4248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 4258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 4278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ctx.clearBufferuiv(GL_COLOR, 0, value.asUint().getPtr()); 4288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 4298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 4318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ctx.clearBufferiv(GL_COLOR, 0, value.asInt().getPtr()); 4328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 4338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 4358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(DE_FALSE); 4368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 4378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 4388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko 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) 4408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::TextureFormat readFormat = getFramebufferReadFormat(format); 4428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::TransferFormat transferFmt = glu::getTransferFormat(readFormat); 4438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int alignment = 4; // \note GL_PACK_ALIGNMENT = 4 is assumed. 4448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int rowSize = deAlign32(readFormat.getPixelSize()*width, alignment); 4458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry vector<deUint8> data (rowSize*height); 4468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ctx.readPixels(x, y, width, height, transferFmt.format, transferFmt.dataType, &data[0]); 4488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Convert to surface. 4508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::ConstPixelBufferAccess src(readFormat, width, height, 1, rowSize, 0, &data[0]); 4518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry dst.setSize(width, height); 4538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::PixelBufferAccess dstAccess = dst.getAccess(); 4548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int yo = 0; yo < height; yo++) 4568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int xo = 0; xo < width; xo++) 4578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry dstAccess.setPixel(src.getPixel(xo, yo) * scale + bias, xo, yo); 4588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 4598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic const char* getFboIncompleteReasonName (deUint32 reason) 4618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (reason) 4638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: return "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"; 4658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: return "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"; 4668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: return "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS"; 4678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_FRAMEBUFFER_UNSUPPORTED: return "GL_FRAMEBUFFER_UNSUPPORTED"; 4688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_FRAMEBUFFER_COMPLETE: return "GL_FRAMEBUFFER_COMPLETE"; 4698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: return "UNKNOWN"; 4708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 4718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 4728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryFboIncompleteException::FboIncompleteException (deUint32 reason, const char* file, int line) 4748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : TestError ("Framebuffer is not complete", getFboIncompleteReasonName(reason), file, line) 4758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_reason (reason) 4768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 4788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryconst char* getFormatName (deUint32 format) 4808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (format) 4828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB565: return "rgb565"; 4848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB5_A1: return "rgb5_a1"; 4858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA4: return "rgba4"; 4868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_DEPTH_COMPONENT16: return "depth_component16"; 4878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_STENCIL_INDEX8: return "stencil_index8"; 4888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA32F: return "rgba32f"; 4898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA32I: return "rgba32i"; 4908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA32UI: return "rgba32ui"; 4918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA16F: return "rgba16f"; 4928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA16I: return "rgba16i"; 4938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA16UI: return "rgba16ui"; 4948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8: return "rgba8"; 4958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8I: return "rgba8i"; 4968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8UI: return "rgba8ui"; 4978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_SRGB8_ALPHA8: return "srgb8_alpha8"; 4988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB10_A2: return "rgb10_a2"; 4998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB10_A2UI: return "rgb10_a2ui"; 5008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8_SNORM: return "rgba8_snorm"; 5018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB8: return "rgb8"; 5028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R11F_G11F_B10F: return "r11f_g11f_b10f"; 5038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB32F: return "rgb32f"; 5048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB32I: return "rgb32i"; 5058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB32UI: return "rgb32ui"; 5068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB16F: return "rgb16f"; 5078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB16I: return "rgb16i"; 5088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB16UI: return "rgb16ui"; 5098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB8_SNORM: return "rgb8_snorm"; 5108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB8I: return "rgb8i"; 5118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB8UI: return "rgb8ui"; 5128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_SRGB8: return "srgb8"; 5138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGB9_E5: return "rgb9_e5"; 5148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG32F: return "rg32f"; 5158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG32I: return "rg32i"; 5168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG32UI: return "rg32ui"; 5178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG16F: return "rg16f"; 5188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG16I: return "rg16i"; 5198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG16UI: return "rg16ui"; 5208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG8: return "rg8"; 5218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG8I: return "rg8i"; 5228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG8UI: return "rg8ui"; 5238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RG8_SNORM: return "rg8_snorm"; 5248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R32F: return "r32f"; 5258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R32I: return "r32i"; 5268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R32UI: return "r32ui"; 5278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R16F: return "r16f"; 5288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R16I: return "r16i"; 5298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R16UI: return "r16ui"; 5308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R8: return "r8"; 5318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R8I: return "r8i"; 5328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R8UI: return "r8ui"; 5338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_R8_SNORM: return "r8_snorm"; 5348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_DEPTH_COMPONENT32F: return "depth_component32f"; 5358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_DEPTH_COMPONENT24: return "depth_component24"; 5368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_DEPTH32F_STENCIL8: return "depth32f_stencil8"; 5378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_DEPTH24_STENCIL8: return "depth24_stencil8"; 5388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 5408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry TCU_FAIL("Unknown format"); 5418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 5438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryglu::DataType getFragmentOutputType (const tcu::TextureFormat& format) 5458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 5468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (tcu::getTextureChannelClass(format.type)) 5478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 5498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 5508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 5518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return glu::TYPE_FLOAT_VEC4; 5528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 5548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return glu::TYPE_UINT_VEC4; 5558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 5578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return glu::TYPE_INT_VEC4; 5588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 5608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(!"Unknown format"); 5618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return glu::TYPE_LAST; 5628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 5648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::TextureFormat getFramebufferReadFormat (const tcu::TextureFormat& format) 5668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 5678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (tcu::getTextureChannelClass(format.type)) 5688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 5708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT); 5718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 5738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 5748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8); 5758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 5778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32); 5788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 5808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32); 5818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 5838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(!"Unknown format"); 5848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::TextureFormat(); 5858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 5878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic int calculateU8ConversionError (int srcBits) 5898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 5908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (srcBits > 0) 5918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int clampedBits = de::clamp<int>(srcBits, 0, 8); 5938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int srcMaxValue = de::max((1<<clampedBits) - 1, 1); 5948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int error = int(deFloatCeil(255.0f * 2.0f / float(srcMaxValue))); 5958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return de::clamp<int>(error, 0, 255); 5978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry else 5998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return 1; 6008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 6018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::RGBA getFormatThreshold (const tcu::TextureFormat& format) 6038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 6048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::IVec4 bits = tcu::getTextureFormatBitDepth(format); 6058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return tcu::RGBA(calculateU8ConversionError(bits.x()), 6078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry calculateU8ConversionError(bits.y()), 6088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry calculateU8ConversionError(bits.z()), 6098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry calculateU8ConversionError(bits.w())); 6108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 6118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::RGBA getFormatThreshold (deUint32 glFormat) 6138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 6148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::TextureFormat format = glu::mapGLInternalFormat(glFormat); 6158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return getFormatThreshold(format); 6178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 6188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // FboTestUtil 6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional 6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles31 6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp 623