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