xref: /aosp_15_r20/external/deqp/modules/gles31/functional/es31fFboTestUtil.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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