xref: /aosp_15_r20/external/deqp/modules/gles2/functional/es2fShaderAlgorithmTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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 Algorithm implementation tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es2fShaderAlgorithmTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsShaderRenderCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include "deInt32.h"
30*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker #include <map>
33*35238bceSAndroid Build Coastguard Worker #include <algorithm>
34*35238bceSAndroid Build Coastguard Worker 
35*35238bceSAndroid Build Coastguard Worker using namespace std;
36*35238bceSAndroid Build Coastguard Worker using namespace tcu;
37*35238bceSAndroid Build Coastguard Worker using namespace glu;
38*35238bceSAndroid Build Coastguard Worker using namespace deqp::gls;
39*35238bceSAndroid Build Coastguard Worker 
40*35238bceSAndroid Build Coastguard Worker namespace deqp
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker namespace gles2
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker namespace Functional
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker // ShaderAlgorithmCase
48*35238bceSAndroid Build Coastguard Worker 
49*35238bceSAndroid Build Coastguard Worker class ShaderAlgorithmCase : public ShaderRenderCase
50*35238bceSAndroid Build Coastguard Worker {
51*35238bceSAndroid Build Coastguard Worker public:
52*35238bceSAndroid Build Coastguard Worker     ShaderAlgorithmCase(Context &context, const char *name, const char *description, bool isVertexCase,
53*35238bceSAndroid Build Coastguard Worker                         ShaderEvalFunc evalFunc, const char *vertShaderSource, const char *fragShaderSource);
54*35238bceSAndroid Build Coastguard Worker     virtual ~ShaderAlgorithmCase(void);
55*35238bceSAndroid Build Coastguard Worker 
56*35238bceSAndroid Build Coastguard Worker private:
57*35238bceSAndroid Build Coastguard Worker     ShaderAlgorithmCase(const ShaderAlgorithmCase &);            // not allowed!
58*35238bceSAndroid Build Coastguard Worker     ShaderAlgorithmCase &operator=(const ShaderAlgorithmCase &); // not allowed!
59*35238bceSAndroid Build Coastguard Worker };
60*35238bceSAndroid Build Coastguard Worker 
ShaderAlgorithmCase(Context & context,const char * name,const char * description,bool isVertexCase,ShaderEvalFunc evalFunc,const char * vertShaderSource,const char * fragShaderSource)61*35238bceSAndroid Build Coastguard Worker ShaderAlgorithmCase::ShaderAlgorithmCase(Context &context, const char *name, const char *description, bool isVertexCase,
62*35238bceSAndroid Build Coastguard Worker                                          ShaderEvalFunc evalFunc, const char *vertShaderSource,
63*35238bceSAndroid Build Coastguard Worker                                          const char *fragShaderSource)
64*35238bceSAndroid Build Coastguard Worker     : ShaderRenderCase(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name,
65*35238bceSAndroid Build Coastguard Worker                        description, isVertexCase, evalFunc)
66*35238bceSAndroid Build Coastguard Worker {
67*35238bceSAndroid Build Coastguard Worker     m_vertShaderSource = vertShaderSource;
68*35238bceSAndroid Build Coastguard Worker     m_fragShaderSource = fragShaderSource;
69*35238bceSAndroid Build Coastguard Worker }
70*35238bceSAndroid Build Coastguard Worker 
~ShaderAlgorithmCase(void)71*35238bceSAndroid Build Coastguard Worker ShaderAlgorithmCase::~ShaderAlgorithmCase(void)
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker }
74*35238bceSAndroid Build Coastguard Worker 
75*35238bceSAndroid Build Coastguard Worker // Helpers.
76*35238bceSAndroid Build Coastguard Worker 
createExpressionCase(Context & context,const char * caseName,const char * description,bool isVertexCase,ShaderEvalFunc evalFunc,LineStream & shaderBody)77*35238bceSAndroid Build Coastguard Worker static ShaderAlgorithmCase *createExpressionCase(Context &context, const char *caseName, const char *description,
78*35238bceSAndroid Build Coastguard Worker                                                  bool isVertexCase, ShaderEvalFunc evalFunc, LineStream &shaderBody)
79*35238bceSAndroid Build Coastguard Worker {
80*35238bceSAndroid Build Coastguard Worker     std::ostringstream vtx;
81*35238bceSAndroid Build Coastguard Worker     std::ostringstream frag;
82*35238bceSAndroid Build Coastguard Worker     std::ostringstream &op = isVertexCase ? vtx : frag;
83*35238bceSAndroid Build Coastguard Worker 
84*35238bceSAndroid Build Coastguard Worker     vtx << "attribute highp vec4 a_position;\n";
85*35238bceSAndroid Build Coastguard Worker     vtx << "attribute highp vec4 a_unitCoords;\n";
86*35238bceSAndroid Build Coastguard Worker 
87*35238bceSAndroid Build Coastguard Worker     if (isVertexCase)
88*35238bceSAndroid Build Coastguard Worker     {
89*35238bceSAndroid Build Coastguard Worker         vtx << "varying mediump vec3 v_color;\n";
90*35238bceSAndroid Build Coastguard Worker         frag << "varying mediump vec3 v_color;\n";
91*35238bceSAndroid Build Coastguard Worker     }
92*35238bceSAndroid Build Coastguard Worker     else
93*35238bceSAndroid Build Coastguard Worker     {
94*35238bceSAndroid Build Coastguard Worker         vtx << "varying mediump vec4 v_coords;\n";
95*35238bceSAndroid Build Coastguard Worker         frag << "varying mediump vec4 v_coords;\n";
96*35238bceSAndroid Build Coastguard Worker     }
97*35238bceSAndroid Build Coastguard Worker 
98*35238bceSAndroid Build Coastguard Worker     // op << "uniform mediump sampler2D ut_brick;\n";
99*35238bceSAndroid Build Coastguard Worker 
100*35238bceSAndroid Build Coastguard Worker     vtx << "\n";
101*35238bceSAndroid Build Coastguard Worker     vtx << "void main()\n";
102*35238bceSAndroid Build Coastguard Worker     vtx << "{\n";
103*35238bceSAndroid Build Coastguard Worker     vtx << "    gl_Position = a_position;\n";
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker     frag << "\n";
106*35238bceSAndroid Build Coastguard Worker     frag << "void main()\n";
107*35238bceSAndroid Build Coastguard Worker     frag << "{\n";
108*35238bceSAndroid Build Coastguard Worker 
109*35238bceSAndroid Build Coastguard Worker     // Write matrix.
110*35238bceSAndroid Build Coastguard Worker     if (isVertexCase)
111*35238bceSAndroid Build Coastguard Worker         op << "    ${PRECISION} vec4 coords = a_unitCoords;\n";
112*35238bceSAndroid Build Coastguard Worker     else
113*35238bceSAndroid Build Coastguard Worker         op << "    ${PRECISION} vec4 coords = v_coords;\n";
114*35238bceSAndroid Build Coastguard Worker 
115*35238bceSAndroid Build Coastguard Worker     op << "    ${PRECISION} vec3 res = vec3(0.0);\n";
116*35238bceSAndroid Build Coastguard Worker     op << shaderBody.str();
117*35238bceSAndroid Build Coastguard Worker 
118*35238bceSAndroid Build Coastguard Worker     if (isVertexCase)
119*35238bceSAndroid Build Coastguard Worker     {
120*35238bceSAndroid Build Coastguard Worker         vtx << "    v_color = res;\n";
121*35238bceSAndroid Build Coastguard Worker         frag << "    gl_FragColor = vec4(v_color, 1.0);\n";
122*35238bceSAndroid Build Coastguard Worker     }
123*35238bceSAndroid Build Coastguard Worker     else
124*35238bceSAndroid Build Coastguard Worker     {
125*35238bceSAndroid Build Coastguard Worker         vtx << "    v_coords = a_unitCoords;\n";
126*35238bceSAndroid Build Coastguard Worker         frag << "    gl_FragColor = vec4(res, 1.0);\n";
127*35238bceSAndroid Build Coastguard Worker     }
128*35238bceSAndroid Build Coastguard Worker 
129*35238bceSAndroid Build Coastguard Worker     vtx << "}\n";
130*35238bceSAndroid Build Coastguard Worker     frag << "}\n";
131*35238bceSAndroid Build Coastguard Worker 
132*35238bceSAndroid Build Coastguard Worker     // Fill in shader templates.
133*35238bceSAndroid Build Coastguard Worker     map<string, string> params;
134*35238bceSAndroid Build Coastguard Worker     params.insert(pair<string, string>("PRECISION", "mediump"));
135*35238bceSAndroid Build Coastguard Worker 
136*35238bceSAndroid Build Coastguard Worker     StringTemplate vertTemplate(vtx.str().c_str());
137*35238bceSAndroid Build Coastguard Worker     StringTemplate fragTemplate(frag.str().c_str());
138*35238bceSAndroid Build Coastguard Worker     string vertexShaderSource   = vertTemplate.specialize(params);
139*35238bceSAndroid Build Coastguard Worker     string fragmentShaderSource = fragTemplate.specialize(params);
140*35238bceSAndroid Build Coastguard Worker 
141*35238bceSAndroid Build Coastguard Worker     return new ShaderAlgorithmCase(context, caseName, description, isVertexCase, evalFunc, vertexShaderSource.c_str(),
142*35238bceSAndroid Build Coastguard Worker                                    fragmentShaderSource.c_str());
143*35238bceSAndroid Build Coastguard Worker }
144*35238bceSAndroid Build Coastguard Worker 
145*35238bceSAndroid Build Coastguard Worker // ShaderAlgorithmTests.
146*35238bceSAndroid Build Coastguard Worker 
ShaderAlgorithmTests(Context & context)147*35238bceSAndroid Build Coastguard Worker ShaderAlgorithmTests::ShaderAlgorithmTests(Context &context)
148*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "algorithm", "Miscellaneous algorithm implementations using shaders.")
149*35238bceSAndroid Build Coastguard Worker {
150*35238bceSAndroid Build Coastguard Worker }
151*35238bceSAndroid Build Coastguard Worker 
~ShaderAlgorithmTests(void)152*35238bceSAndroid Build Coastguard Worker ShaderAlgorithmTests::~ShaderAlgorithmTests(void)
153*35238bceSAndroid Build Coastguard Worker {
154*35238bceSAndroid Build Coastguard Worker }
155*35238bceSAndroid Build Coastguard Worker 
init(void)156*35238bceSAndroid Build Coastguard Worker void ShaderAlgorithmTests::init(void)
157*35238bceSAndroid Build Coastguard Worker {
158*35238bceSAndroid Build Coastguard Worker     // TestCaseGroup* colorGroup = new TestCaseGroup(m_testCtx, "color", "Miscellaneous color related algorithm tests.");
159*35238bceSAndroid Build Coastguard Worker     // addChild(colorGroup);
160*35238bceSAndroid Build Coastguard Worker 
161*35238bceSAndroid Build Coastguard Worker #define SHADER_OP_CASE(NAME, DESCRIPTION, SHADER_OP, EVAL_FUNC_BODY)                                                  \
162*35238bceSAndroid Build Coastguard Worker     do                                                                                                                \
163*35238bceSAndroid Build Coastguard Worker     {                                                                                                                 \
164*35238bceSAndroid Build Coastguard Worker         struct Eval_##NAME                                                                                            \
165*35238bceSAndroid Build Coastguard Worker         {                                                                                                             \
166*35238bceSAndroid Build Coastguard Worker             static void eval(ShaderEvalContext &c) EVAL_FUNC_BODY                                                     \
167*35238bceSAndroid Build Coastguard Worker         }; /* NOLINT(EVAL_FUNC_BODY) */                                                                               \
168*35238bceSAndroid Build Coastguard Worker         addChild(createExpressionCase(m_context, #NAME "_vertex", DESCRIPTION, true, &Eval_##NAME::eval, SHADER_OP)); \
169*35238bceSAndroid Build Coastguard Worker         addChild(                                                                                                     \
170*35238bceSAndroid Build Coastguard Worker             createExpressionCase(m_context, #NAME "_fragment", DESCRIPTION, false, &Eval_##NAME::eval, SHADER_OP));   \
171*35238bceSAndroid Build Coastguard Worker     } while (false)
172*35238bceSAndroid Build Coastguard Worker 
173*35238bceSAndroid Build Coastguard Worker     SHADER_OP_CASE(hsl_to_rgb, "Conversion from HSL color space into RGB.",
174*35238bceSAndroid Build Coastguard Worker                    LineStream(1) << "mediump float H = coords.x, S = coords.y, L = coords.z;"
175*35238bceSAndroid Build Coastguard Worker                                  << "mediump float v = (L <= 0.5) ? (L * (1.0 + S)) : (L + S - L * S);"
176*35238bceSAndroid Build Coastguard Worker                                  << "res = vec3(L); // default to gray"
177*35238bceSAndroid Build Coastguard Worker                                  << "if (v > 0.0)"
178*35238bceSAndroid Build Coastguard Worker                                  << "{"
179*35238bceSAndroid Build Coastguard Worker                                  << "    mediump float m = L + L - v;"
180*35238bceSAndroid Build Coastguard Worker                                  << "    mediump float sv = (v - m) / v;"
181*35238bceSAndroid Build Coastguard Worker                                  << "    H *= 6.0;"
182*35238bceSAndroid Build Coastguard Worker                                  << "    mediump int sextant = int(H);"
183*35238bceSAndroid Build Coastguard Worker                                  << "    mediump float fract = H - float(sextant);"
184*35238bceSAndroid Build Coastguard Worker                                  << "    mediump float vsf = v * sv * fract;"
185*35238bceSAndroid Build Coastguard Worker                                  << "    mediump float mid1 = m + vsf;"
186*35238bceSAndroid Build Coastguard Worker                                  << "    mediump float mid2 = m - vsf;"
187*35238bceSAndroid Build Coastguard Worker                                  << "    if (sextant == 0)      res = vec3(v, mid1, m);"
188*35238bceSAndroid Build Coastguard Worker                                  << "    else if (sextant == 1) res = vec3(mid2, v, m);"
189*35238bceSAndroid Build Coastguard Worker                                  << "    else if (sextant == 2) res = vec3(m, v, mid1);"
190*35238bceSAndroid Build Coastguard Worker                                  << "    else if (sextant == 3) res = vec3(m, mid2, v);"
191*35238bceSAndroid Build Coastguard Worker                                  << "    else if (sextant == 4) res = vec3(mid1, m, v);"
192*35238bceSAndroid Build Coastguard Worker                                  << "    else                   res = vec3(v, m, mid2);"
193*35238bceSAndroid Build Coastguard Worker                                  << "}",
194*35238bceSAndroid Build Coastguard Worker                    {
195*35238bceSAndroid Build Coastguard Worker                        float H  = c.unitCoords.x();
196*35238bceSAndroid Build Coastguard Worker                        float S  = c.unitCoords.y();
197*35238bceSAndroid Build Coastguard Worker                        float L  = c.unitCoords.z();
198*35238bceSAndroid Build Coastguard Worker                        Vec3 rgb = Vec3(L);
199*35238bceSAndroid Build Coastguard Worker                        float v  = (L <= 0.5f) ? (L * (1.0f + S)) : (L + S - L * S);
200*35238bceSAndroid Build Coastguard Worker                        if (v > 0.0f)
201*35238bceSAndroid Build Coastguard Worker                        {
202*35238bceSAndroid Build Coastguard Worker                            float m  = L + L - v;
203*35238bceSAndroid Build Coastguard Worker                            float sv = (v - m) / v;
204*35238bceSAndroid Build Coastguard Worker                            H *= 6.0f;
205*35238bceSAndroid Build Coastguard Worker                            int sextant = int(H);
206*35238bceSAndroid Build Coastguard Worker                            float fract = H - float(sextant);
207*35238bceSAndroid Build Coastguard Worker                            float vsf   = v * sv * fract;
208*35238bceSAndroid Build Coastguard Worker                            float mid1  = m + vsf;
209*35238bceSAndroid Build Coastguard Worker                            float mid2  = m - vsf;
210*35238bceSAndroid Build Coastguard Worker                            if (sextant == 0)
211*35238bceSAndroid Build Coastguard Worker                                rgb = Vec3(v, mid1, m);
212*35238bceSAndroid Build Coastguard Worker                            else if (sextant == 1)
213*35238bceSAndroid Build Coastguard Worker                                rgb = Vec3(mid2, v, m);
214*35238bceSAndroid Build Coastguard Worker                            else if (sextant == 2)
215*35238bceSAndroid Build Coastguard Worker                                rgb = Vec3(m, v, mid1);
216*35238bceSAndroid Build Coastguard Worker                            else if (sextant == 3)
217*35238bceSAndroid Build Coastguard Worker                                rgb = Vec3(m, mid2, v);
218*35238bceSAndroid Build Coastguard Worker                            else if (sextant == 4)
219*35238bceSAndroid Build Coastguard Worker                                rgb = Vec3(mid1, m, v);
220*35238bceSAndroid Build Coastguard Worker                            else
221*35238bceSAndroid Build Coastguard Worker                                rgb = Vec3(v, m, mid2);
222*35238bceSAndroid Build Coastguard Worker                        }
223*35238bceSAndroid Build Coastguard Worker                        c.color.xyz() = rgb;
224*35238bceSAndroid Build Coastguard Worker                    });
225*35238bceSAndroid Build Coastguard Worker 
226*35238bceSAndroid Build Coastguard Worker     SHADER_OP_CASE(rgb_to_hsl, "Conversion from RGB color space into HSL.",
227*35238bceSAndroid Build Coastguard Worker                    LineStream(1) << "mediump float r = coords.x, g = coords.y, b = coords.z;"
228*35238bceSAndroid Build Coastguard Worker                                  << "mediump float minVal = min(min(r, g), b);"
229*35238bceSAndroid Build Coastguard Worker                                  << "mediump float maxVal = max(max(r, g), b);"
230*35238bceSAndroid Build Coastguard Worker                                  << "mediump float L = (minVal + maxVal) * 0.5;"
231*35238bceSAndroid Build Coastguard Worker                                  << "if (minVal == maxVal)"
232*35238bceSAndroid Build Coastguard Worker                                  << "    res = vec3(0.0, 0.0, L);"
233*35238bceSAndroid Build Coastguard Worker                                  << "else"
234*35238bceSAndroid Build Coastguard Worker                                  << "{"
235*35238bceSAndroid Build Coastguard Worker                                  << "    mediump float H;"
236*35238bceSAndroid Build Coastguard Worker                                  << "    mediump float S;"
237*35238bceSAndroid Build Coastguard Worker                                  << "    if (L < 0.5)"
238*35238bceSAndroid Build Coastguard Worker                                  << "        S = (maxVal - minVal) / (maxVal + minVal);"
239*35238bceSAndroid Build Coastguard Worker                                  << "    else"
240*35238bceSAndroid Build Coastguard Worker                                  << "        S = (maxVal - minVal) / (2.0 - maxVal - minVal);"
241*35238bceSAndroid Build Coastguard Worker                                  << ""
242*35238bceSAndroid Build Coastguard Worker                                  << "    mediump float ooDiff = 1.0 / (maxVal - minVal);"
243*35238bceSAndroid Build Coastguard Worker                                  << "    if (r == maxVal)      H = (g - b) * ooDiff;"
244*35238bceSAndroid Build Coastguard Worker                                  << "    else if (g == maxVal) H = 2.0 + (b - r) * ooDiff;"
245*35238bceSAndroid Build Coastguard Worker                                  << "    else                  H = 4.0 + (r - g) * ooDiff;"
246*35238bceSAndroid Build Coastguard Worker                                  << "    H /= 6.0;"
247*35238bceSAndroid Build Coastguard Worker                                  << ""
248*35238bceSAndroid Build Coastguard Worker                                  << "    res = vec3(H, S, L);"
249*35238bceSAndroid Build Coastguard Worker                                  << "}",
250*35238bceSAndroid Build Coastguard Worker                    {
251*35238bceSAndroid Build Coastguard Worker                        float r      = c.unitCoords.x();
252*35238bceSAndroid Build Coastguard Worker                        float g      = c.unitCoords.y();
253*35238bceSAndroid Build Coastguard Worker                        float b      = c.unitCoords.z();
254*35238bceSAndroid Build Coastguard Worker                        float minVal = min(min(r, g), b);
255*35238bceSAndroid Build Coastguard Worker                        float maxVal = max(max(r, g), b);
256*35238bceSAndroid Build Coastguard Worker                        float L      = (minVal + maxVal) * 0.5f;
257*35238bceSAndroid Build Coastguard Worker                        Vec3 hsl;
258*35238bceSAndroid Build Coastguard Worker 
259*35238bceSAndroid Build Coastguard Worker                        if (minVal == maxVal)
260*35238bceSAndroid Build Coastguard Worker                            hsl = Vec3(0.0f, 0.0f, L);
261*35238bceSAndroid Build Coastguard Worker                        else
262*35238bceSAndroid Build Coastguard Worker                        {
263*35238bceSAndroid Build Coastguard Worker                            float H;
264*35238bceSAndroid Build Coastguard Worker                            float S;
265*35238bceSAndroid Build Coastguard Worker                            if (L < 0.5f)
266*35238bceSAndroid Build Coastguard Worker                                S = (maxVal - minVal) / (maxVal + minVal);
267*35238bceSAndroid Build Coastguard Worker                            else
268*35238bceSAndroid Build Coastguard Worker                                S = (maxVal - minVal) / (2.0f - maxVal - minVal);
269*35238bceSAndroid Build Coastguard Worker 
270*35238bceSAndroid Build Coastguard Worker                            float ooDiff = 1.0f / (maxVal - minVal);
271*35238bceSAndroid Build Coastguard Worker                            if (r == maxVal)
272*35238bceSAndroid Build Coastguard Worker                                H = (g - b) * ooDiff;
273*35238bceSAndroid Build Coastguard Worker                            else if (g == maxVal)
274*35238bceSAndroid Build Coastguard Worker                                H = 2.0f + (b - r) * ooDiff;
275*35238bceSAndroid Build Coastguard Worker                            else
276*35238bceSAndroid Build Coastguard Worker                                H = 4.0f + (r - g) * ooDiff;
277*35238bceSAndroid Build Coastguard Worker                            H /= 6.0f;
278*35238bceSAndroid Build Coastguard Worker 
279*35238bceSAndroid Build Coastguard Worker                            hsl = Vec3(H, S, L);
280*35238bceSAndroid Build Coastguard Worker                        }
281*35238bceSAndroid Build Coastguard Worker                        c.color.xyz() = hsl;
282*35238bceSAndroid Build Coastguard Worker                    });
283*35238bceSAndroid Build Coastguard Worker 
284*35238bceSAndroid Build Coastguard Worker     /*    SHADER_OP_CASE(image_to_grayscale, "Convert image to grayscale.",
285*35238bceSAndroid Build Coastguard Worker             LineStream(1)
286*35238bceSAndroid Build Coastguard Worker             << "res = texture2D(ut_brick, coords.xy).rgb;",
287*35238bceSAndroid Build Coastguard Worker             {
288*35238bceSAndroid Build Coastguard Worker                 c.color.xyz() = Vec3(0.5f);
289*35238bceSAndroid Build Coastguard Worker             });*/
290*35238bceSAndroid Build Coastguard Worker }
291*35238bceSAndroid Build Coastguard Worker 
292*35238bceSAndroid Build Coastguard Worker } // namespace Functional
293*35238bceSAndroid Build Coastguard Worker } // namespace gles2
294*35238bceSAndroid Build Coastguard Worker } // namespace deqp
295