1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 2.0 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 Varying interpolation accuracy tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es2aVaryingInterpolationTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "glsTextureTestUtil.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "tcuVectorUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "tcuFloat.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "tcuImageCompare.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "tcuSurfaceAccess.hpp"
38*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
39*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
40*35238bceSAndroid Build Coastguard Worker #include "deString.h"
41*35238bceSAndroid Build Coastguard Worker
42*35238bceSAndroid Build Coastguard Worker #include "glw.h"
43*35238bceSAndroid Build Coastguard Worker
44*35238bceSAndroid Build Coastguard Worker using std::map;
45*35238bceSAndroid Build Coastguard Worker using std::string;
46*35238bceSAndroid Build Coastguard Worker using std::vector;
47*35238bceSAndroid Build Coastguard Worker using tcu::SurfaceAccess;
48*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
49*35238bceSAndroid Build Coastguard Worker using tcu::Vec3;
50*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
51*35238bceSAndroid Build Coastguard Worker
52*35238bceSAndroid Build Coastguard Worker namespace deqp
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker namespace gles2
55*35238bceSAndroid Build Coastguard Worker {
56*35238bceSAndroid Build Coastguard Worker namespace Accuracy
57*35238bceSAndroid Build Coastguard Worker {
58*35238bceSAndroid Build Coastguard Worker
projectedTriInterpolate(const tcu::Vec3 & s,const tcu::Vec3 & w,float nx,float ny)59*35238bceSAndroid Build Coastguard Worker static inline float projectedTriInterpolate(const tcu::Vec3 &s, const tcu::Vec3 &w, float nx, float ny)
60*35238bceSAndroid Build Coastguard Worker {
61*35238bceSAndroid Build Coastguard Worker return (s[0] * (1.0f - nx - ny) / w[0] + s[1] * ny / w[1] + s[2] * nx / w[2]) /
62*35238bceSAndroid Build Coastguard Worker ((1.0f - nx - ny) / w[0] + ny / w[1] + nx / w[2]);
63*35238bceSAndroid Build Coastguard Worker }
64*35238bceSAndroid Build Coastguard Worker
renderReference(const SurfaceAccess & dst,const float coords[4* 3],const Vec4 & wCoord,const Vec3 & scale,const Vec3 & bias)65*35238bceSAndroid Build Coastguard Worker static void renderReference(const SurfaceAccess &dst, const float coords[4 * 3], const Vec4 &wCoord, const Vec3 &scale,
66*35238bceSAndroid Build Coastguard Worker const Vec3 &bias)
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker float dstW = (float)dst.getWidth();
69*35238bceSAndroid Build Coastguard Worker float dstH = (float)dst.getHeight();
70*35238bceSAndroid Build Coastguard Worker
71*35238bceSAndroid Build Coastguard Worker Vec3 triR[2] = {Vec3(coords[0 * 3 + 0], coords[1 * 3 + 0], coords[2 * 3 + 0]),
72*35238bceSAndroid Build Coastguard Worker Vec3(coords[3 * 3 + 0], coords[2 * 3 + 0], coords[1 * 3 + 0])};
73*35238bceSAndroid Build Coastguard Worker Vec3 triG[2] = {Vec3(coords[0 * 3 + 1], coords[1 * 3 + 1], coords[2 * 3 + 1]),
74*35238bceSAndroid Build Coastguard Worker Vec3(coords[3 * 3 + 1], coords[2 * 3 + 1], coords[1 * 3 + 1])};
75*35238bceSAndroid Build Coastguard Worker Vec3 triB[2] = {Vec3(coords[0 * 3 + 2], coords[1 * 3 + 2], coords[2 * 3 + 2]),
76*35238bceSAndroid Build Coastguard Worker Vec3(coords[3 * 3 + 2], coords[2 * 3 + 2], coords[1 * 3 + 2])};
77*35238bceSAndroid Build Coastguard Worker tcu::Vec3 triW[2] = {wCoord.swizzle(0, 1, 2), wCoord.swizzle(3, 2, 1)};
78*35238bceSAndroid Build Coastguard Worker
79*35238bceSAndroid Build Coastguard Worker for (int py = 0; py < dst.getHeight(); py++)
80*35238bceSAndroid Build Coastguard Worker {
81*35238bceSAndroid Build Coastguard Worker for (int px = 0; px < dst.getWidth(); px++)
82*35238bceSAndroid Build Coastguard Worker {
83*35238bceSAndroid Build Coastguard Worker float wx = (float)px + 0.5f;
84*35238bceSAndroid Build Coastguard Worker float wy = (float)py + 0.5f;
85*35238bceSAndroid Build Coastguard Worker float nx = wx / dstW;
86*35238bceSAndroid Build Coastguard Worker float ny = wy / dstH;
87*35238bceSAndroid Build Coastguard Worker
88*35238bceSAndroid Build Coastguard Worker int triNdx = nx + ny >= 1.0f ? 1 : 0;
89*35238bceSAndroid Build Coastguard Worker float triNx = triNdx ? 1.0f - nx : nx;
90*35238bceSAndroid Build Coastguard Worker float triNy = triNdx ? 1.0f - ny : ny;
91*35238bceSAndroid Build Coastguard Worker
92*35238bceSAndroid Build Coastguard Worker float r = projectedTriInterpolate(triR[triNdx], triW[triNdx], triNx, triNy) * scale[0] + bias[0];
93*35238bceSAndroid Build Coastguard Worker float g = projectedTriInterpolate(triG[triNdx], triW[triNdx], triNx, triNy) * scale[1] + bias[1];
94*35238bceSAndroid Build Coastguard Worker float b = projectedTriInterpolate(triB[triNdx], triW[triNdx], triNx, triNy) * scale[2] + bias[2];
95*35238bceSAndroid Build Coastguard Worker
96*35238bceSAndroid Build Coastguard Worker Vec4 color = Vec4(r, g, b, 1.0f);
97*35238bceSAndroid Build Coastguard Worker
98*35238bceSAndroid Build Coastguard Worker dst.setPixel(color, px, py);
99*35238bceSAndroid Build Coastguard Worker }
100*35238bceSAndroid Build Coastguard Worker }
101*35238bceSAndroid Build Coastguard Worker }
102*35238bceSAndroid Build Coastguard Worker
103*35238bceSAndroid Build Coastguard Worker class InterpolationCase : public TestCase
104*35238bceSAndroid Build Coastguard Worker {
105*35238bceSAndroid Build Coastguard Worker public:
106*35238bceSAndroid Build Coastguard Worker InterpolationCase(Context &context, const char *name, const char *desc, glu::Precision precision,
107*35238bceSAndroid Build Coastguard Worker const tcu::Vec3 &minVal, const tcu::Vec3 &maxVal, bool projective);
108*35238bceSAndroid Build Coastguard Worker ~InterpolationCase(void);
109*35238bceSAndroid Build Coastguard Worker
110*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Worker private:
113*35238bceSAndroid Build Coastguard Worker glu::Precision m_precision;
114*35238bceSAndroid Build Coastguard Worker tcu::Vec3 m_min;
115*35238bceSAndroid Build Coastguard Worker tcu::Vec3 m_max;
116*35238bceSAndroid Build Coastguard Worker bool m_projective;
117*35238bceSAndroid Build Coastguard Worker };
118*35238bceSAndroid Build Coastguard Worker
InterpolationCase(Context & context,const char * name,const char * desc,glu::Precision precision,const tcu::Vec3 & minVal,const tcu::Vec3 & maxVal,bool projective)119*35238bceSAndroid Build Coastguard Worker InterpolationCase::InterpolationCase(Context &context, const char *name, const char *desc, glu::Precision precision,
120*35238bceSAndroid Build Coastguard Worker const tcu::Vec3 &minVal, const tcu::Vec3 &maxVal, bool projective)
121*35238bceSAndroid Build Coastguard Worker : TestCase(context, tcu::NODETYPE_ACCURACY, name, desc)
122*35238bceSAndroid Build Coastguard Worker , m_precision(precision)
123*35238bceSAndroid Build Coastguard Worker , m_min(minVal)
124*35238bceSAndroid Build Coastguard Worker , m_max(maxVal)
125*35238bceSAndroid Build Coastguard Worker , m_projective(projective)
126*35238bceSAndroid Build Coastguard Worker {
127*35238bceSAndroid Build Coastguard Worker }
128*35238bceSAndroid Build Coastguard Worker
~InterpolationCase(void)129*35238bceSAndroid Build Coastguard Worker InterpolationCase::~InterpolationCase(void)
130*35238bceSAndroid Build Coastguard Worker {
131*35238bceSAndroid Build Coastguard Worker }
132*35238bceSAndroid Build Coastguard Worker
isValidFloat(glu::Precision precision,float val)133*35238bceSAndroid Build Coastguard Worker static bool isValidFloat(glu::Precision precision, float val)
134*35238bceSAndroid Build Coastguard Worker {
135*35238bceSAndroid Build Coastguard Worker if (precision == glu::PRECISION_MEDIUMP)
136*35238bceSAndroid Build Coastguard Worker {
137*35238bceSAndroid Build Coastguard Worker tcu::Float16 fp16(val);
138*35238bceSAndroid Build Coastguard Worker return !fp16.isDenorm() && !fp16.isInf() && !fp16.isNaN();
139*35238bceSAndroid Build Coastguard Worker }
140*35238bceSAndroid Build Coastguard Worker else
141*35238bceSAndroid Build Coastguard Worker {
142*35238bceSAndroid Build Coastguard Worker tcu::Float32 fp32(val);
143*35238bceSAndroid Build Coastguard Worker return !fp32.isDenorm() && !fp32.isInf() && !fp32.isNaN();
144*35238bceSAndroid Build Coastguard Worker }
145*35238bceSAndroid Build Coastguard Worker }
146*35238bceSAndroid Build Coastguard Worker
147*35238bceSAndroid Build Coastguard Worker template <int Size>
isValidFloatVec(glu::Precision precision,const tcu::Vector<float,Size> & vec)148*35238bceSAndroid Build Coastguard Worker static bool isValidFloatVec(glu::Precision precision, const tcu::Vector<float, Size> &vec)
149*35238bceSAndroid Build Coastguard Worker {
150*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < Size; ndx++)
151*35238bceSAndroid Build Coastguard Worker {
152*35238bceSAndroid Build Coastguard Worker if (!isValidFloat(precision, vec[ndx]))
153*35238bceSAndroid Build Coastguard Worker return false;
154*35238bceSAndroid Build Coastguard Worker }
155*35238bceSAndroid Build Coastguard Worker return true;
156*35238bceSAndroid Build Coastguard Worker }
157*35238bceSAndroid Build Coastguard Worker
iterate(void)158*35238bceSAndroid Build Coastguard Worker InterpolationCase::IterateResult InterpolationCase::iterate(void)
159*35238bceSAndroid Build Coastguard Worker {
160*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
161*35238bceSAndroid Build Coastguard Worker de::Random rnd(deStringHash(getName()));
162*35238bceSAndroid Build Coastguard Worker int viewportWidth = 128;
163*35238bceSAndroid Build Coastguard Worker int viewportHeight = 128;
164*35238bceSAndroid Build Coastguard Worker
165*35238bceSAndroid Build Coastguard Worker if (m_context.getRenderTarget().getWidth() < viewportWidth ||
166*35238bceSAndroid Build Coastguard Worker m_context.getRenderTarget().getHeight() < viewportHeight)
167*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Too small viewport", "", __FILE__, __LINE__);
168*35238bceSAndroid Build Coastguard Worker
169*35238bceSAndroid Build Coastguard Worker int viewportX = rnd.getInt(0, m_context.getRenderTarget().getWidth() - viewportWidth);
170*35238bceSAndroid Build Coastguard Worker int viewportY = rnd.getInt(0, m_context.getRenderTarget().getHeight() - viewportHeight);
171*35238bceSAndroid Build Coastguard Worker
172*35238bceSAndroid Build Coastguard Worker static const char *s_vertShaderTemplate = "attribute highp vec4 a_position;\n"
173*35238bceSAndroid Build Coastguard Worker "attribute ${PRECISION} vec3 a_coords;\n"
174*35238bceSAndroid Build Coastguard Worker "varying ${PRECISION} vec3 v_coords;\n"
175*35238bceSAndroid Build Coastguard Worker "\n"
176*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
177*35238bceSAndroid Build Coastguard Worker "{\n"
178*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
179*35238bceSAndroid Build Coastguard Worker " v_coords = a_coords;\n"
180*35238bceSAndroid Build Coastguard Worker "}\n";
181*35238bceSAndroid Build Coastguard Worker static const char *s_fragShaderTemplate = "varying ${PRECISION} vec3 v_coords;\n"
182*35238bceSAndroid Build Coastguard Worker "uniform ${PRECISION} vec3 u_scale;\n"
183*35238bceSAndroid Build Coastguard Worker "uniform ${PRECISION} vec3 u_bias;\n"
184*35238bceSAndroid Build Coastguard Worker "\n"
185*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
186*35238bceSAndroid Build Coastguard Worker "{\n"
187*35238bceSAndroid Build Coastguard Worker " gl_FragColor = vec4(v_coords * u_scale + u_bias, 1.0);\n"
188*35238bceSAndroid Build Coastguard Worker "}\n";
189*35238bceSAndroid Build Coastguard Worker
190*35238bceSAndroid Build Coastguard Worker map<string, string> templateParams;
191*35238bceSAndroid Build Coastguard Worker templateParams["PRECISION"] = glu::getPrecisionName(m_precision);
192*35238bceSAndroid Build Coastguard Worker
193*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(
194*35238bceSAndroid Build Coastguard Worker m_context.getRenderContext(),
195*35238bceSAndroid Build Coastguard Worker glu::makeVtxFragSources(tcu::StringTemplate(s_vertShaderTemplate).specialize(templateParams),
196*35238bceSAndroid Build Coastguard Worker tcu::StringTemplate(s_fragShaderTemplate).specialize(templateParams)));
197*35238bceSAndroid Build Coastguard Worker log << program;
198*35238bceSAndroid Build Coastguard Worker if (!program.isOk())
199*35238bceSAndroid Build Coastguard Worker {
200*35238bceSAndroid Build Coastguard Worker if (m_precision == glu::PRECISION_HIGHP && !m_context.getContextInfo().isFragmentHighPrecisionSupported())
201*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Fragment highp not supported");
202*35238bceSAndroid Build Coastguard Worker else
203*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Compile failed");
204*35238bceSAndroid Build Coastguard Worker return STOP;
205*35238bceSAndroid Build Coastguard Worker }
206*35238bceSAndroid Build Coastguard Worker
207*35238bceSAndroid Build Coastguard Worker // Position coordinates.
208*35238bceSAndroid Build Coastguard Worker Vec4 wCoord = m_projective ? Vec4(1.3f, 0.8f, 0.6f, 2.0f) : Vec4(1.0f, 1.0f, 1.0f, 1.0f);
209*35238bceSAndroid Build Coastguard Worker float positions[] = {-1.0f * wCoord.x(), -1.0f * wCoord.x(), 0.0f, wCoord.x(),
210*35238bceSAndroid Build Coastguard Worker -1.0f * wCoord.y(), +1.0f * wCoord.y(), 0.0f, wCoord.y(),
211*35238bceSAndroid Build Coastguard Worker +1.0f * wCoord.z(), -1.0f * wCoord.z(), 0.0f, wCoord.z(),
212*35238bceSAndroid Build Coastguard Worker +1.0f * wCoord.w(), +1.0f * wCoord.w(), 0.0f, wCoord.w()};
213*35238bceSAndroid Build Coastguard Worker
214*35238bceSAndroid Build Coastguard Worker // Coordinates for interpolation.
215*35238bceSAndroid Build Coastguard Worker tcu::Vec3 scale = 1.0f / (m_max - m_min);
216*35238bceSAndroid Build Coastguard Worker tcu::Vec3 bias = -1.0f * m_min * scale;
217*35238bceSAndroid Build Coastguard Worker float coords[] = {(0.0f - bias[0]) / scale[0], (0.5f - bias[1]) / scale[1], (1.0f - bias[2]) / scale[2],
218*35238bceSAndroid Build Coastguard Worker (0.5f - bias[0]) / scale[0], (1.0f - bias[1]) / scale[1], (0.5f - bias[2]) / scale[2],
219*35238bceSAndroid Build Coastguard Worker (0.5f - bias[0]) / scale[0], (0.0f - bias[1]) / scale[1], (0.5f - bias[2]) / scale[2],
220*35238bceSAndroid Build Coastguard Worker (1.0f - bias[0]) / scale[0], (0.5f - bias[1]) / scale[1], (0.0f - bias[2]) / scale[2]};
221*35238bceSAndroid Build Coastguard Worker
222*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "a_coords = " << ((tcu::Vec3(0.0f) - bias) / scale) << " -> "
223*35238bceSAndroid Build Coastguard Worker << ((tcu::Vec3(1.0f) - bias) / scale) << TestLog::EndMessage;
224*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "u_scale = " << scale << TestLog::EndMessage;
225*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "u_bias = " << bias << TestLog::EndMessage;
226*35238bceSAndroid Build Coastguard Worker
227*35238bceSAndroid Build Coastguard Worker // Verify that none of the inputs are denormalized / inf / nan.
228*35238bceSAndroid Build Coastguard Worker TCU_CHECK(isValidFloatVec(m_precision, scale));
229*35238bceSAndroid Build Coastguard Worker TCU_CHECK(isValidFloatVec(m_precision, bias));
230*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(coords); ndx++)
231*35238bceSAndroid Build Coastguard Worker {
232*35238bceSAndroid Build Coastguard Worker TCU_CHECK(isValidFloat(m_precision, coords[ndx]));
233*35238bceSAndroid Build Coastguard Worker TCU_CHECK(isValidFloat(m_precision, coords[ndx] * scale[ndx % 3] + bias[ndx % 3]));
234*35238bceSAndroid Build Coastguard Worker }
235*35238bceSAndroid Build Coastguard Worker
236*35238bceSAndroid Build Coastguard Worker // Indices.
237*35238bceSAndroid Build Coastguard Worker static const uint16_t indices[] = {0, 1, 2, 2, 1, 3};
238*35238bceSAndroid Build Coastguard Worker
239*35238bceSAndroid Build Coastguard Worker {
240*35238bceSAndroid Build Coastguard Worker const int posLoc = glGetAttribLocation(program.getProgram(), "a_position");
241*35238bceSAndroid Build Coastguard Worker const int coordLoc = glGetAttribLocation(program.getProgram(), "a_coords");
242*35238bceSAndroid Build Coastguard Worker
243*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(posLoc);
244*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(posLoc, 4, GL_FLOAT, GL_FALSE, 0, &positions[0]);
245*35238bceSAndroid Build Coastguard Worker
246*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(coordLoc);
247*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(coordLoc, 3, GL_FLOAT, GL_FALSE, 0, &coords[0]);
248*35238bceSAndroid Build Coastguard Worker }
249*35238bceSAndroid Build Coastguard Worker
250*35238bceSAndroid Build Coastguard Worker glUseProgram(program.getProgram());
251*35238bceSAndroid Build Coastguard Worker glUniform3f(glGetUniformLocation(program.getProgram(), "u_scale"), scale.x(), scale.y(), scale.z());
252*35238bceSAndroid Build Coastguard Worker glUniform3f(glGetUniformLocation(program.getProgram(), "u_bias"), bias.x(), bias.y(), bias.z());
253*35238bceSAndroid Build Coastguard Worker
254*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("After program setup");
255*35238bceSAndroid Build Coastguard Worker
256*35238bceSAndroid Build Coastguard Worker // Frames.
257*35238bceSAndroid Build Coastguard Worker tcu::Surface rendered(viewportWidth, viewportHeight);
258*35238bceSAndroid Build Coastguard Worker tcu::Surface reference(viewportWidth, viewportHeight);
259*35238bceSAndroid Build Coastguard Worker
260*35238bceSAndroid Build Coastguard Worker // Render with GL.
261*35238bceSAndroid Build Coastguard Worker glViewport(viewportX, viewportY, viewportWidth, viewportHeight);
262*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, DE_LENGTH_OF_ARRAY(indices), GL_UNSIGNED_SHORT, &indices[0]);
263*35238bceSAndroid Build Coastguard Worker
264*35238bceSAndroid Build Coastguard Worker // Render reference \note While GPU is hopefully doing our draw call.
265*35238bceSAndroid Build Coastguard Worker renderReference(SurfaceAccess(reference, m_context.getRenderTarget().getPixelFormat()), coords, wCoord, scale,
266*35238bceSAndroid Build Coastguard Worker bias);
267*35238bceSAndroid Build Coastguard Worker
268*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), viewportX, viewportY, rendered.getAccess());
269*35238bceSAndroid Build Coastguard Worker
270*35238bceSAndroid Build Coastguard Worker // Compute difference.
271*35238bceSAndroid Build Coastguard Worker const int bestScoreDiff = 16;
272*35238bceSAndroid Build Coastguard Worker const int worstScoreDiff = 300;
273*35238bceSAndroid Build Coastguard Worker int score = tcu::measurePixelDiffAccuracy(log, "Result", "Image comparison result", reference, rendered,
274*35238bceSAndroid Build Coastguard Worker bestScoreDiff, worstScoreDiff, tcu::COMPARE_LOG_EVERYTHING);
275*35238bceSAndroid Build Coastguard Worker
276*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, de::toString(score).c_str());
277*35238bceSAndroid Build Coastguard Worker return STOP;
278*35238bceSAndroid Build Coastguard Worker }
279*35238bceSAndroid Build Coastguard Worker
VaryingInterpolationTests(Context & context)280*35238bceSAndroid Build Coastguard Worker VaryingInterpolationTests::VaryingInterpolationTests(Context &context)
281*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "interpolation", "Varying Interpolation Accuracy Tests")
282*35238bceSAndroid Build Coastguard Worker {
283*35238bceSAndroid Build Coastguard Worker }
284*35238bceSAndroid Build Coastguard Worker
~VaryingInterpolationTests(void)285*35238bceSAndroid Build Coastguard Worker VaryingInterpolationTests::~VaryingInterpolationTests(void)
286*35238bceSAndroid Build Coastguard Worker {
287*35238bceSAndroid Build Coastguard Worker }
288*35238bceSAndroid Build Coastguard Worker
init(void)289*35238bceSAndroid Build Coastguard Worker void VaryingInterpolationTests::init(void)
290*35238bceSAndroid Build Coastguard Worker {
291*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(glu::PRECISION_LOWP + 1 == glu::PRECISION_MEDIUMP);
292*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(glu::PRECISION_MEDIUMP + 1 == glu::PRECISION_HIGHP);
293*35238bceSAndroid Build Coastguard Worker
294*35238bceSAndroid Build Coastguard Worker // Exp = Emax-3, Mantissa = 0
295*35238bceSAndroid Build Coastguard Worker float minF32 = tcu::Float32((0u << 31) | (0xfcu << 23) | 0x0u).asFloat();
296*35238bceSAndroid Build Coastguard Worker float maxF32 = tcu::Float32((1u << 31) | (0xfcu << 23) | 0x0u).asFloat();
297*35238bceSAndroid Build Coastguard Worker float minF16 = tcu::Float16((uint16_t)((0u << 15) | (0x1cu << 10) | 0x0u)).asFloat();
298*35238bceSAndroid Build Coastguard Worker float maxF16 = tcu::Float16((uint16_t)((1u << 15) | (0x1cu << 10) | 0x0u)).asFloat();
299*35238bceSAndroid Build Coastguard Worker
300*35238bceSAndroid Build Coastguard Worker static const struct
301*35238bceSAndroid Build Coastguard Worker {
302*35238bceSAndroid Build Coastguard Worker const char *name;
303*35238bceSAndroid Build Coastguard Worker Vec3 minVal;
304*35238bceSAndroid Build Coastguard Worker Vec3 maxVal;
305*35238bceSAndroid Build Coastguard Worker glu::Precision minPrecision;
306*35238bceSAndroid Build Coastguard Worker } coordRanges[] = {
307*35238bceSAndroid Build Coastguard Worker {"zero_to_one", Vec3(0.0f, 0.0f, 0.0f), Vec3(1.0f, 1.0f, 1.0f), glu::PRECISION_LOWP},
308*35238bceSAndroid Build Coastguard Worker {"zero_to_minus_one", Vec3(0.0f, 0.0f, 0.0f), Vec3(-1.0f, -1.0f, -1.0f), glu::PRECISION_LOWP},
309*35238bceSAndroid Build Coastguard Worker {"minus_one_to_one", Vec3(-1.0f, -1.0f, -1.0f), Vec3(1.0f, 1.0f, 1.0f), glu::PRECISION_LOWP},
310*35238bceSAndroid Build Coastguard Worker {"minus_ten_to_ten", Vec3(-10.0f, -10.0f, -10.0f), Vec3(10.0f, 10.0f, 10.0f), glu::PRECISION_MEDIUMP},
311*35238bceSAndroid Build Coastguard Worker {"thousands", Vec3(-5e3f, 1e3f, 1e3f), Vec3(3e3f, -1e3f, 7e3f), glu::PRECISION_MEDIUMP},
312*35238bceSAndroid Build Coastguard Worker {"full_mediump", Vec3(minF16, minF16, minF16), Vec3(maxF16, maxF16, maxF16), glu::PRECISION_MEDIUMP},
313*35238bceSAndroid Build Coastguard Worker {"full_highp", Vec3(minF32, minF32, minF32), Vec3(maxF32, maxF32, maxF32), glu::PRECISION_HIGHP},
314*35238bceSAndroid Build Coastguard Worker };
315*35238bceSAndroid Build Coastguard Worker
316*35238bceSAndroid Build Coastguard Worker for (int precision = glu::PRECISION_LOWP; precision <= glu::PRECISION_HIGHP; precision++)
317*35238bceSAndroid Build Coastguard Worker {
318*35238bceSAndroid Build Coastguard Worker for (int coordNdx = 0; coordNdx < DE_LENGTH_OF_ARRAY(coordRanges); coordNdx++)
319*35238bceSAndroid Build Coastguard Worker {
320*35238bceSAndroid Build Coastguard Worker if (precision < (int)coordRanges[coordNdx].minPrecision)
321*35238bceSAndroid Build Coastguard Worker continue;
322*35238bceSAndroid Build Coastguard Worker
323*35238bceSAndroid Build Coastguard Worker string baseName =
324*35238bceSAndroid Build Coastguard Worker string(glu::getPrecisionName((glu::Precision)precision)) + "_" + coordRanges[coordNdx].name;
325*35238bceSAndroid Build Coastguard Worker
326*35238bceSAndroid Build Coastguard Worker addChild(new InterpolationCase(m_context, baseName.c_str(), "", (glu::Precision)precision,
327*35238bceSAndroid Build Coastguard Worker coordRanges[coordNdx].minVal, coordRanges[coordNdx].maxVal, false));
328*35238bceSAndroid Build Coastguard Worker addChild(new InterpolationCase(m_context, (baseName + "_proj").c_str(), "", (glu::Precision)precision,
329*35238bceSAndroid Build Coastguard Worker coordRanges[coordNdx].minVal, coordRanges[coordNdx].maxVal, true));
330*35238bceSAndroid Build Coastguard Worker }
331*35238bceSAndroid Build Coastguard Worker }
332*35238bceSAndroid Build Coastguard Worker }
333*35238bceSAndroid Build Coastguard Worker
334*35238bceSAndroid Build Coastguard Worker } // namespace Accuracy
335*35238bceSAndroid Build Coastguard Worker } // namespace gles2
336*35238bceSAndroid Build Coastguard Worker } // namespace deqp
337