1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.1 Module
3*35238bceSAndroid Build Coastguard Worker * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief FBO test utilities.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es31fFboTestUtil.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "sglrContextUtil.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "sglrGLContext.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "sglrReferenceContext.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "deMath.h"
32*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
34*35238bceSAndroid Build Coastguard Worker
35*35238bceSAndroid Build Coastguard Worker #include <limits>
36*35238bceSAndroid Build Coastguard Worker
37*35238bceSAndroid Build Coastguard Worker namespace deqp
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker namespace gles31
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker namespace Functional
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker namespace FboTestUtil
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker
46*35238bceSAndroid Build Coastguard Worker using std::string;
47*35238bceSAndroid Build Coastguard Worker using std::vector;
48*35238bceSAndroid Build Coastguard Worker using tcu::IVec2;
49*35238bceSAndroid Build Coastguard Worker using tcu::IVec3;
50*35238bceSAndroid Build Coastguard Worker using tcu::IVec4;
51*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
52*35238bceSAndroid Build Coastguard Worker using tcu::Vec3;
53*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
54*35238bceSAndroid Build Coastguard Worker
mapDataTypeToGenericVecType(glu::DataType type)55*35238bceSAndroid Build Coastguard Worker static rr::GenericVecType mapDataTypeToGenericVecType(glu::DataType type)
56*35238bceSAndroid Build Coastguard Worker {
57*35238bceSAndroid Build Coastguard Worker switch (type)
58*35238bceSAndroid Build Coastguard Worker {
59*35238bceSAndroid Build Coastguard Worker case glu::TYPE_FLOAT_VEC4:
60*35238bceSAndroid Build Coastguard Worker return rr::GENERICVECTYPE_FLOAT;
61*35238bceSAndroid Build Coastguard Worker case glu::TYPE_INT_VEC4:
62*35238bceSAndroid Build Coastguard Worker return rr::GENERICVECTYPE_INT32;
63*35238bceSAndroid Build Coastguard Worker case glu::TYPE_UINT_VEC4:
64*35238bceSAndroid Build Coastguard Worker return rr::GENERICVECTYPE_UINT32;
65*35238bceSAndroid Build Coastguard Worker default:
66*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
67*35238bceSAndroid Build Coastguard Worker return rr::GENERICVECTYPE_LAST;
68*35238bceSAndroid Build Coastguard Worker }
69*35238bceSAndroid Build Coastguard Worker }
70*35238bceSAndroid Build Coastguard Worker
71*35238bceSAndroid Build Coastguard Worker template <typename T>
castVectorSaturate(const tcu::Vec4 & in)72*35238bceSAndroid Build Coastguard Worker static tcu::Vector<T, 4> castVectorSaturate(const tcu::Vec4 &in)
73*35238bceSAndroid Build Coastguard Worker {
74*35238bceSAndroid Build Coastguard Worker return tcu::Vector<T, 4>(
75*35238bceSAndroid Build Coastguard Worker ((double)in.x() + 0.5 >= (double)std::numeric_limits<T>::max()) ?
76*35238bceSAndroid Build Coastguard Worker (std::numeric_limits<T>::max()) :
77*35238bceSAndroid Build Coastguard Worker (((double)in.x() - 0.5 <= (double)std::numeric_limits<T>::min()) ? (std::numeric_limits<T>::min()) :
78*35238bceSAndroid Build Coastguard Worker (T(in.x()))),
79*35238bceSAndroid Build Coastguard Worker ((double)in.y() + 0.5 >= (double)std::numeric_limits<T>::max()) ?
80*35238bceSAndroid Build Coastguard Worker (std::numeric_limits<T>::max()) :
81*35238bceSAndroid Build Coastguard Worker (((double)in.y() - 0.5 <= (double)std::numeric_limits<T>::min()) ? (std::numeric_limits<T>::min()) :
82*35238bceSAndroid Build Coastguard Worker (T(in.y()))),
83*35238bceSAndroid Build Coastguard Worker ((double)in.z() + 0.5 >= (double)std::numeric_limits<T>::max()) ?
84*35238bceSAndroid Build Coastguard Worker (std::numeric_limits<T>::max()) :
85*35238bceSAndroid Build Coastguard Worker (((double)in.z() - 0.5 <= (double)std::numeric_limits<T>::min()) ? (std::numeric_limits<T>::min()) :
86*35238bceSAndroid Build Coastguard Worker (T(in.z()))),
87*35238bceSAndroid Build Coastguard Worker ((double)in.w() + 0.5 >= (double)std::numeric_limits<T>::max()) ?
88*35238bceSAndroid Build Coastguard Worker (std::numeric_limits<T>::max()) :
89*35238bceSAndroid Build Coastguard Worker (((double)in.w() - 0.5 <= (double)std::numeric_limits<T>::min()) ? (std::numeric_limits<T>::min()) :
90*35238bceSAndroid Build Coastguard Worker (T(in.w()))));
91*35238bceSAndroid Build Coastguard Worker }
92*35238bceSAndroid Build Coastguard Worker
genTexFragmentShader(const vector<glu::DataType> & samplerTypes,glu::DataType outputType)93*35238bceSAndroid Build Coastguard Worker static string genTexFragmentShader(const vector<glu::DataType> &samplerTypes, glu::DataType outputType)
94*35238bceSAndroid Build Coastguard Worker {
95*35238bceSAndroid Build Coastguard Worker const char *precision = "highp";
96*35238bceSAndroid Build Coastguard Worker std::ostringstream src;
97*35238bceSAndroid Build Coastguard Worker
98*35238bceSAndroid Build Coastguard Worker src << "#version 300 es\n"
99*35238bceSAndroid Build Coastguard Worker << "layout(location = 0) out highp " << glu::getDataTypeName(outputType) << " o_color0;\n";
100*35238bceSAndroid Build Coastguard Worker
101*35238bceSAndroid Build Coastguard Worker src << "in highp vec2 v_coord;\n";
102*35238bceSAndroid Build Coastguard Worker
103*35238bceSAndroid Build Coastguard Worker for (int samplerNdx = 0; samplerNdx < (int)samplerTypes.size(); samplerNdx++)
104*35238bceSAndroid Build Coastguard Worker {
105*35238bceSAndroid Build Coastguard Worker src << "uniform " << precision << " " << glu::getDataTypeName(samplerTypes[samplerNdx]) << " u_sampler"
106*35238bceSAndroid Build Coastguard Worker << samplerNdx << ";\n";
107*35238bceSAndroid Build Coastguard Worker src << "uniform " << precision << " vec4 u_texScale" << samplerNdx << ";\n";
108*35238bceSAndroid Build Coastguard Worker src << "uniform " << precision << " vec4 u_texBias" << samplerNdx << ";\n";
109*35238bceSAndroid Build Coastguard Worker }
110*35238bceSAndroid Build Coastguard Worker
111*35238bceSAndroid Build Coastguard Worker // Output scale & bias
112*35238bceSAndroid Build Coastguard Worker src << "uniform " << precision << " vec4 u_outScale0;\n"
113*35238bceSAndroid Build Coastguard Worker << "uniform " << precision << " vec4 u_outBias0;\n";
114*35238bceSAndroid Build Coastguard Worker
115*35238bceSAndroid Build Coastguard Worker src << "\n"
116*35238bceSAndroid Build Coastguard Worker << "void main (void)\n"
117*35238bceSAndroid Build Coastguard Worker << "{\n"
118*35238bceSAndroid Build Coastguard Worker << " " << precision << " vec4 out0 = vec4(0.0);\n";
119*35238bceSAndroid Build Coastguard Worker
120*35238bceSAndroid Build Coastguard Worker // Texture input fetch and combine.
121*35238bceSAndroid Build Coastguard Worker for (int inNdx = 0; inNdx < (int)samplerTypes.size(); inNdx++)
122*35238bceSAndroid Build Coastguard Worker src << "\tout0 += vec4("
123*35238bceSAndroid Build Coastguard Worker << "texture(u_sampler" << inNdx << ", v_coord)) * u_texScale" << inNdx << " + u_texBias" << inNdx << ";\n";
124*35238bceSAndroid Build Coastguard Worker
125*35238bceSAndroid Build Coastguard Worker // Write output.
126*35238bceSAndroid Build Coastguard Worker src << " o_color0 = " << glu::getDataTypeName(outputType) << "(out0 * u_outScale0 + u_outBias0);\n";
127*35238bceSAndroid Build Coastguard Worker
128*35238bceSAndroid Build Coastguard Worker src << "}\n";
129*35238bceSAndroid Build Coastguard Worker
130*35238bceSAndroid Build Coastguard Worker return src.str();
131*35238bceSAndroid Build Coastguard Worker }
132*35238bceSAndroid Build Coastguard Worker
genTexture2DShaderDecl(const DataTypes & samplerTypes,glu::DataType outputType)133*35238bceSAndroid Build Coastguard Worker static sglr::pdec::ShaderProgramDeclaration genTexture2DShaderDecl(const DataTypes &samplerTypes,
134*35238bceSAndroid Build Coastguard Worker glu::DataType outputType)
135*35238bceSAndroid Build Coastguard Worker {
136*35238bceSAndroid Build Coastguard Worker sglr::pdec::ShaderProgramDeclaration decl;
137*35238bceSAndroid Build Coastguard Worker
138*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::VertexAttribute("a_position", rr::GENERICVECTYPE_FLOAT);
139*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::VertexAttribute("a_coord", rr::GENERICVECTYPE_FLOAT);
140*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::VertexToFragmentVarying(rr::GENERICVECTYPE_FLOAT);
141*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::FragmentOutput(mapDataTypeToGenericVecType(outputType));
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::VertexSource("#version 300 es\n"
144*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
145*35238bceSAndroid Build Coastguard Worker "in highp vec2 a_coord;\n"
146*35238bceSAndroid Build Coastguard Worker "out highp vec2 v_coord;\n"
147*35238bceSAndroid Build Coastguard Worker "void main(void)\n"
148*35238bceSAndroid Build Coastguard Worker "{\n"
149*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
150*35238bceSAndroid Build Coastguard Worker " v_coord = a_coord;\n"
151*35238bceSAndroid Build Coastguard Worker "}\n");
152*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::FragmentSource(genTexFragmentShader(samplerTypes.vec, outputType));
153*35238bceSAndroid Build Coastguard Worker
154*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::Uniform("u_outScale0", glu::TYPE_FLOAT_VEC4);
155*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::Uniform("u_outBias0", glu::TYPE_FLOAT_VEC4);
156*35238bceSAndroid Build Coastguard Worker
157*35238bceSAndroid Build Coastguard Worker for (size_t ndx = 0; ndx < samplerTypes.vec.size(); ++ndx)
158*35238bceSAndroid Build Coastguard Worker {
159*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::Uniform(std::string("u_sampler") + de::toString(ndx), samplerTypes.vec[ndx]);
160*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::Uniform(std::string("u_texScale") + de::toString(ndx), glu::TYPE_FLOAT_VEC4);
161*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::Uniform(std::string("u_texBias") + de::toString(ndx), glu::TYPE_FLOAT_VEC4);
162*35238bceSAndroid Build Coastguard Worker }
163*35238bceSAndroid Build Coastguard Worker
164*35238bceSAndroid Build Coastguard Worker return decl;
165*35238bceSAndroid Build Coastguard Worker }
166*35238bceSAndroid Build Coastguard Worker
Texture2DShader(const DataTypes & samplerTypes,glu::DataType outputType,const Vec4 & outScale,const Vec4 & outBias)167*35238bceSAndroid Build Coastguard Worker Texture2DShader::Texture2DShader(const DataTypes &samplerTypes, glu::DataType outputType, const Vec4 &outScale,
168*35238bceSAndroid Build Coastguard Worker const Vec4 &outBias)
169*35238bceSAndroid Build Coastguard Worker : sglr::ShaderProgram(genTexture2DShaderDecl(samplerTypes, outputType))
170*35238bceSAndroid Build Coastguard Worker , m_outScale(outScale)
171*35238bceSAndroid Build Coastguard Worker , m_outBias(outBias)
172*35238bceSAndroid Build Coastguard Worker , m_outputType(outputType)
173*35238bceSAndroid Build Coastguard Worker {
174*35238bceSAndroid Build Coastguard Worker m_inputs.resize(samplerTypes.vec.size());
175*35238bceSAndroid Build Coastguard Worker
176*35238bceSAndroid Build Coastguard Worker // Initialize units.
177*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)m_inputs.size(); ndx++)
178*35238bceSAndroid Build Coastguard Worker {
179*35238bceSAndroid Build Coastguard Worker m_inputs[ndx].unitNdx = ndx;
180*35238bceSAndroid Build Coastguard Worker m_inputs[ndx].scale = Vec4(1.0f);
181*35238bceSAndroid Build Coastguard Worker m_inputs[ndx].bias = Vec4(0.0f);
182*35238bceSAndroid Build Coastguard Worker }
183*35238bceSAndroid Build Coastguard Worker }
184*35238bceSAndroid Build Coastguard Worker
setUnit(int inputNdx,int unitNdx)185*35238bceSAndroid Build Coastguard Worker void Texture2DShader::setUnit(int inputNdx, int unitNdx)
186*35238bceSAndroid Build Coastguard Worker {
187*35238bceSAndroid Build Coastguard Worker m_inputs[inputNdx].unitNdx = unitNdx;
188*35238bceSAndroid Build Coastguard Worker }
189*35238bceSAndroid Build Coastguard Worker
setTexScaleBias(int inputNdx,const Vec4 & scale,const Vec4 & bias)190*35238bceSAndroid Build Coastguard Worker void Texture2DShader::setTexScaleBias(int inputNdx, const Vec4 &scale, const Vec4 &bias)
191*35238bceSAndroid Build Coastguard Worker {
192*35238bceSAndroid Build Coastguard Worker m_inputs[inputNdx].scale = scale;
193*35238bceSAndroid Build Coastguard Worker m_inputs[inputNdx].bias = bias;
194*35238bceSAndroid Build Coastguard Worker }
195*35238bceSAndroid Build Coastguard Worker
setOutScaleBias(const Vec4 & scale,const Vec4 & bias)196*35238bceSAndroid Build Coastguard Worker void Texture2DShader::setOutScaleBias(const Vec4 &scale, const Vec4 &bias)
197*35238bceSAndroid Build Coastguard Worker {
198*35238bceSAndroid Build Coastguard Worker m_outScale = scale;
199*35238bceSAndroid Build Coastguard Worker m_outBias = bias;
200*35238bceSAndroid Build Coastguard Worker }
201*35238bceSAndroid Build Coastguard Worker
setUniforms(sglr::Context & gl,uint32_t program) const202*35238bceSAndroid Build Coastguard Worker void Texture2DShader::setUniforms(sglr::Context &gl, uint32_t program) const
203*35238bceSAndroid Build Coastguard Worker {
204*35238bceSAndroid Build Coastguard Worker gl.useProgram(program);
205*35238bceSAndroid Build Coastguard Worker
206*35238bceSAndroid Build Coastguard Worker for (int texNdx = 0; texNdx < (int)m_inputs.size(); texNdx++)
207*35238bceSAndroid Build Coastguard Worker {
208*35238bceSAndroid Build Coastguard Worker string samplerName = string("u_sampler") + de::toString(texNdx);
209*35238bceSAndroid Build Coastguard Worker string scaleName = string("u_texScale") + de::toString(texNdx);
210*35238bceSAndroid Build Coastguard Worker string biasName = string("u_texBias") + de::toString(texNdx);
211*35238bceSAndroid Build Coastguard Worker
212*35238bceSAndroid Build Coastguard Worker gl.uniform1i(gl.getUniformLocation(program, samplerName.c_str()), m_inputs[texNdx].unitNdx);
213*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, scaleName.c_str()), 1, m_inputs[texNdx].scale.getPtr());
214*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, biasName.c_str()), 1, m_inputs[texNdx].bias.getPtr());
215*35238bceSAndroid Build Coastguard Worker }
216*35238bceSAndroid Build Coastguard Worker
217*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, "u_outScale0"), 1, m_outScale.getPtr());
218*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, "u_outBias0"), 1, m_outBias.getPtr());
219*35238bceSAndroid Build Coastguard Worker }
220*35238bceSAndroid Build Coastguard Worker
shadeVertices(const rr::VertexAttrib * inputs,rr::VertexPacket * const * packets,const int numPackets) const221*35238bceSAndroid Build Coastguard Worker void Texture2DShader::shadeVertices(const rr::VertexAttrib *inputs, rr::VertexPacket *const *packets,
222*35238bceSAndroid Build Coastguard Worker const int numPackets) const
223*35238bceSAndroid Build Coastguard Worker {
224*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
225*35238bceSAndroid Build Coastguard Worker {
226*35238bceSAndroid Build Coastguard Worker rr::VertexPacket &packet = *packets[packetNdx];
227*35238bceSAndroid Build Coastguard Worker
228*35238bceSAndroid Build Coastguard Worker packet.position = rr::readVertexAttribFloat(inputs[0], packet.instanceNdx, packet.vertexNdx);
229*35238bceSAndroid Build Coastguard Worker packet.outputs[0] = rr::readVertexAttribFloat(inputs[1], packet.instanceNdx, packet.vertexNdx);
230*35238bceSAndroid Build Coastguard Worker }
231*35238bceSAndroid Build Coastguard Worker }
232*35238bceSAndroid Build Coastguard Worker
shadeFragments(rr::FragmentPacket * packets,const int numPackets,const rr::FragmentShadingContext & context) const233*35238bceSAndroid Build Coastguard Worker void Texture2DShader::shadeFragments(rr::FragmentPacket *packets, const int numPackets,
234*35238bceSAndroid Build Coastguard Worker const rr::FragmentShadingContext &context) const
235*35238bceSAndroid Build Coastguard Worker {
236*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 outScale(m_uniforms[0].value.f4);
237*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 outBias(m_uniforms[1].value.f4);
238*35238bceSAndroid Build Coastguard Worker
239*35238bceSAndroid Build Coastguard Worker tcu::Vec2 texCoords[4];
240*35238bceSAndroid Build Coastguard Worker tcu::Vec4 colors[4];
241*35238bceSAndroid Build Coastguard Worker
242*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
243*35238bceSAndroid Build Coastguard Worker {
244*35238bceSAndroid Build Coastguard Worker // setup tex coords
245*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
246*35238bceSAndroid Build Coastguard Worker {
247*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 coord = rr::readTriangleVarying<float>(packets[packetNdx], context, 0, fragNdx);
248*35238bceSAndroid Build Coastguard Worker texCoords[fragNdx] = tcu::Vec2(coord.x(), coord.y());
249*35238bceSAndroid Build Coastguard Worker }
250*35238bceSAndroid Build Coastguard Worker
251*35238bceSAndroid Build Coastguard Worker // clear result
252*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
253*35238bceSAndroid Build Coastguard Worker colors[fragNdx] = tcu::Vec4(0.0f);
254*35238bceSAndroid Build Coastguard Worker
255*35238bceSAndroid Build Coastguard Worker // sample each texture
256*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)m_inputs.size(); ndx++)
257*35238bceSAndroid Build Coastguard Worker {
258*35238bceSAndroid Build Coastguard Worker const sglr::rc::Texture2D *tex = m_uniforms[2 + ndx * 3].sampler.tex2D;
259*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 scale(m_uniforms[2 + ndx * 3 + 1].value.f4);
260*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 bias(m_uniforms[2 + ndx * 3 + 2].value.f4);
261*35238bceSAndroid Build Coastguard Worker tcu::Vec4 tmpColors[4];
262*35238bceSAndroid Build Coastguard Worker
263*35238bceSAndroid Build Coastguard Worker tex->sample4(tmpColors, texCoords);
264*35238bceSAndroid Build Coastguard Worker
265*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
266*35238bceSAndroid Build Coastguard Worker colors[fragNdx] += tmpColors[fragNdx] * scale + bias;
267*35238bceSAndroid Build Coastguard Worker }
268*35238bceSAndroid Build Coastguard Worker
269*35238bceSAndroid Build Coastguard Worker // write out
270*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
271*35238bceSAndroid Build Coastguard Worker {
272*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 color = colors[fragNdx] * outScale + outBias;
273*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 icolor = castVectorSaturate<int32_t>(color);
274*35238bceSAndroid Build Coastguard Worker const tcu::UVec4 uicolor = castVectorSaturate<uint32_t>(color);
275*35238bceSAndroid Build Coastguard Worker
276*35238bceSAndroid Build Coastguard Worker if (m_outputType == glu::TYPE_FLOAT_VEC4)
277*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color);
278*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_INT_VEC4)
279*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, icolor);
280*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_UINT_VEC4)
281*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, uicolor);
282*35238bceSAndroid Build Coastguard Worker else
283*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
284*35238bceSAndroid Build Coastguard Worker }
285*35238bceSAndroid Build Coastguard Worker }
286*35238bceSAndroid Build Coastguard Worker }
287*35238bceSAndroid Build Coastguard Worker
TextureCubeArrayShader(glu::DataType samplerType,glu::DataType outputType,glu::GLSLVersion glslVersion)288*35238bceSAndroid Build Coastguard Worker TextureCubeArrayShader::TextureCubeArrayShader(glu::DataType samplerType, glu::DataType outputType,
289*35238bceSAndroid Build Coastguard Worker glu::GLSLVersion glslVersion)
290*35238bceSAndroid Build Coastguard Worker : sglr::ShaderProgram(
291*35238bceSAndroid Build Coastguard Worker sglr::pdec::ShaderProgramDeclaration()
292*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexAttribute("a_position", rr::GENERICVECTYPE_FLOAT)
293*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexAttribute("a_coord", rr::GENERICVECTYPE_FLOAT)
294*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexToFragmentVarying(rr::GENERICVECTYPE_FLOAT)
295*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentOutput(mapDataTypeToGenericVecType(outputType))
296*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_coordMat", glu::TYPE_FLOAT_MAT3) << sglr::pdec::Uniform("u_sampler0", samplerType)
297*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_scale", glu::TYPE_FLOAT_VEC4) << sglr::pdec::Uniform("u_bias", glu::TYPE_FLOAT_VEC4)
298*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_layer", glu::TYPE_INT)
299*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexSource(string("") +
300*35238bceSAndroid Build Coastguard Worker ((glslVersion == glu::GLSL_VERSION_310_ES) ?
301*35238bceSAndroid Build Coastguard Worker "#version 310 es\n"
302*35238bceSAndroid Build Coastguard Worker "#extension GL_EXT_texture_cube_map_array : require\n" :
303*35238bceSAndroid Build Coastguard Worker "#version 320 es\n") +
304*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
305*35238bceSAndroid Build Coastguard Worker "in mediump vec2 a_coord;\n"
306*35238bceSAndroid Build Coastguard Worker "uniform mat3 u_coordMat;\n"
307*35238bceSAndroid Build Coastguard Worker "out highp vec3 v_coord;\n"
308*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
309*35238bceSAndroid Build Coastguard Worker "{\n"
310*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
311*35238bceSAndroid Build Coastguard Worker " v_coord = u_coordMat * vec3(a_coord, 1.0);\n"
312*35238bceSAndroid Build Coastguard Worker "}\n")
313*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentSource(string("") +
314*35238bceSAndroid Build Coastguard Worker ((glslVersion == glu::GLSL_VERSION_310_ES) ?
315*35238bceSAndroid Build Coastguard Worker "#version 310 es\n"
316*35238bceSAndroid Build Coastguard Worker "#extension GL_EXT_texture_cube_map_array : require\n" :
317*35238bceSAndroid Build Coastguard Worker "#version 320 es\n") +
318*35238bceSAndroid Build Coastguard Worker "uniform highp " + glu::getDataTypeName(samplerType) +
319*35238bceSAndroid Build Coastguard Worker " u_sampler0;\n"
320*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_scale;\n"
321*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_bias;\n"
322*35238bceSAndroid Build Coastguard Worker "uniform highp int u_layer;\n"
323*35238bceSAndroid Build Coastguard Worker "in highp vec3 v_coord;\n"
324*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out highp " +
325*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
326*35238bceSAndroid Build Coastguard Worker " o_color;\n"
327*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
328*35238bceSAndroid Build Coastguard Worker "{\n"
329*35238bceSAndroid Build Coastguard Worker " o_color = " +
330*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
331*35238bceSAndroid Build Coastguard Worker "(vec4(texture(u_sampler0, vec4(v_coord, u_layer))) * u_scale + u_bias);\n"
332*35238bceSAndroid Build Coastguard Worker "}\n"))
333*35238bceSAndroid Build Coastguard Worker , m_texScale(1.0f)
334*35238bceSAndroid Build Coastguard Worker , m_texBias(0.0f)
335*35238bceSAndroid Build Coastguard Worker , m_layer(0)
336*35238bceSAndroid Build Coastguard Worker , m_outputType(outputType)
337*35238bceSAndroid Build Coastguard Worker {
338*35238bceSAndroid Build Coastguard Worker TCU_CHECK_INTERNAL(glslVersion == glu::GLSL_VERSION_310_ES || glslVersion == glu::GLSL_VERSION_320_ES ||
339*35238bceSAndroid Build Coastguard Worker glslVersion == glu::GLSL_VERSION_450);
340*35238bceSAndroid Build Coastguard Worker }
341*35238bceSAndroid Build Coastguard Worker
setLayer(int layer)342*35238bceSAndroid Build Coastguard Worker void TextureCubeArrayShader::setLayer(int layer)
343*35238bceSAndroid Build Coastguard Worker {
344*35238bceSAndroid Build Coastguard Worker m_layer = layer;
345*35238bceSAndroid Build Coastguard Worker }
346*35238bceSAndroid Build Coastguard Worker
setFace(tcu::CubeFace face)347*35238bceSAndroid Build Coastguard Worker void TextureCubeArrayShader::setFace(tcu::CubeFace face)
348*35238bceSAndroid Build Coastguard Worker {
349*35238bceSAndroid Build Coastguard Worker static const float s_cubeTransforms[][3 * 3] = {// Face -X: (x, y, 1) -> (-1, -(2*y-1), +(2*x-1))
350*35238bceSAndroid Build Coastguard Worker {0.0f, 0.0f, -1.0f, 0.0f, -2.0f, 1.0f, 2.0f, 0.0f, -1.0f},
351*35238bceSAndroid Build Coastguard Worker // Face +X: (x, y, 1) -> (+1, -(2*y-1), -(2*x-1))
352*35238bceSAndroid Build Coastguard Worker {0.0f, 0.0f, 1.0f, 0.0f, -2.0f, 1.0f, -2.0f, 0.0f, 1.0f},
353*35238bceSAndroid Build Coastguard Worker // Face -Y: (x, y, 1) -> (+(2*x-1), -1, -(2*y-1))
354*35238bceSAndroid Build Coastguard Worker {2.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, -2.0f, 1.0f},
355*35238bceSAndroid Build Coastguard Worker // Face +Y: (x, y, 1) -> (+(2*x-1), +1, +(2*y-1))
356*35238bceSAndroid Build Coastguard Worker {2.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 2.0f, -1.0f},
357*35238bceSAndroid Build Coastguard Worker // Face -Z: (x, y, 1) -> (-(2*x-1), -(2*y-1), -1)
358*35238bceSAndroid Build Coastguard Worker {-2.0f, 0.0f, 1.0f, 0.0f, -2.0f, 1.0f, 0.0f, 0.0f, -1.0f},
359*35238bceSAndroid Build Coastguard Worker // Face +Z: (x, y, 1) -> (+(2*x-1), -(2*y-1), +1)
360*35238bceSAndroid Build Coastguard Worker {2.0f, 0.0f, -1.0f, 0.0f, -2.0f, 1.0f, 0.0f, 0.0f, 1.0f}};
361*35238bceSAndroid Build Coastguard Worker DE_ASSERT(de::inBounds<int>(face, 0, tcu::CUBEFACE_LAST));
362*35238bceSAndroid Build Coastguard Worker m_coordMat = tcu::Mat3(s_cubeTransforms[face]);
363*35238bceSAndroid Build Coastguard Worker }
364*35238bceSAndroid Build Coastguard Worker
setTexScaleBias(const Vec4 & scale,const Vec4 & bias)365*35238bceSAndroid Build Coastguard Worker void TextureCubeArrayShader::setTexScaleBias(const Vec4 &scale, const Vec4 &bias)
366*35238bceSAndroid Build Coastguard Worker {
367*35238bceSAndroid Build Coastguard Worker m_texScale = scale;
368*35238bceSAndroid Build Coastguard Worker m_texBias = bias;
369*35238bceSAndroid Build Coastguard Worker }
370*35238bceSAndroid Build Coastguard Worker
setUniforms(sglr::Context & gl,uint32_t program) const371*35238bceSAndroid Build Coastguard Worker void TextureCubeArrayShader::setUniforms(sglr::Context &gl, uint32_t program) const
372*35238bceSAndroid Build Coastguard Worker {
373*35238bceSAndroid Build Coastguard Worker gl.useProgram(program);
374*35238bceSAndroid Build Coastguard Worker
375*35238bceSAndroid Build Coastguard Worker gl.uniform1i(gl.getUniformLocation(program, "u_sampler0"), 0);
376*35238bceSAndroid Build Coastguard Worker gl.uniformMatrix3fv(gl.getUniformLocation(program, "u_coordMat"), 1, GL_FALSE,
377*35238bceSAndroid Build Coastguard Worker m_coordMat.getColumnMajorData().getPtr());
378*35238bceSAndroid Build Coastguard Worker gl.uniform1i(gl.getUniformLocation(program, "u_layer"), m_layer);
379*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, "u_scale"), 1, m_texScale.getPtr());
380*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, "u_bias"), 1, m_texBias.getPtr());
381*35238bceSAndroid Build Coastguard Worker }
382*35238bceSAndroid Build Coastguard Worker
shadeVertices(const rr::VertexAttrib * inputs,rr::VertexPacket * const * packets,const int numPackets) const383*35238bceSAndroid Build Coastguard Worker void TextureCubeArrayShader::shadeVertices(const rr::VertexAttrib *inputs, rr::VertexPacket *const *packets,
384*35238bceSAndroid Build Coastguard Worker const int numPackets) const
385*35238bceSAndroid Build Coastguard Worker {
386*35238bceSAndroid Build Coastguard Worker tcu::Mat3 texCoordMat = tcu::Mat3(m_uniforms[0].value.m3);
387*35238bceSAndroid Build Coastguard Worker
388*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
389*35238bceSAndroid Build Coastguard Worker {
390*35238bceSAndroid Build Coastguard Worker rr::VertexPacket &packet = *packets[packetNdx];
391*35238bceSAndroid Build Coastguard Worker const tcu::Vec2 a_coord = rr::readVertexAttribFloat(inputs[1], packet.instanceNdx, packet.vertexNdx).xy();
392*35238bceSAndroid Build Coastguard Worker const tcu::Vec3 v_coord = texCoordMat * tcu::Vec3(a_coord.x(), a_coord.y(), 1.0f);
393*35238bceSAndroid Build Coastguard Worker
394*35238bceSAndroid Build Coastguard Worker packet.position = rr::readVertexAttribFloat(inputs[0], packet.instanceNdx, packet.vertexNdx);
395*35238bceSAndroid Build Coastguard Worker packet.outputs[0] = tcu::Vec4(v_coord.x(), v_coord.y(), v_coord.z(), 0.0f);
396*35238bceSAndroid Build Coastguard Worker }
397*35238bceSAndroid Build Coastguard Worker }
398*35238bceSAndroid Build Coastguard Worker
shadeFragments(rr::FragmentPacket * packets,const int numPackets,const rr::FragmentShadingContext & context) const399*35238bceSAndroid Build Coastguard Worker void TextureCubeArrayShader::shadeFragments(rr::FragmentPacket *packets, const int numPackets,
400*35238bceSAndroid Build Coastguard Worker const rr::FragmentShadingContext &context) const
401*35238bceSAndroid Build Coastguard Worker {
402*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 texScale(m_uniforms[2].value.f4);
403*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 texBias(m_uniforms[3].value.f4);
404*35238bceSAndroid Build Coastguard Worker
405*35238bceSAndroid Build Coastguard Worker tcu::Vec4 texCoords[4];
406*35238bceSAndroid Build Coastguard Worker tcu::Vec4 colors[4];
407*35238bceSAndroid Build Coastguard Worker
408*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
409*35238bceSAndroid Build Coastguard Worker {
410*35238bceSAndroid Build Coastguard Worker const sglr::rc::TextureCubeArray *tex = m_uniforms[1].sampler.texCubeArray;
411*35238bceSAndroid Build Coastguard Worker
412*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
413*35238bceSAndroid Build Coastguard Worker {
414*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 coord = rr::readTriangleVarying<float>(packets[packetNdx], context, 0, fragNdx);
415*35238bceSAndroid Build Coastguard Worker texCoords[fragNdx] = tcu::Vec4(coord.x(), coord.y(), coord.z(), (float)m_layer);
416*35238bceSAndroid Build Coastguard Worker }
417*35238bceSAndroid Build Coastguard Worker
418*35238bceSAndroid Build Coastguard Worker tex->sample4(colors, texCoords);
419*35238bceSAndroid Build Coastguard Worker
420*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
421*35238bceSAndroid Build Coastguard Worker {
422*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 color = colors[fragNdx] * texScale + texBias;
423*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 icolor = castVectorSaturate<int32_t>(color);
424*35238bceSAndroid Build Coastguard Worker const tcu::UVec4 uicolor = castVectorSaturate<uint32_t>(color);
425*35238bceSAndroid Build Coastguard Worker
426*35238bceSAndroid Build Coastguard Worker if (m_outputType == glu::TYPE_FLOAT_VEC4)
427*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color);
428*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_INT_VEC4)
429*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, icolor);
430*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_UINT_VEC4)
431*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, uicolor);
432*35238bceSAndroid Build Coastguard Worker else
433*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
434*35238bceSAndroid Build Coastguard Worker }
435*35238bceSAndroid Build Coastguard Worker }
436*35238bceSAndroid Build Coastguard Worker }
437*35238bceSAndroid Build Coastguard Worker
clearColorBuffer(sglr::Context & ctx,const tcu::TextureFormat & format,const tcu::Vec4 & value)438*35238bceSAndroid Build Coastguard Worker void clearColorBuffer(sglr::Context &ctx, const tcu::TextureFormat &format, const tcu::Vec4 &value)
439*35238bceSAndroid Build Coastguard Worker {
440*35238bceSAndroid Build Coastguard Worker const tcu::TextureChannelClass fmtClass = tcu::getTextureChannelClass(format.type);
441*35238bceSAndroid Build Coastguard Worker
442*35238bceSAndroid Build Coastguard Worker switch (fmtClass)
443*35238bceSAndroid Build Coastguard Worker {
444*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
445*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
446*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
447*35238bceSAndroid Build Coastguard Worker ctx.clearBufferfv(GL_COLOR, 0, value.getPtr());
448*35238bceSAndroid Build Coastguard Worker break;
449*35238bceSAndroid Build Coastguard Worker
450*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
451*35238bceSAndroid Build Coastguard Worker ctx.clearBufferuiv(GL_COLOR, 0, value.asUint().getPtr());
452*35238bceSAndroid Build Coastguard Worker break;
453*35238bceSAndroid Build Coastguard Worker
454*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
455*35238bceSAndroid Build Coastguard Worker ctx.clearBufferiv(GL_COLOR, 0, value.asInt().getPtr());
456*35238bceSAndroid Build Coastguard Worker break;
457*35238bceSAndroid Build Coastguard Worker
458*35238bceSAndroid Build Coastguard Worker default:
459*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
460*35238bceSAndroid Build Coastguard Worker }
461*35238bceSAndroid Build Coastguard Worker }
462*35238bceSAndroid Build Coastguard Worker
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)463*35238bceSAndroid Build Coastguard Worker void readPixels(sglr::Context &ctx, tcu::Surface &dst, int x, int y, int width, int height,
464*35238bceSAndroid Build Coastguard Worker const tcu::TextureFormat &format, const tcu::Vec4 &scale, const tcu::Vec4 &bias)
465*35238bceSAndroid Build Coastguard Worker {
466*35238bceSAndroid Build Coastguard Worker tcu::TextureFormat readFormat = getFramebufferReadFormat(format);
467*35238bceSAndroid Build Coastguard Worker glu::TransferFormat transferFmt = glu::getTransferFormat(readFormat);
468*35238bceSAndroid Build Coastguard Worker int alignment = 4; // \note GL_PACK_ALIGNMENT = 4 is assumed.
469*35238bceSAndroid Build Coastguard Worker int rowSize = deAlign32(readFormat.getPixelSize() * width, alignment);
470*35238bceSAndroid Build Coastguard Worker vector<uint8_t> data(rowSize * height);
471*35238bceSAndroid Build Coastguard Worker
472*35238bceSAndroid Build Coastguard Worker ctx.readPixels(x, y, width, height, transferFmt.format, transferFmt.dataType, &data[0]);
473*35238bceSAndroid Build Coastguard Worker
474*35238bceSAndroid Build Coastguard Worker // Convert to surface.
475*35238bceSAndroid Build Coastguard Worker tcu::ConstPixelBufferAccess src(readFormat, width, height, 1, rowSize, 0, &data[0]);
476*35238bceSAndroid Build Coastguard Worker
477*35238bceSAndroid Build Coastguard Worker dst.setSize(width, height);
478*35238bceSAndroid Build Coastguard Worker tcu::PixelBufferAccess dstAccess = dst.getAccess();
479*35238bceSAndroid Build Coastguard Worker
480*35238bceSAndroid Build Coastguard Worker for (int yo = 0; yo < height; yo++)
481*35238bceSAndroid Build Coastguard Worker for (int xo = 0; xo < width; xo++)
482*35238bceSAndroid Build Coastguard Worker dstAccess.setPixel(src.getPixel(xo, yo) * scale + bias, xo, yo);
483*35238bceSAndroid Build Coastguard Worker }
484*35238bceSAndroid Build Coastguard Worker
getFboIncompleteReasonName(uint32_t reason)485*35238bceSAndroid Build Coastguard Worker static const char *getFboIncompleteReasonName(uint32_t reason)
486*35238bceSAndroid Build Coastguard Worker {
487*35238bceSAndroid Build Coastguard Worker switch (reason)
488*35238bceSAndroid Build Coastguard Worker {
489*35238bceSAndroid Build Coastguard Worker case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
490*35238bceSAndroid Build Coastguard Worker return "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT";
491*35238bceSAndroid Build Coastguard Worker case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
492*35238bceSAndroid Build Coastguard Worker return "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";
493*35238bceSAndroid Build Coastguard Worker case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
494*35238bceSAndroid Build Coastguard Worker return "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS";
495*35238bceSAndroid Build Coastguard Worker case GL_FRAMEBUFFER_UNSUPPORTED:
496*35238bceSAndroid Build Coastguard Worker return "GL_FRAMEBUFFER_UNSUPPORTED";
497*35238bceSAndroid Build Coastguard Worker case GL_FRAMEBUFFER_COMPLETE:
498*35238bceSAndroid Build Coastguard Worker return "GL_FRAMEBUFFER_COMPLETE";
499*35238bceSAndroid Build Coastguard Worker default:
500*35238bceSAndroid Build Coastguard Worker return "UNKNOWN";
501*35238bceSAndroid Build Coastguard Worker }
502*35238bceSAndroid Build Coastguard Worker }
503*35238bceSAndroid Build Coastguard Worker
FboIncompleteException(uint32_t reason,const char * file,int line)504*35238bceSAndroid Build Coastguard Worker FboIncompleteException::FboIncompleteException(uint32_t reason, const char *file, int line)
505*35238bceSAndroid Build Coastguard Worker : TestError("Framebuffer is not complete", getFboIncompleteReasonName(reason), file, line)
506*35238bceSAndroid Build Coastguard Worker , m_reason(reason)
507*35238bceSAndroid Build Coastguard Worker {
508*35238bceSAndroid Build Coastguard Worker }
509*35238bceSAndroid Build Coastguard Worker
getFormatName(uint32_t format)510*35238bceSAndroid Build Coastguard Worker const char *getFormatName(uint32_t format)
511*35238bceSAndroid Build Coastguard Worker {
512*35238bceSAndroid Build Coastguard Worker switch (format)
513*35238bceSAndroid Build Coastguard Worker {
514*35238bceSAndroid Build Coastguard Worker case GL_RGB565:
515*35238bceSAndroid Build Coastguard Worker return "rgb565";
516*35238bceSAndroid Build Coastguard Worker case GL_RGB5_A1:
517*35238bceSAndroid Build Coastguard Worker return "rgb5_a1";
518*35238bceSAndroid Build Coastguard Worker case GL_RGBA4:
519*35238bceSAndroid Build Coastguard Worker return "rgba4";
520*35238bceSAndroid Build Coastguard Worker case GL_DEPTH_COMPONENT16:
521*35238bceSAndroid Build Coastguard Worker return "depth_component16";
522*35238bceSAndroid Build Coastguard Worker case GL_STENCIL_INDEX8:
523*35238bceSAndroid Build Coastguard Worker return "stencil_index8";
524*35238bceSAndroid Build Coastguard Worker case GL_RGBA32F:
525*35238bceSAndroid Build Coastguard Worker return "rgba32f";
526*35238bceSAndroid Build Coastguard Worker case GL_RGBA32I:
527*35238bceSAndroid Build Coastguard Worker return "rgba32i";
528*35238bceSAndroid Build Coastguard Worker case GL_RGBA32UI:
529*35238bceSAndroid Build Coastguard Worker return "rgba32ui";
530*35238bceSAndroid Build Coastguard Worker case GL_RGBA16F:
531*35238bceSAndroid Build Coastguard Worker return "rgba16f";
532*35238bceSAndroid Build Coastguard Worker case GL_RGBA16I:
533*35238bceSAndroid Build Coastguard Worker return "rgba16i";
534*35238bceSAndroid Build Coastguard Worker case GL_RGBA16UI:
535*35238bceSAndroid Build Coastguard Worker return "rgba16ui";
536*35238bceSAndroid Build Coastguard Worker case GL_RGBA8:
537*35238bceSAndroid Build Coastguard Worker return "rgba8";
538*35238bceSAndroid Build Coastguard Worker case GL_RGBA8I:
539*35238bceSAndroid Build Coastguard Worker return "rgba8i";
540*35238bceSAndroid Build Coastguard Worker case GL_RGBA8UI:
541*35238bceSAndroid Build Coastguard Worker return "rgba8ui";
542*35238bceSAndroid Build Coastguard Worker case GL_SRGB8_ALPHA8:
543*35238bceSAndroid Build Coastguard Worker return "srgb8_alpha8";
544*35238bceSAndroid Build Coastguard Worker case GL_RGB10_A2:
545*35238bceSAndroid Build Coastguard Worker return "rgb10_a2";
546*35238bceSAndroid Build Coastguard Worker case GL_RGB10_A2UI:
547*35238bceSAndroid Build Coastguard Worker return "rgb10_a2ui";
548*35238bceSAndroid Build Coastguard Worker case GL_RGBA8_SNORM:
549*35238bceSAndroid Build Coastguard Worker return "rgba8_snorm";
550*35238bceSAndroid Build Coastguard Worker case GL_RGB8:
551*35238bceSAndroid Build Coastguard Worker return "rgb8";
552*35238bceSAndroid Build Coastguard Worker case GL_R11F_G11F_B10F:
553*35238bceSAndroid Build Coastguard Worker return "r11f_g11f_b10f";
554*35238bceSAndroid Build Coastguard Worker case GL_RGB32F:
555*35238bceSAndroid Build Coastguard Worker return "rgb32f";
556*35238bceSAndroid Build Coastguard Worker case GL_RGB32I:
557*35238bceSAndroid Build Coastguard Worker return "rgb32i";
558*35238bceSAndroid Build Coastguard Worker case GL_RGB32UI:
559*35238bceSAndroid Build Coastguard Worker return "rgb32ui";
560*35238bceSAndroid Build Coastguard Worker case GL_RGB16F:
561*35238bceSAndroid Build Coastguard Worker return "rgb16f";
562*35238bceSAndroid Build Coastguard Worker case GL_RGB16I:
563*35238bceSAndroid Build Coastguard Worker return "rgb16i";
564*35238bceSAndroid Build Coastguard Worker case GL_RGB16UI:
565*35238bceSAndroid Build Coastguard Worker return "rgb16ui";
566*35238bceSAndroid Build Coastguard Worker case GL_RGB8_SNORM:
567*35238bceSAndroid Build Coastguard Worker return "rgb8_snorm";
568*35238bceSAndroid Build Coastguard Worker case GL_RGB8I:
569*35238bceSAndroid Build Coastguard Worker return "rgb8i";
570*35238bceSAndroid Build Coastguard Worker case GL_RGB8UI:
571*35238bceSAndroid Build Coastguard Worker return "rgb8ui";
572*35238bceSAndroid Build Coastguard Worker case GL_SRGB8:
573*35238bceSAndroid Build Coastguard Worker return "srgb8";
574*35238bceSAndroid Build Coastguard Worker case GL_RGB9_E5:
575*35238bceSAndroid Build Coastguard Worker return "rgb9_e5";
576*35238bceSAndroid Build Coastguard Worker case GL_RG32F:
577*35238bceSAndroid Build Coastguard Worker return "rg32f";
578*35238bceSAndroid Build Coastguard Worker case GL_RG32I:
579*35238bceSAndroid Build Coastguard Worker return "rg32i";
580*35238bceSAndroid Build Coastguard Worker case GL_RG32UI:
581*35238bceSAndroid Build Coastguard Worker return "rg32ui";
582*35238bceSAndroid Build Coastguard Worker case GL_RG16F:
583*35238bceSAndroid Build Coastguard Worker return "rg16f";
584*35238bceSAndroid Build Coastguard Worker case GL_RG16I:
585*35238bceSAndroid Build Coastguard Worker return "rg16i";
586*35238bceSAndroid Build Coastguard Worker case GL_RG16UI:
587*35238bceSAndroid Build Coastguard Worker return "rg16ui";
588*35238bceSAndroid Build Coastguard Worker case GL_RG8:
589*35238bceSAndroid Build Coastguard Worker return "rg8";
590*35238bceSAndroid Build Coastguard Worker case GL_RG8I:
591*35238bceSAndroid Build Coastguard Worker return "rg8i";
592*35238bceSAndroid Build Coastguard Worker case GL_RG8UI:
593*35238bceSAndroid Build Coastguard Worker return "rg8ui";
594*35238bceSAndroid Build Coastguard Worker case GL_RG8_SNORM:
595*35238bceSAndroid Build Coastguard Worker return "rg8_snorm";
596*35238bceSAndroid Build Coastguard Worker case GL_R32F:
597*35238bceSAndroid Build Coastguard Worker return "r32f";
598*35238bceSAndroid Build Coastguard Worker case GL_R32I:
599*35238bceSAndroid Build Coastguard Worker return "r32i";
600*35238bceSAndroid Build Coastguard Worker case GL_R32UI:
601*35238bceSAndroid Build Coastguard Worker return "r32ui";
602*35238bceSAndroid Build Coastguard Worker case GL_R16F:
603*35238bceSAndroid Build Coastguard Worker return "r16f";
604*35238bceSAndroid Build Coastguard Worker case GL_R16I:
605*35238bceSAndroid Build Coastguard Worker return "r16i";
606*35238bceSAndroid Build Coastguard Worker case GL_R16UI:
607*35238bceSAndroid Build Coastguard Worker return "r16ui";
608*35238bceSAndroid Build Coastguard Worker case GL_R8:
609*35238bceSAndroid Build Coastguard Worker return "r8";
610*35238bceSAndroid Build Coastguard Worker case GL_R8I:
611*35238bceSAndroid Build Coastguard Worker return "r8i";
612*35238bceSAndroid Build Coastguard Worker case GL_R8UI:
613*35238bceSAndroid Build Coastguard Worker return "r8ui";
614*35238bceSAndroid Build Coastguard Worker case GL_R8_SNORM:
615*35238bceSAndroid Build Coastguard Worker return "r8_snorm";
616*35238bceSAndroid Build Coastguard Worker case GL_DEPTH_COMPONENT32F:
617*35238bceSAndroid Build Coastguard Worker return "depth_component32f";
618*35238bceSAndroid Build Coastguard Worker case GL_DEPTH_COMPONENT24:
619*35238bceSAndroid Build Coastguard Worker return "depth_component24";
620*35238bceSAndroid Build Coastguard Worker case GL_DEPTH32F_STENCIL8:
621*35238bceSAndroid Build Coastguard Worker return "depth32f_stencil8";
622*35238bceSAndroid Build Coastguard Worker case GL_DEPTH24_STENCIL8:
623*35238bceSAndroid Build Coastguard Worker return "depth24_stencil8";
624*35238bceSAndroid Build Coastguard Worker case GL_R16:
625*35238bceSAndroid Build Coastguard Worker return "r16";
626*35238bceSAndroid Build Coastguard Worker case GL_RG16:
627*35238bceSAndroid Build Coastguard Worker return "rg16";
628*35238bceSAndroid Build Coastguard Worker case GL_RGBA16:
629*35238bceSAndroid Build Coastguard Worker return "rgba16";
630*35238bceSAndroid Build Coastguard Worker
631*35238bceSAndroid Build Coastguard Worker default:
632*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Unknown format");
633*35238bceSAndroid Build Coastguard Worker }
634*35238bceSAndroid Build Coastguard Worker }
635*35238bceSAndroid Build Coastguard Worker
getFragmentOutputType(const tcu::TextureFormat & format)636*35238bceSAndroid Build Coastguard Worker glu::DataType getFragmentOutputType(const tcu::TextureFormat &format)
637*35238bceSAndroid Build Coastguard Worker {
638*35238bceSAndroid Build Coastguard Worker switch (tcu::getTextureChannelClass(format.type))
639*35238bceSAndroid Build Coastguard Worker {
640*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
641*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
642*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
643*35238bceSAndroid Build Coastguard Worker return glu::TYPE_FLOAT_VEC4;
644*35238bceSAndroid Build Coastguard Worker
645*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
646*35238bceSAndroid Build Coastguard Worker return glu::TYPE_UINT_VEC4;
647*35238bceSAndroid Build Coastguard Worker
648*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
649*35238bceSAndroid Build Coastguard Worker return glu::TYPE_INT_VEC4;
650*35238bceSAndroid Build Coastguard Worker
651*35238bceSAndroid Build Coastguard Worker default:
652*35238bceSAndroid Build Coastguard Worker DE_FATAL("Unknown format");
653*35238bceSAndroid Build Coastguard Worker return glu::TYPE_LAST;
654*35238bceSAndroid Build Coastguard Worker }
655*35238bceSAndroid Build Coastguard Worker }
656*35238bceSAndroid Build Coastguard Worker
getFramebufferReadFormat(const tcu::TextureFormat & format)657*35238bceSAndroid Build Coastguard Worker tcu::TextureFormat getFramebufferReadFormat(const tcu::TextureFormat &format)
658*35238bceSAndroid Build Coastguard Worker {
659*35238bceSAndroid Build Coastguard Worker switch (tcu::getTextureChannelClass(format.type))
660*35238bceSAndroid Build Coastguard Worker {
661*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
662*35238bceSAndroid Build Coastguard Worker return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT);
663*35238bceSAndroid Build Coastguard Worker
664*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
665*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
666*35238bceSAndroid Build Coastguard Worker {
667*35238bceSAndroid Build Coastguard Worker if (format.type == tcu::TextureFormat::UNORM_INT16 || format.type == tcu::TextureFormat::SNORM_INT16)
668*35238bceSAndroid Build Coastguard Worker return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT16);
669*35238bceSAndroid Build Coastguard Worker else
670*35238bceSAndroid Build Coastguard Worker return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
671*35238bceSAndroid Build Coastguard Worker }
672*35238bceSAndroid Build Coastguard Worker
673*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
674*35238bceSAndroid Build Coastguard Worker return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32);
675*35238bceSAndroid Build Coastguard Worker
676*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
677*35238bceSAndroid Build Coastguard Worker return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32);
678*35238bceSAndroid Build Coastguard Worker
679*35238bceSAndroid Build Coastguard Worker default:
680*35238bceSAndroid Build Coastguard Worker DE_FATAL("Unknown format");
681*35238bceSAndroid Build Coastguard Worker return tcu::TextureFormat();
682*35238bceSAndroid Build Coastguard Worker }
683*35238bceSAndroid Build Coastguard Worker }
684*35238bceSAndroid Build Coastguard Worker
calculateU8ConversionError(int srcBits)685*35238bceSAndroid Build Coastguard Worker static int calculateU8ConversionError(int srcBits)
686*35238bceSAndroid Build Coastguard Worker {
687*35238bceSAndroid Build Coastguard Worker if (srcBits > 0)
688*35238bceSAndroid Build Coastguard Worker {
689*35238bceSAndroid Build Coastguard Worker const int clampedBits = de::clamp<int>(srcBits, 0, 8);
690*35238bceSAndroid Build Coastguard Worker const int srcMaxValue = de::max((1 << clampedBits) - 1, 1);
691*35238bceSAndroid Build Coastguard Worker const int error = int(deFloatCeil(255.0f * 2.0f / float(srcMaxValue)));
692*35238bceSAndroid Build Coastguard Worker
693*35238bceSAndroid Build Coastguard Worker return de::clamp<int>(error, 0, 255);
694*35238bceSAndroid Build Coastguard Worker }
695*35238bceSAndroid Build Coastguard Worker else
696*35238bceSAndroid Build Coastguard Worker return 1;
697*35238bceSAndroid Build Coastguard Worker }
698*35238bceSAndroid Build Coastguard Worker
getFormatThreshold(const tcu::TextureFormat & format)699*35238bceSAndroid Build Coastguard Worker tcu::RGBA getFormatThreshold(const tcu::TextureFormat &format)
700*35238bceSAndroid Build Coastguard Worker {
701*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 bits = tcu::getTextureFormatBitDepth(format);
702*35238bceSAndroid Build Coastguard Worker
703*35238bceSAndroid Build Coastguard Worker return tcu::RGBA(calculateU8ConversionError(bits.x()), calculateU8ConversionError(bits.y()),
704*35238bceSAndroid Build Coastguard Worker calculateU8ConversionError(bits.z()), calculateU8ConversionError(bits.w()));
705*35238bceSAndroid Build Coastguard Worker }
706*35238bceSAndroid Build Coastguard Worker
getFormatThreshold(uint32_t glFormat)707*35238bceSAndroid Build Coastguard Worker tcu::RGBA getFormatThreshold(uint32_t glFormat)
708*35238bceSAndroid Build Coastguard Worker {
709*35238bceSAndroid Build Coastguard Worker const tcu::TextureFormat format = glu::mapGLInternalFormat(glFormat);
710*35238bceSAndroid Build Coastguard Worker
711*35238bceSAndroid Build Coastguard Worker return getFormatThreshold(format);
712*35238bceSAndroid Build Coastguard Worker }
713*35238bceSAndroid Build Coastguard Worker
714*35238bceSAndroid Build Coastguard Worker } // namespace FboTestUtil
715*35238bceSAndroid Build Coastguard Worker } // namespace Functional
716*35238bceSAndroid Build Coastguard Worker } // namespace gles31
717*35238bceSAndroid Build Coastguard Worker } // namespace deqp
718