1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.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 FBO test utilities.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es3fFboTestUtil.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 gles3
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
FlatColorShader(glu::DataType outputType)93*35238bceSAndroid Build Coastguard Worker FlatColorShader::FlatColorShader(glu::DataType outputType)
94*35238bceSAndroid Build Coastguard Worker : ShaderProgram(sglr::pdec::ShaderProgramDeclaration()
95*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexAttribute("a_position", rr::GENERICVECTYPE_FLOAT)
96*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexToFragmentVarying(rr::GENERICVECTYPE_FLOAT)
97*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentOutput(mapDataTypeToGenericVecType(outputType))
98*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_color", glu::TYPE_FLOAT_VEC4)
99*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexSource("#version 300 es\n"
100*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
101*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
102*35238bceSAndroid Build Coastguard Worker "{\n"
103*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
104*35238bceSAndroid Build Coastguard Worker "}\n")
105*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentSource(string("#version 300 es\n"
106*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_color;\n"
107*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out highp ") +
108*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
109*35238bceSAndroid Build Coastguard Worker " o_color;\n"
110*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
111*35238bceSAndroid Build Coastguard Worker "{\n"
112*35238bceSAndroid Build Coastguard Worker " o_color = " +
113*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
114*35238bceSAndroid Build Coastguard Worker "(u_color);\n"
115*35238bceSAndroid Build Coastguard Worker "}\n"))
116*35238bceSAndroid Build Coastguard Worker , m_outputType(outputType)
117*35238bceSAndroid Build Coastguard Worker {
118*35238bceSAndroid Build Coastguard Worker }
119*35238bceSAndroid Build Coastguard Worker
setColor(sglr::Context & context,uint32_t program,const tcu::Vec4 & color)120*35238bceSAndroid Build Coastguard Worker void FlatColorShader::setColor(sglr::Context &context, uint32_t program, const tcu::Vec4 &color)
121*35238bceSAndroid Build Coastguard Worker {
122*35238bceSAndroid Build Coastguard Worker int32_t location = context.getUniformLocation(program, "u_color");
123*35238bceSAndroid Build Coastguard Worker
124*35238bceSAndroid Build Coastguard Worker context.useProgram(program);
125*35238bceSAndroid Build Coastguard Worker context.uniform4fv(location, 1, color.getPtr());
126*35238bceSAndroid Build Coastguard Worker }
127*35238bceSAndroid Build Coastguard Worker
shadeVertices(const rr::VertexAttrib * inputs,rr::VertexPacket * const * packets,const int numPackets) const128*35238bceSAndroid Build Coastguard Worker void FlatColorShader::shadeVertices(const rr::VertexAttrib *inputs, rr::VertexPacket *const *packets,
129*35238bceSAndroid Build Coastguard Worker const int numPackets) const
130*35238bceSAndroid Build Coastguard Worker {
131*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
132*35238bceSAndroid Build Coastguard Worker {
133*35238bceSAndroid Build Coastguard Worker rr::VertexPacket &packet = *packets[packetNdx];
134*35238bceSAndroid Build Coastguard Worker
135*35238bceSAndroid Build Coastguard Worker packet.position = rr::readVertexAttribFloat(inputs[0], packet.instanceNdx, packet.vertexNdx);
136*35238bceSAndroid Build Coastguard Worker }
137*35238bceSAndroid Build Coastguard Worker }
138*35238bceSAndroid Build Coastguard Worker
shadeFragments(rr::FragmentPacket * packets,const int numPackets,const rr::FragmentShadingContext & context) const139*35238bceSAndroid Build Coastguard Worker void FlatColorShader::shadeFragments(rr::FragmentPacket *packets, const int numPackets,
140*35238bceSAndroid Build Coastguard Worker const rr::FragmentShadingContext &context) const
141*35238bceSAndroid Build Coastguard Worker {
142*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 color(m_uniforms[0].value.f4);
143*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 icolor = castVectorSaturate<int32_t>(color);
144*35238bceSAndroid Build Coastguard Worker const tcu::UVec4 uicolor = castVectorSaturate<uint32_t>(color);
145*35238bceSAndroid Build Coastguard Worker
146*35238bceSAndroid Build Coastguard Worker DE_UNREF(packets);
147*35238bceSAndroid Build Coastguard Worker
148*35238bceSAndroid Build Coastguard Worker if (m_outputType == glu::TYPE_FLOAT_VEC4)
149*35238bceSAndroid Build Coastguard Worker {
150*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
151*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
152*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color);
153*35238bceSAndroid Build Coastguard Worker }
154*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_INT_VEC4)
155*35238bceSAndroid Build Coastguard Worker {
156*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
157*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
158*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, icolor);
159*35238bceSAndroid Build Coastguard Worker }
160*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_UINT_VEC4)
161*35238bceSAndroid Build Coastguard Worker {
162*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
163*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
164*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, uicolor);
165*35238bceSAndroid Build Coastguard Worker }
166*35238bceSAndroid Build Coastguard Worker else
167*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
168*35238bceSAndroid Build Coastguard Worker }
169*35238bceSAndroid Build Coastguard Worker
GradientShader(glu::DataType outputType)170*35238bceSAndroid Build Coastguard Worker GradientShader::GradientShader(glu::DataType outputType)
171*35238bceSAndroid Build Coastguard Worker : ShaderProgram(sglr::pdec::ShaderProgramDeclaration()
172*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexAttribute("a_position", rr::GENERICVECTYPE_FLOAT)
173*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexAttribute("a_coord", rr::GENERICVECTYPE_FLOAT)
174*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexToFragmentVarying(rr::GENERICVECTYPE_FLOAT)
175*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentOutput(mapDataTypeToGenericVecType(outputType))
176*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_gradientMin", glu::TYPE_FLOAT_VEC4)
177*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_gradientMax", glu::TYPE_FLOAT_VEC4)
178*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexSource("#version 300 es\n"
179*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
180*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_coord;\n"
181*35238bceSAndroid Build Coastguard Worker "out highp vec4 v_coord;\n"
182*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
183*35238bceSAndroid Build Coastguard Worker "{\n"
184*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
185*35238bceSAndroid Build Coastguard Worker " v_coord = a_coord;\n"
186*35238bceSAndroid Build Coastguard Worker "}\n")
187*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentSource(string("#version 300 es\n"
188*35238bceSAndroid Build Coastguard Worker "in highp vec4 v_coord;\n"
189*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_gradientMin;\n"
190*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_gradientMax;\n"
191*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out highp ") +
192*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
193*35238bceSAndroid Build Coastguard Worker " o_color;\n"
194*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
195*35238bceSAndroid Build Coastguard Worker "{\n"
196*35238bceSAndroid Build Coastguard Worker " highp float x = v_coord.x;\n"
197*35238bceSAndroid Build Coastguard Worker " highp float y = v_coord.y;\n"
198*35238bceSAndroid Build Coastguard Worker " highp float f0 = (x + y) * 0.5;\n"
199*35238bceSAndroid Build Coastguard Worker " highp float f1 = 0.5 + (x - y) * 0.5;\n"
200*35238bceSAndroid Build Coastguard Worker " highp vec4 fv = vec4(f0, f1, 1.0f-f0, 1.0f-f1);\n"
201*35238bceSAndroid Build Coastguard Worker " o_color = " +
202*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
203*35238bceSAndroid Build Coastguard Worker "(u_gradientMin + (u_gradientMax-u_gradientMin)*fv);\n"
204*35238bceSAndroid Build Coastguard Worker "}\n"))
205*35238bceSAndroid Build Coastguard Worker , m_outputType(outputType)
206*35238bceSAndroid Build Coastguard Worker {
207*35238bceSAndroid Build Coastguard Worker }
208*35238bceSAndroid Build Coastguard Worker
setGradient(sglr::Context & ctx,uint32_t program,const tcu::Vec4 & gradientMin,const tcu::Vec4 & gradientMax)209*35238bceSAndroid Build Coastguard Worker void GradientShader::setGradient(sglr::Context &ctx, uint32_t program, const tcu::Vec4 &gradientMin,
210*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 &gradientMax)
211*35238bceSAndroid Build Coastguard Worker {
212*35238bceSAndroid Build Coastguard Worker ctx.useProgram(program);
213*35238bceSAndroid Build Coastguard Worker ctx.uniform4fv(ctx.getUniformLocation(program, "u_gradientMin"), 1, gradientMin.getPtr());
214*35238bceSAndroid Build Coastguard Worker ctx.uniform4fv(ctx.getUniformLocation(program, "u_gradientMax"), 1, gradientMax.getPtr());
215*35238bceSAndroid Build Coastguard Worker }
216*35238bceSAndroid Build Coastguard Worker
shadeVertices(const rr::VertexAttrib * inputs,rr::VertexPacket * const * packets,const int numPackets) const217*35238bceSAndroid Build Coastguard Worker void GradientShader::shadeVertices(const rr::VertexAttrib *inputs, rr::VertexPacket *const *packets,
218*35238bceSAndroid Build Coastguard Worker const int numPackets) const
219*35238bceSAndroid Build Coastguard Worker {
220*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
221*35238bceSAndroid Build Coastguard Worker {
222*35238bceSAndroid Build Coastguard Worker rr::VertexPacket &packet = *packets[packetNdx];
223*35238bceSAndroid Build Coastguard Worker
224*35238bceSAndroid Build Coastguard Worker packet.position = rr::readVertexAttribFloat(inputs[0], packet.instanceNdx, packet.vertexNdx);
225*35238bceSAndroid Build Coastguard Worker packet.outputs[0] = rr::readVertexAttribFloat(inputs[1], packet.instanceNdx, packet.vertexNdx);
226*35238bceSAndroid Build Coastguard Worker }
227*35238bceSAndroid Build Coastguard Worker }
228*35238bceSAndroid Build Coastguard Worker
shadeFragments(rr::FragmentPacket * packets,const int numPackets,const rr::FragmentShadingContext & context) const229*35238bceSAndroid Build Coastguard Worker void GradientShader::shadeFragments(rr::FragmentPacket *packets, const int numPackets,
230*35238bceSAndroid Build Coastguard Worker const rr::FragmentShadingContext &context) const
231*35238bceSAndroid Build Coastguard Worker {
232*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 gradientMin(m_uniforms[0].value.f4);
233*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 gradientMax(m_uniforms[1].value.f4);
234*35238bceSAndroid Build Coastguard Worker
235*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
236*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
237*35238bceSAndroid Build Coastguard Worker {
238*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 coord = rr::readTriangleVarying<float>(packets[packetNdx], context, 0, fragNdx);
239*35238bceSAndroid Build Coastguard Worker const float x = coord.x();
240*35238bceSAndroid Build Coastguard Worker const float y = coord.y();
241*35238bceSAndroid Build Coastguard Worker const float f0 = (x + y) * 0.5f;
242*35238bceSAndroid Build Coastguard Worker const float f1 = 0.5f + (x - y) * 0.5f;
243*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 fv = Vec4(f0, f1, 1.0f - f0, 1.0f - f1);
244*35238bceSAndroid Build Coastguard Worker
245*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 color = gradientMin + (gradientMax - gradientMin) * fv;
246*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 icolor = castVectorSaturate<int32_t>(color);
247*35238bceSAndroid Build Coastguard Worker const tcu::UVec4 uicolor = castVectorSaturate<uint32_t>(color);
248*35238bceSAndroid Build Coastguard Worker
249*35238bceSAndroid Build Coastguard Worker if (m_outputType == glu::TYPE_FLOAT_VEC4)
250*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color);
251*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_INT_VEC4)
252*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, icolor);
253*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_UINT_VEC4)
254*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, uicolor);
255*35238bceSAndroid Build Coastguard Worker else
256*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
257*35238bceSAndroid Build Coastguard Worker }
258*35238bceSAndroid Build Coastguard Worker }
259*35238bceSAndroid Build Coastguard Worker
genTexFragmentShader(const vector<glu::DataType> & samplerTypes,glu::DataType outputType)260*35238bceSAndroid Build Coastguard Worker static string genTexFragmentShader(const vector<glu::DataType> &samplerTypes, glu::DataType outputType)
261*35238bceSAndroid Build Coastguard Worker {
262*35238bceSAndroid Build Coastguard Worker const char *precision = "highp";
263*35238bceSAndroid Build Coastguard Worker std::ostringstream src;
264*35238bceSAndroid Build Coastguard Worker
265*35238bceSAndroid Build Coastguard Worker src << "#version 300 es\n"
266*35238bceSAndroid Build Coastguard Worker << "layout(location = 0) out highp " << glu::getDataTypeName(outputType) << " o_color0;\n";
267*35238bceSAndroid Build Coastguard Worker
268*35238bceSAndroid Build Coastguard Worker src << "in highp vec2 v_coord;\n";
269*35238bceSAndroid Build Coastguard Worker
270*35238bceSAndroid Build Coastguard Worker for (int samplerNdx = 0; samplerNdx < (int)samplerTypes.size(); samplerNdx++)
271*35238bceSAndroid Build Coastguard Worker {
272*35238bceSAndroid Build Coastguard Worker src << "uniform " << precision << " " << glu::getDataTypeName(samplerTypes[samplerNdx]) << " u_sampler"
273*35238bceSAndroid Build Coastguard Worker << samplerNdx << ";\n";
274*35238bceSAndroid Build Coastguard Worker src << "uniform " << precision << " vec4 u_texScale" << samplerNdx << ";\n";
275*35238bceSAndroid Build Coastguard Worker src << "uniform " << precision << " vec4 u_texBias" << samplerNdx << ";\n";
276*35238bceSAndroid Build Coastguard Worker }
277*35238bceSAndroid Build Coastguard Worker
278*35238bceSAndroid Build Coastguard Worker // Output scale & bias
279*35238bceSAndroid Build Coastguard Worker src << "uniform " << precision << " vec4 u_outScale0;\n"
280*35238bceSAndroid Build Coastguard Worker << "uniform " << precision << " vec4 u_outBias0;\n";
281*35238bceSAndroid Build Coastguard Worker
282*35238bceSAndroid Build Coastguard Worker src << "\n"
283*35238bceSAndroid Build Coastguard Worker << "void main (void)\n"
284*35238bceSAndroid Build Coastguard Worker << "{\n"
285*35238bceSAndroid Build Coastguard Worker << " " << precision << " vec4 out0 = vec4(0.0);\n";
286*35238bceSAndroid Build Coastguard Worker
287*35238bceSAndroid Build Coastguard Worker // Texture input fetch and combine.
288*35238bceSAndroid Build Coastguard Worker for (int inNdx = 0; inNdx < (int)samplerTypes.size(); inNdx++)
289*35238bceSAndroid Build Coastguard Worker src << "\tout0 += vec4("
290*35238bceSAndroid Build Coastguard Worker << "texture(u_sampler" << inNdx << ", v_coord)) * u_texScale" << inNdx << " + u_texBias" << inNdx << ";\n";
291*35238bceSAndroid Build Coastguard Worker
292*35238bceSAndroid Build Coastguard Worker // Write output.
293*35238bceSAndroid Build Coastguard Worker src << " o_color0 = " << glu::getDataTypeName(outputType) << "(out0 * u_outScale0 + u_outBias0);\n";
294*35238bceSAndroid Build Coastguard Worker
295*35238bceSAndroid Build Coastguard Worker src << "}\n";
296*35238bceSAndroid Build Coastguard Worker
297*35238bceSAndroid Build Coastguard Worker return src.str();
298*35238bceSAndroid Build Coastguard Worker }
299*35238bceSAndroid Build Coastguard Worker
genTexture2DShaderDecl(const DataTypes & samplerTypes,glu::DataType outputType)300*35238bceSAndroid Build Coastguard Worker static sglr::pdec::ShaderProgramDeclaration genTexture2DShaderDecl(const DataTypes &samplerTypes,
301*35238bceSAndroid Build Coastguard Worker glu::DataType outputType)
302*35238bceSAndroid Build Coastguard Worker {
303*35238bceSAndroid Build Coastguard Worker sglr::pdec::ShaderProgramDeclaration decl;
304*35238bceSAndroid Build Coastguard Worker
305*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::VertexAttribute("a_position", rr::GENERICVECTYPE_FLOAT);
306*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::VertexAttribute("a_coord", rr::GENERICVECTYPE_FLOAT);
307*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::VertexToFragmentVarying(rr::GENERICVECTYPE_FLOAT);
308*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::FragmentOutput(mapDataTypeToGenericVecType(outputType));
309*35238bceSAndroid Build Coastguard Worker
310*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::VertexSource("#version 300 es\n"
311*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
312*35238bceSAndroid Build Coastguard Worker "in highp vec2 a_coord;\n"
313*35238bceSAndroid Build Coastguard Worker "out highp vec2 v_coord;\n"
314*35238bceSAndroid Build Coastguard Worker "void main(void)\n"
315*35238bceSAndroid Build Coastguard Worker "{\n"
316*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
317*35238bceSAndroid Build Coastguard Worker " v_coord = a_coord;\n"
318*35238bceSAndroid Build Coastguard Worker "}\n");
319*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::FragmentSource(genTexFragmentShader(samplerTypes.vec, outputType));
320*35238bceSAndroid Build Coastguard Worker
321*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::Uniform("u_outScale0", glu::TYPE_FLOAT_VEC4);
322*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::Uniform("u_outBias0", glu::TYPE_FLOAT_VEC4);
323*35238bceSAndroid Build Coastguard Worker
324*35238bceSAndroid Build Coastguard Worker for (size_t ndx = 0; ndx < samplerTypes.vec.size(); ++ndx)
325*35238bceSAndroid Build Coastguard Worker {
326*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::Uniform(std::string("u_sampler") + de::toString(ndx), samplerTypes.vec[ndx]);
327*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::Uniform(std::string("u_texScale") + de::toString(ndx), glu::TYPE_FLOAT_VEC4);
328*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::Uniform(std::string("u_texBias") + de::toString(ndx), glu::TYPE_FLOAT_VEC4);
329*35238bceSAndroid Build Coastguard Worker }
330*35238bceSAndroid Build Coastguard Worker
331*35238bceSAndroid Build Coastguard Worker return decl;
332*35238bceSAndroid Build Coastguard Worker }
333*35238bceSAndroid Build Coastguard Worker
Texture2DShader(const DataTypes & samplerTypes,glu::DataType outputType,const Vec4 & outScale,const Vec4 & outBias)334*35238bceSAndroid Build Coastguard Worker Texture2DShader::Texture2DShader(const DataTypes &samplerTypes, glu::DataType outputType, const Vec4 &outScale,
335*35238bceSAndroid Build Coastguard Worker const Vec4 &outBias)
336*35238bceSAndroid Build Coastguard Worker : sglr::ShaderProgram(genTexture2DShaderDecl(samplerTypes, outputType))
337*35238bceSAndroid Build Coastguard Worker , m_outScale(outScale)
338*35238bceSAndroid Build Coastguard Worker , m_outBias(outBias)
339*35238bceSAndroid Build Coastguard Worker , m_outputType(outputType)
340*35238bceSAndroid Build Coastguard Worker {
341*35238bceSAndroid Build Coastguard Worker m_inputs.resize(samplerTypes.vec.size());
342*35238bceSAndroid Build Coastguard Worker
343*35238bceSAndroid Build Coastguard Worker // Initialize units.
344*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)m_inputs.size(); ndx++)
345*35238bceSAndroid Build Coastguard Worker {
346*35238bceSAndroid Build Coastguard Worker m_inputs[ndx].unitNdx = ndx;
347*35238bceSAndroid Build Coastguard Worker m_inputs[ndx].scale = Vec4(1.0f);
348*35238bceSAndroid Build Coastguard Worker m_inputs[ndx].bias = Vec4(0.0f);
349*35238bceSAndroid Build Coastguard Worker }
350*35238bceSAndroid Build Coastguard Worker }
351*35238bceSAndroid Build Coastguard Worker
setUnit(int inputNdx,int unitNdx)352*35238bceSAndroid Build Coastguard Worker void Texture2DShader::setUnit(int inputNdx, int unitNdx)
353*35238bceSAndroid Build Coastguard Worker {
354*35238bceSAndroid Build Coastguard Worker m_inputs[inputNdx].unitNdx = unitNdx;
355*35238bceSAndroid Build Coastguard Worker }
356*35238bceSAndroid Build Coastguard Worker
setTexScaleBias(int inputNdx,const Vec4 & scale,const Vec4 & bias)357*35238bceSAndroid Build Coastguard Worker void Texture2DShader::setTexScaleBias(int inputNdx, const Vec4 &scale, const Vec4 &bias)
358*35238bceSAndroid Build Coastguard Worker {
359*35238bceSAndroid Build Coastguard Worker m_inputs[inputNdx].scale = scale;
360*35238bceSAndroid Build Coastguard Worker m_inputs[inputNdx].bias = bias;
361*35238bceSAndroid Build Coastguard Worker }
362*35238bceSAndroid Build Coastguard Worker
setOutScaleBias(const Vec4 & scale,const Vec4 & bias)363*35238bceSAndroid Build Coastguard Worker void Texture2DShader::setOutScaleBias(const Vec4 &scale, const Vec4 &bias)
364*35238bceSAndroid Build Coastguard Worker {
365*35238bceSAndroid Build Coastguard Worker m_outScale = scale;
366*35238bceSAndroid Build Coastguard Worker m_outBias = bias;
367*35238bceSAndroid Build Coastguard Worker }
368*35238bceSAndroid Build Coastguard Worker
setUniforms(sglr::Context & gl,uint32_t program) const369*35238bceSAndroid Build Coastguard Worker void Texture2DShader::setUniforms(sglr::Context &gl, uint32_t program) const
370*35238bceSAndroid Build Coastguard Worker {
371*35238bceSAndroid Build Coastguard Worker gl.useProgram(program);
372*35238bceSAndroid Build Coastguard Worker
373*35238bceSAndroid Build Coastguard Worker for (int texNdx = 0; texNdx < (int)m_inputs.size(); texNdx++)
374*35238bceSAndroid Build Coastguard Worker {
375*35238bceSAndroid Build Coastguard Worker string samplerName = string("u_sampler") + de::toString(texNdx);
376*35238bceSAndroid Build Coastguard Worker string scaleName = string("u_texScale") + de::toString(texNdx);
377*35238bceSAndroid Build Coastguard Worker string biasName = string("u_texBias") + de::toString(texNdx);
378*35238bceSAndroid Build Coastguard Worker
379*35238bceSAndroid Build Coastguard Worker gl.uniform1i(gl.getUniformLocation(program, samplerName.c_str()), m_inputs[texNdx].unitNdx);
380*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, scaleName.c_str()), 1, m_inputs[texNdx].scale.getPtr());
381*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, biasName.c_str()), 1, m_inputs[texNdx].bias.getPtr());
382*35238bceSAndroid Build Coastguard Worker }
383*35238bceSAndroid Build Coastguard Worker
384*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, "u_outScale0"), 1, m_outScale.getPtr());
385*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, "u_outBias0"), 1, m_outBias.getPtr());
386*35238bceSAndroid Build Coastguard Worker }
387*35238bceSAndroid Build Coastguard Worker
shadeVertices(const rr::VertexAttrib * inputs,rr::VertexPacket * const * packets,const int numPackets) const388*35238bceSAndroid Build Coastguard Worker void Texture2DShader::shadeVertices(const rr::VertexAttrib *inputs, rr::VertexPacket *const *packets,
389*35238bceSAndroid Build Coastguard Worker const int numPackets) const
390*35238bceSAndroid Build Coastguard Worker {
391*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
392*35238bceSAndroid Build Coastguard Worker {
393*35238bceSAndroid Build Coastguard Worker rr::VertexPacket &packet = *packets[packetNdx];
394*35238bceSAndroid Build Coastguard Worker
395*35238bceSAndroid Build Coastguard Worker packet.position = rr::readVertexAttribFloat(inputs[0], packet.instanceNdx, packet.vertexNdx);
396*35238bceSAndroid Build Coastguard Worker packet.outputs[0] = rr::readVertexAttribFloat(inputs[1], packet.instanceNdx, packet.vertexNdx);
397*35238bceSAndroid Build Coastguard Worker }
398*35238bceSAndroid Build Coastguard Worker }
399*35238bceSAndroid Build Coastguard Worker
shadeFragments(rr::FragmentPacket * packets,const int numPackets,const rr::FragmentShadingContext & context) const400*35238bceSAndroid Build Coastguard Worker void Texture2DShader::shadeFragments(rr::FragmentPacket *packets, const int numPackets,
401*35238bceSAndroid Build Coastguard Worker const rr::FragmentShadingContext &context) const
402*35238bceSAndroid Build Coastguard Worker {
403*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 outScale(m_uniforms[0].value.f4);
404*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 outBias(m_uniforms[1].value.f4);
405*35238bceSAndroid Build Coastguard Worker
406*35238bceSAndroid Build Coastguard Worker tcu::Vec2 texCoords[4];
407*35238bceSAndroid Build Coastguard Worker tcu::Vec4 colors[4];
408*35238bceSAndroid Build Coastguard Worker
409*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
410*35238bceSAndroid Build Coastguard Worker {
411*35238bceSAndroid Build Coastguard Worker // setup tex coords
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::Vec2(coord.x(), coord.y());
416*35238bceSAndroid Build Coastguard Worker }
417*35238bceSAndroid Build Coastguard Worker
418*35238bceSAndroid Build Coastguard Worker // clear result
419*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
420*35238bceSAndroid Build Coastguard Worker colors[fragNdx] = tcu::Vec4(0.0f);
421*35238bceSAndroid Build Coastguard Worker
422*35238bceSAndroid Build Coastguard Worker // sample each texture
423*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)m_inputs.size(); ndx++)
424*35238bceSAndroid Build Coastguard Worker {
425*35238bceSAndroid Build Coastguard Worker const sglr::rc::Texture2D *tex = m_uniforms[2 + ndx * 3].sampler.tex2D;
426*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 scale(m_uniforms[2 + ndx * 3 + 1].value.f4);
427*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 bias(m_uniforms[2 + ndx * 3 + 2].value.f4);
428*35238bceSAndroid Build Coastguard Worker tcu::Vec4 tmpColors[4];
429*35238bceSAndroid Build Coastguard Worker
430*35238bceSAndroid Build Coastguard Worker tex->sample4(tmpColors, texCoords);
431*35238bceSAndroid Build Coastguard Worker
432*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
433*35238bceSAndroid Build Coastguard Worker colors[fragNdx] += tmpColors[fragNdx] * scale + bias;
434*35238bceSAndroid Build Coastguard Worker }
435*35238bceSAndroid Build Coastguard Worker
436*35238bceSAndroid Build Coastguard Worker // write out
437*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
438*35238bceSAndroid Build Coastguard Worker {
439*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 color = colors[fragNdx] * outScale + outBias;
440*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 icolor = castVectorSaturate<int32_t>(color);
441*35238bceSAndroid Build Coastguard Worker const tcu::UVec4 uicolor = castVectorSaturate<uint32_t>(color);
442*35238bceSAndroid Build Coastguard Worker
443*35238bceSAndroid Build Coastguard Worker if (m_outputType == glu::TYPE_FLOAT_VEC4)
444*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color);
445*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_INT_VEC4)
446*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, icolor);
447*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_UINT_VEC4)
448*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, uicolor);
449*35238bceSAndroid Build Coastguard Worker else
450*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
451*35238bceSAndroid Build Coastguard Worker }
452*35238bceSAndroid Build Coastguard Worker }
453*35238bceSAndroid Build Coastguard Worker }
454*35238bceSAndroid Build Coastguard Worker
TextureCubeShader(glu::DataType samplerType,glu::DataType outputType)455*35238bceSAndroid Build Coastguard Worker TextureCubeShader::TextureCubeShader(glu::DataType samplerType, glu::DataType outputType)
456*35238bceSAndroid Build Coastguard Worker : sglr::ShaderProgram(
457*35238bceSAndroid Build Coastguard Worker sglr::pdec::ShaderProgramDeclaration()
458*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexAttribute("a_position", rr::GENERICVECTYPE_FLOAT)
459*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexAttribute("a_coord", rr::GENERICVECTYPE_FLOAT)
460*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexToFragmentVarying(rr::GENERICVECTYPE_FLOAT)
461*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentOutput(mapDataTypeToGenericVecType(outputType))
462*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_coordMat", glu::TYPE_FLOAT_MAT3) << sglr::pdec::Uniform("u_sampler0", samplerType)
463*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_scale", glu::TYPE_FLOAT_VEC4) << sglr::pdec::Uniform("u_bias", glu::TYPE_FLOAT_VEC4)
464*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexSource("#version 300 es\n"
465*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
466*35238bceSAndroid Build Coastguard Worker "in mediump vec2 a_coord;\n"
467*35238bceSAndroid Build Coastguard Worker "uniform mat3 u_coordMat;\n"
468*35238bceSAndroid Build Coastguard Worker "out mediump vec3 v_coord;\n"
469*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
470*35238bceSAndroid Build Coastguard Worker "{\n"
471*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
472*35238bceSAndroid Build Coastguard Worker " v_coord = u_coordMat * vec3(a_coord, 1.0);\n"
473*35238bceSAndroid Build Coastguard Worker "}\n")
474*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentSource(string("") +
475*35238bceSAndroid Build Coastguard Worker "#version 300 es\n"
476*35238bceSAndroid Build Coastguard Worker "uniform highp " +
477*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(samplerType) +
478*35238bceSAndroid Build Coastguard Worker " u_sampler0;\n"
479*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_scale;\n"
480*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_bias;\n"
481*35238bceSAndroid Build Coastguard Worker "in mediump vec3 v_coord;\n"
482*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out highp " +
483*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
484*35238bceSAndroid Build Coastguard Worker " o_color;\n"
485*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
486*35238bceSAndroid Build Coastguard Worker "{\n"
487*35238bceSAndroid Build Coastguard Worker " o_color = " +
488*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
489*35238bceSAndroid Build Coastguard Worker "(vec4(texture(u_sampler0, v_coord)) * u_scale + u_bias);\n"
490*35238bceSAndroid Build Coastguard Worker "}\n"))
491*35238bceSAndroid Build Coastguard Worker , m_texScale(1.0f)
492*35238bceSAndroid Build Coastguard Worker , m_texBias(0.0f)
493*35238bceSAndroid Build Coastguard Worker , m_outputType(outputType)
494*35238bceSAndroid Build Coastguard Worker {
495*35238bceSAndroid Build Coastguard Worker }
496*35238bceSAndroid Build Coastguard Worker
setFace(tcu::CubeFace face)497*35238bceSAndroid Build Coastguard Worker void TextureCubeShader::setFace(tcu::CubeFace face)
498*35238bceSAndroid Build Coastguard Worker {
499*35238bceSAndroid Build Coastguard Worker static const float s_cubeTransforms[][3 * 3] = {// Face -X: (x, y, 1) -> (-1, -(2*y-1), +(2*x-1))
500*35238bceSAndroid Build Coastguard Worker {0.0f, 0.0f, -1.0f, 0.0f, -2.0f, 1.0f, 2.0f, 0.0f, -1.0f},
501*35238bceSAndroid Build Coastguard Worker // Face +X: (x, y, 1) -> (+1, -(2*y-1), -(2*x-1))
502*35238bceSAndroid Build Coastguard Worker {0.0f, 0.0f, 1.0f, 0.0f, -2.0f, 1.0f, -2.0f, 0.0f, 1.0f},
503*35238bceSAndroid Build Coastguard Worker // Face -Y: (x, y, 1) -> (+(2*x-1), -1, -(2*y-1))
504*35238bceSAndroid Build Coastguard Worker {2.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, -2.0f, 1.0f},
505*35238bceSAndroid Build Coastguard Worker // Face +Y: (x, y, 1) -> (+(2*x-1), +1, +(2*y-1))
506*35238bceSAndroid Build Coastguard Worker {2.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 2.0f, -1.0f},
507*35238bceSAndroid Build Coastguard Worker // Face -Z: (x, y, 1) -> (-(2*x-1), -(2*y-1), -1)
508*35238bceSAndroid Build Coastguard Worker {-2.0f, 0.0f, 1.0f, 0.0f, -2.0f, 1.0f, 0.0f, 0.0f, -1.0f},
509*35238bceSAndroid Build Coastguard Worker // Face +Z: (x, y, 1) -> (+(2*x-1), -(2*y-1), +1)
510*35238bceSAndroid Build Coastguard Worker {2.0f, 0.0f, -1.0f, 0.0f, -2.0f, 1.0f, 0.0f, 0.0f, 1.0f}};
511*35238bceSAndroid Build Coastguard Worker DE_ASSERT(de::inBounds<int>(face, 0, tcu::CUBEFACE_LAST));
512*35238bceSAndroid Build Coastguard Worker m_coordMat = tcu::Mat3(s_cubeTransforms[face]);
513*35238bceSAndroid Build Coastguard Worker }
514*35238bceSAndroid Build Coastguard Worker
setTexScaleBias(const Vec4 & scale,const Vec4 & bias)515*35238bceSAndroid Build Coastguard Worker void TextureCubeShader::setTexScaleBias(const Vec4 &scale, const Vec4 &bias)
516*35238bceSAndroid Build Coastguard Worker {
517*35238bceSAndroid Build Coastguard Worker m_texScale = scale;
518*35238bceSAndroid Build Coastguard Worker m_texBias = bias;
519*35238bceSAndroid Build Coastguard Worker }
520*35238bceSAndroid Build Coastguard Worker
setUniforms(sglr::Context & gl,uint32_t program) const521*35238bceSAndroid Build Coastguard Worker void TextureCubeShader::setUniforms(sglr::Context &gl, uint32_t program) const
522*35238bceSAndroid Build Coastguard Worker {
523*35238bceSAndroid Build Coastguard Worker gl.useProgram(program);
524*35238bceSAndroid Build Coastguard Worker
525*35238bceSAndroid Build Coastguard Worker gl.uniform1i(gl.getUniformLocation(program, "u_sampler0"), 0);
526*35238bceSAndroid Build Coastguard Worker gl.uniformMatrix3fv(gl.getUniformLocation(program, "u_coordMat"), 1, GL_FALSE,
527*35238bceSAndroid Build Coastguard Worker m_coordMat.getColumnMajorData().getPtr());
528*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, "u_scale"), 1, m_texScale.getPtr());
529*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, "u_bias"), 1, m_texBias.getPtr());
530*35238bceSAndroid Build Coastguard Worker }
531*35238bceSAndroid Build Coastguard Worker
shadeVertices(const rr::VertexAttrib * inputs,rr::VertexPacket * const * packets,const int numPackets) const532*35238bceSAndroid Build Coastguard Worker void TextureCubeShader::shadeVertices(const rr::VertexAttrib *inputs, rr::VertexPacket *const *packets,
533*35238bceSAndroid Build Coastguard Worker const int numPackets) const
534*35238bceSAndroid Build Coastguard Worker {
535*35238bceSAndroid Build Coastguard Worker tcu::Mat3 texCoordMat = tcu::Mat3(m_uniforms[0].value.m3);
536*35238bceSAndroid Build Coastguard Worker
537*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
538*35238bceSAndroid Build Coastguard Worker {
539*35238bceSAndroid Build Coastguard Worker rr::VertexPacket &packet = *packets[packetNdx];
540*35238bceSAndroid Build Coastguard Worker tcu::Vec2 a_coord = rr::readVertexAttribFloat(inputs[1], packet.instanceNdx, packet.vertexNdx).xy();
541*35238bceSAndroid Build Coastguard Worker tcu::Vec3 v_coord = texCoordMat * tcu::Vec3(a_coord.x(), a_coord.y(), 1.0f);
542*35238bceSAndroid Build Coastguard Worker
543*35238bceSAndroid Build Coastguard Worker packet.position = rr::readVertexAttribFloat(inputs[0], packet.instanceNdx, packet.vertexNdx);
544*35238bceSAndroid Build Coastguard Worker packet.outputs[0] = tcu::Vec4(v_coord.x(), v_coord.y(), v_coord.z(), 0.0f);
545*35238bceSAndroid Build Coastguard Worker }
546*35238bceSAndroid Build Coastguard Worker }
547*35238bceSAndroid Build Coastguard Worker
shadeFragments(rr::FragmentPacket * packets,const int numPackets,const rr::FragmentShadingContext & context) const548*35238bceSAndroid Build Coastguard Worker void TextureCubeShader::shadeFragments(rr::FragmentPacket *packets, const int numPackets,
549*35238bceSAndroid Build Coastguard Worker const rr::FragmentShadingContext &context) const
550*35238bceSAndroid Build Coastguard Worker {
551*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 texScale(m_uniforms[2].value.f4);
552*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 texBias(m_uniforms[3].value.f4);
553*35238bceSAndroid Build Coastguard Worker
554*35238bceSAndroid Build Coastguard Worker tcu::Vec3 texCoords[4];
555*35238bceSAndroid Build Coastguard Worker tcu::Vec4 colors[4];
556*35238bceSAndroid Build Coastguard Worker
557*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
558*35238bceSAndroid Build Coastguard Worker {
559*35238bceSAndroid Build Coastguard Worker const sglr::rc::TextureCube *tex = m_uniforms[1].sampler.texCube;
560*35238bceSAndroid Build Coastguard Worker
561*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
562*35238bceSAndroid Build Coastguard Worker {
563*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 coord = rr::readTriangleVarying<float>(packets[packetNdx], context, 0, fragNdx);
564*35238bceSAndroid Build Coastguard Worker texCoords[fragNdx] = tcu::Vec3(coord.x(), coord.y(), coord.z());
565*35238bceSAndroid Build Coastguard Worker }
566*35238bceSAndroid Build Coastguard Worker
567*35238bceSAndroid Build Coastguard Worker tex->sample4(colors, texCoords);
568*35238bceSAndroid Build Coastguard Worker
569*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
570*35238bceSAndroid Build Coastguard Worker {
571*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 color = colors[fragNdx] * texScale + texBias;
572*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 icolor = castVectorSaturate<int32_t>(color);
573*35238bceSAndroid Build Coastguard Worker const tcu::UVec4 uicolor = castVectorSaturate<uint32_t>(color);
574*35238bceSAndroid Build Coastguard Worker
575*35238bceSAndroid Build Coastguard Worker if (m_outputType == glu::TYPE_FLOAT_VEC4)
576*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color);
577*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_INT_VEC4)
578*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, icolor);
579*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_UINT_VEC4)
580*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, uicolor);
581*35238bceSAndroid Build Coastguard Worker else
582*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
583*35238bceSAndroid Build Coastguard Worker }
584*35238bceSAndroid Build Coastguard Worker }
585*35238bceSAndroid Build Coastguard Worker }
586*35238bceSAndroid Build Coastguard Worker
Texture2DArrayShader(glu::DataType samplerType,glu::DataType outputType)587*35238bceSAndroid Build Coastguard Worker Texture2DArrayShader::Texture2DArrayShader(glu::DataType samplerType, glu::DataType outputType)
588*35238bceSAndroid Build Coastguard Worker : sglr::ShaderProgram(
589*35238bceSAndroid Build Coastguard Worker sglr::pdec::ShaderProgramDeclaration()
590*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexAttribute("a_position", rr::GENERICVECTYPE_FLOAT)
591*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexAttribute("a_coord", rr::GENERICVECTYPE_FLOAT)
592*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexToFragmentVarying(rr::GENERICVECTYPE_FLOAT)
593*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentOutput(mapDataTypeToGenericVecType(outputType))
594*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_sampler0", samplerType) << sglr::pdec::Uniform("u_scale", glu::TYPE_FLOAT_VEC4)
595*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_bias", glu::TYPE_FLOAT_VEC4) << sglr::pdec::Uniform("u_layer", glu::TYPE_INT)
596*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexSource("#version 300 es\n"
597*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
598*35238bceSAndroid Build Coastguard Worker "in highp vec2 a_coord;\n"
599*35238bceSAndroid Build Coastguard Worker "out highp vec2 v_coord;\n"
600*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
601*35238bceSAndroid Build Coastguard Worker "{\n"
602*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
603*35238bceSAndroid Build Coastguard Worker " v_coord = a_coord;\n"
604*35238bceSAndroid Build Coastguard Worker "}\n")
605*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentSource(string("") +
606*35238bceSAndroid Build Coastguard Worker "#version 300 es\n"
607*35238bceSAndroid Build Coastguard Worker "uniform highp " +
608*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(samplerType) +
609*35238bceSAndroid Build Coastguard Worker " u_sampler0;\n"
610*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_scale;\n"
611*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_bias;\n"
612*35238bceSAndroid Build Coastguard Worker "uniform highp int u_layer;\n"
613*35238bceSAndroid Build Coastguard Worker "in highp vec2 v_coord;\n"
614*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out highp " +
615*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
616*35238bceSAndroid Build Coastguard Worker " o_color;\n"
617*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
618*35238bceSAndroid Build Coastguard Worker "{\n"
619*35238bceSAndroid Build Coastguard Worker " o_color = " +
620*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
621*35238bceSAndroid Build Coastguard Worker "(vec4(texture(u_sampler0, vec3(v_coord, u_layer))) * u_scale + u_bias);\n"
622*35238bceSAndroid Build Coastguard Worker "}\n"))
623*35238bceSAndroid Build Coastguard Worker , m_texScale(1.0f)
624*35238bceSAndroid Build Coastguard Worker , m_texBias(0.0f)
625*35238bceSAndroid Build Coastguard Worker , m_layer(0)
626*35238bceSAndroid Build Coastguard Worker , m_outputType(outputType)
627*35238bceSAndroid Build Coastguard Worker {
628*35238bceSAndroid Build Coastguard Worker }
629*35238bceSAndroid Build Coastguard Worker
setLayer(int layer)630*35238bceSAndroid Build Coastguard Worker void Texture2DArrayShader::setLayer(int layer)
631*35238bceSAndroid Build Coastguard Worker {
632*35238bceSAndroid Build Coastguard Worker m_layer = layer;
633*35238bceSAndroid Build Coastguard Worker }
634*35238bceSAndroid Build Coastguard Worker
setTexScaleBias(const Vec4 & scale,const Vec4 & bias)635*35238bceSAndroid Build Coastguard Worker void Texture2DArrayShader::setTexScaleBias(const Vec4 &scale, const Vec4 &bias)
636*35238bceSAndroid Build Coastguard Worker {
637*35238bceSAndroid Build Coastguard Worker m_texScale = scale;
638*35238bceSAndroid Build Coastguard Worker m_texBias = bias;
639*35238bceSAndroid Build Coastguard Worker }
640*35238bceSAndroid Build Coastguard Worker
setUniforms(sglr::Context & gl,uint32_t program) const641*35238bceSAndroid Build Coastguard Worker void Texture2DArrayShader::setUniforms(sglr::Context &gl, uint32_t program) const
642*35238bceSAndroid Build Coastguard Worker {
643*35238bceSAndroid Build Coastguard Worker gl.useProgram(program);
644*35238bceSAndroid Build Coastguard Worker
645*35238bceSAndroid Build Coastguard Worker gl.uniform1i(gl.getUniformLocation(program, "u_sampler0"), 0);
646*35238bceSAndroid Build Coastguard Worker gl.uniform1i(gl.getUniformLocation(program, "u_layer"), m_layer);
647*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, "u_scale"), 1, m_texScale.getPtr());
648*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, "u_bias"), 1, m_texBias.getPtr());
649*35238bceSAndroid Build Coastguard Worker }
650*35238bceSAndroid Build Coastguard Worker
shadeVertices(const rr::VertexAttrib * inputs,rr::VertexPacket * const * packets,const int numPackets) const651*35238bceSAndroid Build Coastguard Worker void Texture2DArrayShader::shadeVertices(const rr::VertexAttrib *inputs, rr::VertexPacket *const *packets,
652*35238bceSAndroid Build Coastguard Worker const int numPackets) const
653*35238bceSAndroid Build Coastguard Worker {
654*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
655*35238bceSAndroid Build Coastguard Worker {
656*35238bceSAndroid Build Coastguard Worker rr::VertexPacket &packet = *packets[packetNdx];
657*35238bceSAndroid Build Coastguard Worker
658*35238bceSAndroid Build Coastguard Worker packet.position = rr::readVertexAttribFloat(inputs[0], packet.instanceNdx, packet.vertexNdx);
659*35238bceSAndroid Build Coastguard Worker packet.outputs[0] = rr::readVertexAttribFloat(inputs[1], packet.instanceNdx, packet.vertexNdx);
660*35238bceSAndroid Build Coastguard Worker }
661*35238bceSAndroid Build Coastguard Worker }
662*35238bceSAndroid Build Coastguard Worker
shadeFragments(rr::FragmentPacket * packets,const int numPackets,const rr::FragmentShadingContext & context) const663*35238bceSAndroid Build Coastguard Worker void Texture2DArrayShader::shadeFragments(rr::FragmentPacket *packets, const int numPackets,
664*35238bceSAndroid Build Coastguard Worker const rr::FragmentShadingContext &context) const
665*35238bceSAndroid Build Coastguard Worker {
666*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 texScale(m_uniforms[1].value.f4);
667*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 texBias(m_uniforms[2].value.f4);
668*35238bceSAndroid Build Coastguard Worker const int layer = m_uniforms[3].value.i;
669*35238bceSAndroid Build Coastguard Worker
670*35238bceSAndroid Build Coastguard Worker tcu::Vec3 texCoords[4];
671*35238bceSAndroid Build Coastguard Worker tcu::Vec4 colors[4];
672*35238bceSAndroid Build Coastguard Worker
673*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
674*35238bceSAndroid Build Coastguard Worker {
675*35238bceSAndroid Build Coastguard Worker const sglr::rc::Texture2DArray *tex = m_uniforms[0].sampler.tex2DArray;
676*35238bceSAndroid Build Coastguard Worker
677*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
678*35238bceSAndroid Build Coastguard Worker {
679*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 coord = rr::readTriangleVarying<float>(packets[packetNdx], context, 0, fragNdx);
680*35238bceSAndroid Build Coastguard Worker texCoords[fragNdx] = tcu::Vec3(coord.x(), coord.y(), float(layer));
681*35238bceSAndroid Build Coastguard Worker }
682*35238bceSAndroid Build Coastguard Worker
683*35238bceSAndroid Build Coastguard Worker tex->sample4(colors, texCoords);
684*35238bceSAndroid Build Coastguard Worker
685*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
686*35238bceSAndroid Build Coastguard Worker {
687*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 color = colors[fragNdx] * texScale + texBias;
688*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 icolor = castVectorSaturate<int32_t>(color);
689*35238bceSAndroid Build Coastguard Worker const tcu::UVec4 uicolor = castVectorSaturate<uint32_t>(color);
690*35238bceSAndroid Build Coastguard Worker
691*35238bceSAndroid Build Coastguard Worker if (m_outputType == glu::TYPE_FLOAT_VEC4)
692*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color);
693*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_INT_VEC4)
694*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, icolor);
695*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_UINT_VEC4)
696*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, uicolor);
697*35238bceSAndroid Build Coastguard Worker else
698*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
699*35238bceSAndroid Build Coastguard Worker }
700*35238bceSAndroid Build Coastguard Worker }
701*35238bceSAndroid Build Coastguard Worker }
702*35238bceSAndroid Build Coastguard Worker
Texture3DShader(glu::DataType samplerType,glu::DataType outputType)703*35238bceSAndroid Build Coastguard Worker Texture3DShader::Texture3DShader(glu::DataType samplerType, glu::DataType outputType)
704*35238bceSAndroid Build Coastguard Worker : sglr::ShaderProgram(
705*35238bceSAndroid Build Coastguard Worker sglr::pdec::ShaderProgramDeclaration()
706*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexAttribute("a_position", rr::GENERICVECTYPE_FLOAT)
707*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexAttribute("a_coord", rr::GENERICVECTYPE_FLOAT)
708*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexToFragmentVarying(rr::GENERICVECTYPE_FLOAT)
709*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentOutput(mapDataTypeToGenericVecType(outputType))
710*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_sampler0", samplerType) << sglr::pdec::Uniform("u_scale", glu::TYPE_FLOAT_VEC4)
711*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_bias", glu::TYPE_FLOAT_VEC4) << sglr::pdec::Uniform("u_depth", glu::TYPE_FLOAT)
712*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexSource("#version 300 es\n"
713*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
714*35238bceSAndroid Build Coastguard Worker "in highp vec2 a_coord;\n"
715*35238bceSAndroid Build Coastguard Worker "out highp vec2 v_coord;\n"
716*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
717*35238bceSAndroid Build Coastguard Worker "{\n"
718*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
719*35238bceSAndroid Build Coastguard Worker " v_coord = a_coord;\n"
720*35238bceSAndroid Build Coastguard Worker "}\n")
721*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentSource(string("") +
722*35238bceSAndroid Build Coastguard Worker "#version 300 es\n"
723*35238bceSAndroid Build Coastguard Worker "uniform highp " +
724*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(samplerType) +
725*35238bceSAndroid Build Coastguard Worker " u_sampler0;\n"
726*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_scale;\n"
727*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_bias;\n"
728*35238bceSAndroid Build Coastguard Worker "uniform highp float u_depth;\n"
729*35238bceSAndroid Build Coastguard Worker "in highp vec2 v_coord;\n"
730*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out highp " +
731*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
732*35238bceSAndroid Build Coastguard Worker " o_color;\n"
733*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
734*35238bceSAndroid Build Coastguard Worker "{\n"
735*35238bceSAndroid Build Coastguard Worker " o_color = " +
736*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
737*35238bceSAndroid Build Coastguard Worker "(vec4(texture(u_sampler0, vec3(v_coord, u_depth))) * u_scale + u_bias);\n"
738*35238bceSAndroid Build Coastguard Worker "}\n"))
739*35238bceSAndroid Build Coastguard Worker , m_texScale(1.0f)
740*35238bceSAndroid Build Coastguard Worker , m_texBias(0.0f)
741*35238bceSAndroid Build Coastguard Worker , m_depth(0.0f)
742*35238bceSAndroid Build Coastguard Worker , m_outputType(outputType)
743*35238bceSAndroid Build Coastguard Worker {
744*35238bceSAndroid Build Coastguard Worker }
745*35238bceSAndroid Build Coastguard Worker
setDepth(float depth)746*35238bceSAndroid Build Coastguard Worker void Texture3DShader::setDepth(float depth)
747*35238bceSAndroid Build Coastguard Worker {
748*35238bceSAndroid Build Coastguard Worker m_depth = depth;
749*35238bceSAndroid Build Coastguard Worker }
750*35238bceSAndroid Build Coastguard Worker
setTexScaleBias(const Vec4 & scale,const Vec4 & bias)751*35238bceSAndroid Build Coastguard Worker void Texture3DShader::setTexScaleBias(const Vec4 &scale, const Vec4 &bias)
752*35238bceSAndroid Build Coastguard Worker {
753*35238bceSAndroid Build Coastguard Worker m_texScale = scale;
754*35238bceSAndroid Build Coastguard Worker m_texBias = bias;
755*35238bceSAndroid Build Coastguard Worker }
756*35238bceSAndroid Build Coastguard Worker
setUniforms(sglr::Context & gl,uint32_t program) const757*35238bceSAndroid Build Coastguard Worker void Texture3DShader::setUniforms(sglr::Context &gl, uint32_t program) const
758*35238bceSAndroid Build Coastguard Worker {
759*35238bceSAndroid Build Coastguard Worker gl.useProgram(program);
760*35238bceSAndroid Build Coastguard Worker
761*35238bceSAndroid Build Coastguard Worker gl.uniform1i(gl.getUniformLocation(program, "u_sampler0"), 0);
762*35238bceSAndroid Build Coastguard Worker gl.uniform1f(gl.getUniformLocation(program, "u_depth"), m_depth);
763*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, "u_scale"), 1, m_texScale.getPtr());
764*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(gl.getUniformLocation(program, "u_bias"), 1, m_texBias.getPtr());
765*35238bceSAndroid Build Coastguard Worker }
766*35238bceSAndroid Build Coastguard Worker
shadeVertices(const rr::VertexAttrib * inputs,rr::VertexPacket * const * packets,const int numPackets) const767*35238bceSAndroid Build Coastguard Worker void Texture3DShader::shadeVertices(const rr::VertexAttrib *inputs, rr::VertexPacket *const *packets,
768*35238bceSAndroid Build Coastguard Worker const int numPackets) const
769*35238bceSAndroid Build Coastguard Worker {
770*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
771*35238bceSAndroid Build Coastguard Worker {
772*35238bceSAndroid Build Coastguard Worker rr::VertexPacket &packet = *packets[packetNdx];
773*35238bceSAndroid Build Coastguard Worker
774*35238bceSAndroid Build Coastguard Worker packet.position = rr::readVertexAttribFloat(inputs[0], packet.instanceNdx, packet.vertexNdx);
775*35238bceSAndroid Build Coastguard Worker packet.outputs[0] = rr::readVertexAttribFloat(inputs[1], packet.instanceNdx, packet.vertexNdx);
776*35238bceSAndroid Build Coastguard Worker }
777*35238bceSAndroid Build Coastguard Worker }
778*35238bceSAndroid Build Coastguard Worker
shadeFragments(rr::FragmentPacket * packets,const int numPackets,const rr::FragmentShadingContext & context) const779*35238bceSAndroid Build Coastguard Worker void Texture3DShader::shadeFragments(rr::FragmentPacket *packets, const int numPackets,
780*35238bceSAndroid Build Coastguard Worker const rr::FragmentShadingContext &context) const
781*35238bceSAndroid Build Coastguard Worker {
782*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 texScale(m_uniforms[1].value.f4);
783*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 texBias(m_uniforms[2].value.f4);
784*35238bceSAndroid Build Coastguard Worker const float depth = m_uniforms[3].value.f;
785*35238bceSAndroid Build Coastguard Worker
786*35238bceSAndroid Build Coastguard Worker tcu::Vec3 texCoords[4];
787*35238bceSAndroid Build Coastguard Worker tcu::Vec4 colors[4];
788*35238bceSAndroid Build Coastguard Worker
789*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
790*35238bceSAndroid Build Coastguard Worker {
791*35238bceSAndroid Build Coastguard Worker const sglr::rc::Texture3D *tex = m_uniforms[0].sampler.tex3D;
792*35238bceSAndroid Build Coastguard Worker
793*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
794*35238bceSAndroid Build Coastguard Worker {
795*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 coord = rr::readTriangleVarying<float>(packets[packetNdx], context, 0, fragNdx);
796*35238bceSAndroid Build Coastguard Worker texCoords[fragNdx] = tcu::Vec3(coord.x(), coord.y(), depth);
797*35238bceSAndroid Build Coastguard Worker }
798*35238bceSAndroid Build Coastguard Worker
799*35238bceSAndroid Build Coastguard Worker tex->sample4(colors, texCoords);
800*35238bceSAndroid Build Coastguard Worker
801*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
802*35238bceSAndroid Build Coastguard Worker {
803*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 color = colors[fragNdx] * texScale + texBias;
804*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 icolor = castVectorSaturate<int32_t>(color);
805*35238bceSAndroid Build Coastguard Worker const tcu::UVec4 uicolor = castVectorSaturate<uint32_t>(color);
806*35238bceSAndroid Build Coastguard Worker
807*35238bceSAndroid Build Coastguard Worker if (m_outputType == glu::TYPE_FLOAT_VEC4)
808*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color);
809*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_INT_VEC4)
810*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, icolor);
811*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_UINT_VEC4)
812*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, uicolor);
813*35238bceSAndroid Build Coastguard Worker else
814*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
815*35238bceSAndroid Build Coastguard Worker }
816*35238bceSAndroid Build Coastguard Worker }
817*35238bceSAndroid Build Coastguard Worker }
818*35238bceSAndroid Build Coastguard Worker
DepthGradientShader(glu::DataType outputType)819*35238bceSAndroid Build Coastguard Worker DepthGradientShader::DepthGradientShader(glu::DataType outputType)
820*35238bceSAndroid Build Coastguard Worker : ShaderProgram(
821*35238bceSAndroid Build Coastguard Worker sglr::pdec::ShaderProgramDeclaration()
822*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexAttribute("a_position", rr::GENERICVECTYPE_FLOAT)
823*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexAttribute("a_coord", rr::GENERICVECTYPE_FLOAT)
824*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexToFragmentVarying(rr::GENERICVECTYPE_FLOAT)
825*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentOutput(mapDataTypeToGenericVecType(outputType))
826*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_maxGradient", glu::TYPE_FLOAT)
827*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_minGradient", glu::TYPE_FLOAT)
828*35238bceSAndroid Build Coastguard Worker << sglr::pdec::Uniform("u_color", glu::TYPE_FLOAT_VEC4)
829*35238bceSAndroid Build Coastguard Worker << sglr::pdec::VertexSource("#version 300 es\n"
830*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
831*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_coord;\n"
832*35238bceSAndroid Build Coastguard Worker "out highp vec4 v_coord;\n"
833*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
834*35238bceSAndroid Build Coastguard Worker "{\n"
835*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
836*35238bceSAndroid Build Coastguard Worker " v_coord = a_coord;\n"
837*35238bceSAndroid Build Coastguard Worker "}\n")
838*35238bceSAndroid Build Coastguard Worker << sglr::pdec::FragmentSource(string("#version 300 es\n"
839*35238bceSAndroid Build Coastguard Worker "in highp vec4 v_coord;\n"
840*35238bceSAndroid Build Coastguard Worker "uniform highp float u_minGradient;\n"
841*35238bceSAndroid Build Coastguard Worker "uniform highp float u_maxGradient;\n"
842*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_color;\n"
843*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out highp ") +
844*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
845*35238bceSAndroid Build Coastguard Worker " o_color;\n"
846*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
847*35238bceSAndroid Build Coastguard Worker "{\n"
848*35238bceSAndroid Build Coastguard Worker " highp float x = v_coord.x;\n"
849*35238bceSAndroid Build Coastguard Worker " highp float y = v_coord.y;\n"
850*35238bceSAndroid Build Coastguard Worker " highp float f0 = (x + y) * 0.5;\n"
851*35238bceSAndroid Build Coastguard Worker " gl_FragDepth = u_minGradient + (u_maxGradient-u_minGradient)*f0;\n"
852*35238bceSAndroid Build Coastguard Worker " o_color = " +
853*35238bceSAndroid Build Coastguard Worker glu::getDataTypeName(outputType) +
854*35238bceSAndroid Build Coastguard Worker "(u_color);\n"
855*35238bceSAndroid Build Coastguard Worker "}\n"))
856*35238bceSAndroid Build Coastguard Worker , m_outputType(outputType)
857*35238bceSAndroid Build Coastguard Worker , u_minGradient(getUniformByName("u_minGradient"))
858*35238bceSAndroid Build Coastguard Worker , u_maxGradient(getUniformByName("u_maxGradient"))
859*35238bceSAndroid Build Coastguard Worker , u_color(getUniformByName("u_color"))
860*35238bceSAndroid Build Coastguard Worker {
861*35238bceSAndroid Build Coastguard Worker }
862*35238bceSAndroid Build Coastguard Worker
setUniforms(sglr::Context & ctx,uint32_t program,const float gradientMin,const float gradientMax,const tcu::Vec4 & color)863*35238bceSAndroid Build Coastguard Worker void DepthGradientShader::setUniforms(sglr::Context &ctx, uint32_t program, const float gradientMin,
864*35238bceSAndroid Build Coastguard Worker const float gradientMax, const tcu::Vec4 &color)
865*35238bceSAndroid Build Coastguard Worker {
866*35238bceSAndroid Build Coastguard Worker ctx.useProgram(program);
867*35238bceSAndroid Build Coastguard Worker ctx.uniform1fv(ctx.getUniformLocation(program, "u_minGradient"), 1, &gradientMin);
868*35238bceSAndroid Build Coastguard Worker ctx.uniform1fv(ctx.getUniformLocation(program, "u_maxGradient"), 1, &gradientMax);
869*35238bceSAndroid Build Coastguard Worker ctx.uniform4fv(ctx.getUniformLocation(program, "u_color"), 1, color.getPtr());
870*35238bceSAndroid Build Coastguard Worker }
871*35238bceSAndroid Build Coastguard Worker
shadeVertices(const rr::VertexAttrib * inputs,rr::VertexPacket * const * packets,const int numPackets) const872*35238bceSAndroid Build Coastguard Worker void DepthGradientShader::shadeVertices(const rr::VertexAttrib *inputs, rr::VertexPacket *const *packets,
873*35238bceSAndroid Build Coastguard Worker const int numPackets) const
874*35238bceSAndroid Build Coastguard Worker {
875*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
876*35238bceSAndroid Build Coastguard Worker {
877*35238bceSAndroid Build Coastguard Worker rr::VertexPacket &packet = *packets[packetNdx];
878*35238bceSAndroid Build Coastguard Worker
879*35238bceSAndroid Build Coastguard Worker packet.position = rr::readVertexAttribFloat(inputs[0], packet.instanceNdx, packet.vertexNdx);
880*35238bceSAndroid Build Coastguard Worker packet.outputs[0] = rr::readVertexAttribFloat(inputs[1], packet.instanceNdx, packet.vertexNdx);
881*35238bceSAndroid Build Coastguard Worker }
882*35238bceSAndroid Build Coastguard Worker }
883*35238bceSAndroid Build Coastguard Worker
shadeFragments(rr::FragmentPacket * packets,const int numPackets,const rr::FragmentShadingContext & context) const884*35238bceSAndroid Build Coastguard Worker void DepthGradientShader::shadeFragments(rr::FragmentPacket *packets, const int numPackets,
885*35238bceSAndroid Build Coastguard Worker const rr::FragmentShadingContext &context) const
886*35238bceSAndroid Build Coastguard Worker {
887*35238bceSAndroid Build Coastguard Worker const float gradientMin(u_minGradient.value.f);
888*35238bceSAndroid Build Coastguard Worker const float gradientMax(u_maxGradient.value.f);
889*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 color(u_color.value.f4);
890*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 icolor(castVectorSaturate<int32_t>(color));
891*35238bceSAndroid Build Coastguard Worker const tcu::UVec4 uicolor(castVectorSaturate<uint32_t>(color));
892*35238bceSAndroid Build Coastguard Worker
893*35238bceSAndroid Build Coastguard Worker // running this shader without a depth buffer does not make any sense
894*35238bceSAndroid Build Coastguard Worker DE_ASSERT(context.fragmentDepths);
895*35238bceSAndroid Build Coastguard Worker
896*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
897*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
898*35238bceSAndroid Build Coastguard Worker {
899*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 coord = rr::readTriangleVarying<float>(packets[packetNdx], context, 0, fragNdx);
900*35238bceSAndroid Build Coastguard Worker const float x = coord.x();
901*35238bceSAndroid Build Coastguard Worker const float y = coord.y();
902*35238bceSAndroid Build Coastguard Worker const float f0 = (x + y) * 0.5f;
903*35238bceSAndroid Build Coastguard Worker
904*35238bceSAndroid Build Coastguard Worker rr::writeFragmentDepth(context, packetNdx, fragNdx, 0, gradientMin + (gradientMax - gradientMin) * f0);
905*35238bceSAndroid Build Coastguard Worker
906*35238bceSAndroid Build Coastguard Worker if (m_outputType == glu::TYPE_FLOAT_VEC4)
907*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color);
908*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_INT_VEC4)
909*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, icolor);
910*35238bceSAndroid Build Coastguard Worker else if (m_outputType == glu::TYPE_UINT_VEC4)
911*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, uicolor);
912*35238bceSAndroid Build Coastguard Worker else
913*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
914*35238bceSAndroid Build Coastguard Worker }
915*35238bceSAndroid Build Coastguard Worker }
916*35238bceSAndroid Build Coastguard Worker
clearColorBuffer(sglr::Context & ctx,const tcu::TextureFormat & format,const tcu::Vec4 & value)917*35238bceSAndroid Build Coastguard Worker void clearColorBuffer(sglr::Context &ctx, const tcu::TextureFormat &format, const tcu::Vec4 &value)
918*35238bceSAndroid Build Coastguard Worker {
919*35238bceSAndroid Build Coastguard Worker const tcu::TextureChannelClass fmtClass = tcu::getTextureChannelClass(format.type);
920*35238bceSAndroid Build Coastguard Worker
921*35238bceSAndroid Build Coastguard Worker switch (fmtClass)
922*35238bceSAndroid Build Coastguard Worker {
923*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
924*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
925*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
926*35238bceSAndroid Build Coastguard Worker ctx.clearBufferfv(GL_COLOR, 0, value.getPtr());
927*35238bceSAndroid Build Coastguard Worker break;
928*35238bceSAndroid Build Coastguard Worker
929*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
930*35238bceSAndroid Build Coastguard Worker ctx.clearBufferuiv(GL_COLOR, 0, value.asUint().getPtr());
931*35238bceSAndroid Build Coastguard Worker break;
932*35238bceSAndroid Build Coastguard Worker
933*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
934*35238bceSAndroid Build Coastguard Worker ctx.clearBufferiv(GL_COLOR, 0, value.asInt().getPtr());
935*35238bceSAndroid Build Coastguard Worker break;
936*35238bceSAndroid Build Coastguard Worker
937*35238bceSAndroid Build Coastguard Worker default:
938*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
939*35238bceSAndroid Build Coastguard Worker }
940*35238bceSAndroid Build Coastguard Worker }
941*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)942*35238bceSAndroid Build Coastguard Worker void readPixels(sglr::Context &ctx, tcu::Surface &dst, int x, int y, int width, int height,
943*35238bceSAndroid Build Coastguard Worker const tcu::TextureFormat &format, const tcu::Vec4 &scale, const tcu::Vec4 &bias)
944*35238bceSAndroid Build Coastguard Worker {
945*35238bceSAndroid Build Coastguard Worker tcu::TextureFormat readFormat = getFramebufferReadFormat(format);
946*35238bceSAndroid Build Coastguard Worker glu::TransferFormat transferFmt = glu::getTransferFormat(readFormat);
947*35238bceSAndroid Build Coastguard Worker int alignment = 4; // \note GL_PACK_ALIGNMENT = 4 is assumed.
948*35238bceSAndroid Build Coastguard Worker int rowSize = deAlign32(readFormat.getPixelSize() * width, alignment);
949*35238bceSAndroid Build Coastguard Worker vector<uint8_t> data(rowSize * height);
950*35238bceSAndroid Build Coastguard Worker
951*35238bceSAndroid Build Coastguard Worker ctx.readPixels(x, y, width, height, transferFmt.format, transferFmt.dataType, &data[0]);
952*35238bceSAndroid Build Coastguard Worker
953*35238bceSAndroid Build Coastguard Worker // Convert to surface.
954*35238bceSAndroid Build Coastguard Worker tcu::ConstPixelBufferAccess src(readFormat, width, height, 1, rowSize, 0, &data[0]);
955*35238bceSAndroid Build Coastguard Worker
956*35238bceSAndroid Build Coastguard Worker dst.setSize(width, height);
957*35238bceSAndroid Build Coastguard Worker tcu::PixelBufferAccess dstAccess = dst.getAccess();
958*35238bceSAndroid Build Coastguard Worker
959*35238bceSAndroid Build Coastguard Worker for (int yo = 0; yo < height; yo++)
960*35238bceSAndroid Build Coastguard Worker for (int xo = 0; xo < width; xo++)
961*35238bceSAndroid Build Coastguard Worker dstAccess.setPixel(src.getPixel(xo, yo) * scale + bias, xo, yo);
962*35238bceSAndroid Build Coastguard Worker }
963*35238bceSAndroid Build Coastguard Worker
getFboIncompleteReasonName(uint32_t reason)964*35238bceSAndroid Build Coastguard Worker static const char *getFboIncompleteReasonName(uint32_t reason)
965*35238bceSAndroid Build Coastguard Worker {
966*35238bceSAndroid Build Coastguard Worker switch (reason)
967*35238bceSAndroid Build Coastguard Worker {
968*35238bceSAndroid Build Coastguard Worker case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
969*35238bceSAndroid Build Coastguard Worker return "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT";
970*35238bceSAndroid Build Coastguard Worker case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
971*35238bceSAndroid Build Coastguard Worker return "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";
972*35238bceSAndroid Build Coastguard Worker case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
973*35238bceSAndroid Build Coastguard Worker return "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS";
974*35238bceSAndroid Build Coastguard Worker case GL_FRAMEBUFFER_UNSUPPORTED:
975*35238bceSAndroid Build Coastguard Worker return "GL_FRAMEBUFFER_UNSUPPORTED";
976*35238bceSAndroid Build Coastguard Worker case GL_FRAMEBUFFER_COMPLETE:
977*35238bceSAndroid Build Coastguard Worker return "GL_FRAMEBUFFER_COMPLETE";
978*35238bceSAndroid Build Coastguard Worker default:
979*35238bceSAndroid Build Coastguard Worker return "UNKNOWN";
980*35238bceSAndroid Build Coastguard Worker }
981*35238bceSAndroid Build Coastguard Worker }
982*35238bceSAndroid Build Coastguard Worker
FboIncompleteException(uint32_t reason,const char * file,int line)983*35238bceSAndroid Build Coastguard Worker FboIncompleteException::FboIncompleteException(uint32_t reason, const char *file, int line)
984*35238bceSAndroid Build Coastguard Worker : TestError("Framebuffer is not complete", getFboIncompleteReasonName(reason), file, line)
985*35238bceSAndroid Build Coastguard Worker , m_reason(reason)
986*35238bceSAndroid Build Coastguard Worker {
987*35238bceSAndroid Build Coastguard Worker }
988*35238bceSAndroid Build Coastguard Worker
getFormatName(uint32_t format)989*35238bceSAndroid Build Coastguard Worker const char *getFormatName(uint32_t format)
990*35238bceSAndroid Build Coastguard Worker {
991*35238bceSAndroid Build Coastguard Worker switch (format)
992*35238bceSAndroid Build Coastguard Worker {
993*35238bceSAndroid Build Coastguard Worker case GL_RGB565:
994*35238bceSAndroid Build Coastguard Worker return "rgb565";
995*35238bceSAndroid Build Coastguard Worker case GL_RGB5_A1:
996*35238bceSAndroid Build Coastguard Worker return "rgb5_a1";
997*35238bceSAndroid Build Coastguard Worker case GL_RGBA4:
998*35238bceSAndroid Build Coastguard Worker return "rgba4";
999*35238bceSAndroid Build Coastguard Worker case GL_DEPTH_COMPONENT16:
1000*35238bceSAndroid Build Coastguard Worker return "depth_component16";
1001*35238bceSAndroid Build Coastguard Worker case GL_STENCIL_INDEX8:
1002*35238bceSAndroid Build Coastguard Worker return "stencil_index8";
1003*35238bceSAndroid Build Coastguard Worker case GL_RGBA32F:
1004*35238bceSAndroid Build Coastguard Worker return "rgba32f";
1005*35238bceSAndroid Build Coastguard Worker case GL_RGBA32I:
1006*35238bceSAndroid Build Coastguard Worker return "rgba32i";
1007*35238bceSAndroid Build Coastguard Worker case GL_RGBA32UI:
1008*35238bceSAndroid Build Coastguard Worker return "rgba32ui";
1009*35238bceSAndroid Build Coastguard Worker case GL_RGBA16F:
1010*35238bceSAndroid Build Coastguard Worker return "rgba16f";
1011*35238bceSAndroid Build Coastguard Worker case GL_RGBA16I:
1012*35238bceSAndroid Build Coastguard Worker return "rgba16i";
1013*35238bceSAndroid Build Coastguard Worker case GL_RGBA16UI:
1014*35238bceSAndroid Build Coastguard Worker return "rgba16ui";
1015*35238bceSAndroid Build Coastguard Worker case GL_RGBA8:
1016*35238bceSAndroid Build Coastguard Worker return "rgba8";
1017*35238bceSAndroid Build Coastguard Worker case GL_RGBA8I:
1018*35238bceSAndroid Build Coastguard Worker return "rgba8i";
1019*35238bceSAndroid Build Coastguard Worker case GL_RGBA8UI:
1020*35238bceSAndroid Build Coastguard Worker return "rgba8ui";
1021*35238bceSAndroid Build Coastguard Worker case GL_SRGB8_ALPHA8:
1022*35238bceSAndroid Build Coastguard Worker return "srgb8_alpha8";
1023*35238bceSAndroid Build Coastguard Worker case GL_RGB10_A2:
1024*35238bceSAndroid Build Coastguard Worker return "rgb10_a2";
1025*35238bceSAndroid Build Coastguard Worker case GL_RGB10_A2UI:
1026*35238bceSAndroid Build Coastguard Worker return "rgb10_a2ui";
1027*35238bceSAndroid Build Coastguard Worker case GL_RGBA8_SNORM:
1028*35238bceSAndroid Build Coastguard Worker return "rgba8_snorm";
1029*35238bceSAndroid Build Coastguard Worker case GL_RGB8:
1030*35238bceSAndroid Build Coastguard Worker return "rgb8";
1031*35238bceSAndroid Build Coastguard Worker case GL_R11F_G11F_B10F:
1032*35238bceSAndroid Build Coastguard Worker return "r11f_g11f_b10f";
1033*35238bceSAndroid Build Coastguard Worker case GL_RGB32F:
1034*35238bceSAndroid Build Coastguard Worker return "rgb32f";
1035*35238bceSAndroid Build Coastguard Worker case GL_RGB32I:
1036*35238bceSAndroid Build Coastguard Worker return "rgb32i";
1037*35238bceSAndroid Build Coastguard Worker case GL_RGB32UI:
1038*35238bceSAndroid Build Coastguard Worker return "rgb32ui";
1039*35238bceSAndroid Build Coastguard Worker case GL_RGB16F:
1040*35238bceSAndroid Build Coastguard Worker return "rgb16f";
1041*35238bceSAndroid Build Coastguard Worker case GL_RGB16I:
1042*35238bceSAndroid Build Coastguard Worker return "rgb16i";
1043*35238bceSAndroid Build Coastguard Worker case GL_RGB16UI:
1044*35238bceSAndroid Build Coastguard Worker return "rgb16ui";
1045*35238bceSAndroid Build Coastguard Worker case GL_RGB8_SNORM:
1046*35238bceSAndroid Build Coastguard Worker return "rgb8_snorm";
1047*35238bceSAndroid Build Coastguard Worker case GL_RGB8I:
1048*35238bceSAndroid Build Coastguard Worker return "rgb8i";
1049*35238bceSAndroid Build Coastguard Worker case GL_RGB8UI:
1050*35238bceSAndroid Build Coastguard Worker return "rgb8ui";
1051*35238bceSAndroid Build Coastguard Worker case GL_SRGB8:
1052*35238bceSAndroid Build Coastguard Worker return "srgb8";
1053*35238bceSAndroid Build Coastguard Worker case GL_RGB9_E5:
1054*35238bceSAndroid Build Coastguard Worker return "rgb9_e5";
1055*35238bceSAndroid Build Coastguard Worker case GL_RG32F:
1056*35238bceSAndroid Build Coastguard Worker return "rg32f";
1057*35238bceSAndroid Build Coastguard Worker case GL_RG32I:
1058*35238bceSAndroid Build Coastguard Worker return "rg32i";
1059*35238bceSAndroid Build Coastguard Worker case GL_RG32UI:
1060*35238bceSAndroid Build Coastguard Worker return "rg32ui";
1061*35238bceSAndroid Build Coastguard Worker case GL_RG16F:
1062*35238bceSAndroid Build Coastguard Worker return "rg16f";
1063*35238bceSAndroid Build Coastguard Worker case GL_RG16I:
1064*35238bceSAndroid Build Coastguard Worker return "rg16i";
1065*35238bceSAndroid Build Coastguard Worker case GL_RG16UI:
1066*35238bceSAndroid Build Coastguard Worker return "rg16ui";
1067*35238bceSAndroid Build Coastguard Worker case GL_RG8:
1068*35238bceSAndroid Build Coastguard Worker return "rg8";
1069*35238bceSAndroid Build Coastguard Worker case GL_RG8I:
1070*35238bceSAndroid Build Coastguard Worker return "rg8i";
1071*35238bceSAndroid Build Coastguard Worker case GL_RG8UI:
1072*35238bceSAndroid Build Coastguard Worker return "rg8ui";
1073*35238bceSAndroid Build Coastguard Worker case GL_RG8_SNORM:
1074*35238bceSAndroid Build Coastguard Worker return "rg8_snorm";
1075*35238bceSAndroid Build Coastguard Worker case GL_R32F:
1076*35238bceSAndroid Build Coastguard Worker return "r32f";
1077*35238bceSAndroid Build Coastguard Worker case GL_R32I:
1078*35238bceSAndroid Build Coastguard Worker return "r32i";
1079*35238bceSAndroid Build Coastguard Worker case GL_R32UI:
1080*35238bceSAndroid Build Coastguard Worker return "r32ui";
1081*35238bceSAndroid Build Coastguard Worker case GL_R16F:
1082*35238bceSAndroid Build Coastguard Worker return "r16f";
1083*35238bceSAndroid Build Coastguard Worker case GL_R16I:
1084*35238bceSAndroid Build Coastguard Worker return "r16i";
1085*35238bceSAndroid Build Coastguard Worker case GL_R16UI:
1086*35238bceSAndroid Build Coastguard Worker return "r16ui";
1087*35238bceSAndroid Build Coastguard Worker case GL_R8:
1088*35238bceSAndroid Build Coastguard Worker return "r8";
1089*35238bceSAndroid Build Coastguard Worker case GL_R8I:
1090*35238bceSAndroid Build Coastguard Worker return "r8i";
1091*35238bceSAndroid Build Coastguard Worker case GL_R8UI:
1092*35238bceSAndroid Build Coastguard Worker return "r8ui";
1093*35238bceSAndroid Build Coastguard Worker case GL_R8_SNORM:
1094*35238bceSAndroid Build Coastguard Worker return "r8_snorm";
1095*35238bceSAndroid Build Coastguard Worker case GL_DEPTH_COMPONENT32F:
1096*35238bceSAndroid Build Coastguard Worker return "depth_component32f";
1097*35238bceSAndroid Build Coastguard Worker case GL_DEPTH_COMPONENT24:
1098*35238bceSAndroid Build Coastguard Worker return "depth_component24";
1099*35238bceSAndroid Build Coastguard Worker case GL_DEPTH32F_STENCIL8:
1100*35238bceSAndroid Build Coastguard Worker return "depth32f_stencil8";
1101*35238bceSAndroid Build Coastguard Worker case GL_DEPTH24_STENCIL8:
1102*35238bceSAndroid Build Coastguard Worker return "depth24_stencil8";
1103*35238bceSAndroid Build Coastguard Worker
1104*35238bceSAndroid Build Coastguard Worker default:
1105*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Unknown format");
1106*35238bceSAndroid Build Coastguard Worker }
1107*35238bceSAndroid Build Coastguard Worker }
1108*35238bceSAndroid Build Coastguard Worker
getFragmentOutputType(const tcu::TextureFormat & format)1109*35238bceSAndroid Build Coastguard Worker glu::DataType getFragmentOutputType(const tcu::TextureFormat &format)
1110*35238bceSAndroid Build Coastguard Worker {
1111*35238bceSAndroid Build Coastguard Worker switch (tcu::getTextureChannelClass(format.type))
1112*35238bceSAndroid Build Coastguard Worker {
1113*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
1114*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
1115*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
1116*35238bceSAndroid Build Coastguard Worker return glu::TYPE_FLOAT_VEC4;
1117*35238bceSAndroid Build Coastguard Worker
1118*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
1119*35238bceSAndroid Build Coastguard Worker return glu::TYPE_UINT_VEC4;
1120*35238bceSAndroid Build Coastguard Worker
1121*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
1122*35238bceSAndroid Build Coastguard Worker return glu::TYPE_INT_VEC4;
1123*35238bceSAndroid Build Coastguard Worker
1124*35238bceSAndroid Build Coastguard Worker default:
1125*35238bceSAndroid Build Coastguard Worker DE_FATAL("Unknown format");
1126*35238bceSAndroid Build Coastguard Worker return glu::TYPE_LAST;
1127*35238bceSAndroid Build Coastguard Worker }
1128*35238bceSAndroid Build Coastguard Worker }
1129*35238bceSAndroid Build Coastguard Worker
getFramebufferReadFormat(const tcu::TextureFormat & format)1130*35238bceSAndroid Build Coastguard Worker tcu::TextureFormat getFramebufferReadFormat(const tcu::TextureFormat &format)
1131*35238bceSAndroid Build Coastguard Worker {
1132*35238bceSAndroid Build Coastguard Worker switch (tcu::getTextureChannelClass(format.type))
1133*35238bceSAndroid Build Coastguard Worker {
1134*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
1135*35238bceSAndroid Build Coastguard Worker return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT);
1136*35238bceSAndroid Build Coastguard Worker
1137*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
1138*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
1139*35238bceSAndroid Build Coastguard Worker return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
1140*35238bceSAndroid Build Coastguard Worker
1141*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
1142*35238bceSAndroid Build Coastguard Worker return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32);
1143*35238bceSAndroid Build Coastguard Worker
1144*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
1145*35238bceSAndroid Build Coastguard Worker return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32);
1146*35238bceSAndroid Build Coastguard Worker
1147*35238bceSAndroid Build Coastguard Worker default:
1148*35238bceSAndroid Build Coastguard Worker DE_FATAL("Unknown format");
1149*35238bceSAndroid Build Coastguard Worker return tcu::TextureFormat();
1150*35238bceSAndroid Build Coastguard Worker }
1151*35238bceSAndroid Build Coastguard Worker }
1152*35238bceSAndroid Build Coastguard Worker
calculateU8ConversionError(int srcBits)1153*35238bceSAndroid Build Coastguard Worker static int calculateU8ConversionError(int srcBits)
1154*35238bceSAndroid Build Coastguard Worker {
1155*35238bceSAndroid Build Coastguard Worker if (srcBits > 0)
1156*35238bceSAndroid Build Coastguard Worker {
1157*35238bceSAndroid Build Coastguard Worker const int clampedBits = de::clamp<int>(srcBits, 0, 8);
1158*35238bceSAndroid Build Coastguard Worker const int srcMaxValue = de::max((1 << clampedBits) - 1, 1);
1159*35238bceSAndroid Build Coastguard Worker const int error = int(deFloatCeil(255.0f * 2.0f / float(srcMaxValue)));
1160*35238bceSAndroid Build Coastguard Worker
1161*35238bceSAndroid Build Coastguard Worker return de::clamp<int>(error, 0, 255);
1162*35238bceSAndroid Build Coastguard Worker }
1163*35238bceSAndroid Build Coastguard Worker else
1164*35238bceSAndroid Build Coastguard Worker return 1;
1165*35238bceSAndroid Build Coastguard Worker }
1166*35238bceSAndroid Build Coastguard Worker
getFormatThreshold(const tcu::TextureFormat & format)1167*35238bceSAndroid Build Coastguard Worker tcu::RGBA getFormatThreshold(const tcu::TextureFormat &format)
1168*35238bceSAndroid Build Coastguard Worker {
1169*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 bits = tcu::getTextureFormatMantissaBitDepth(format);
1170*35238bceSAndroid Build Coastguard Worker
1171*35238bceSAndroid Build Coastguard Worker return tcu::RGBA(calculateU8ConversionError(bits.x()), calculateU8ConversionError(bits.y()),
1172*35238bceSAndroid Build Coastguard Worker calculateU8ConversionError(bits.z()), calculateU8ConversionError(bits.w()));
1173*35238bceSAndroid Build Coastguard Worker }
1174*35238bceSAndroid Build Coastguard Worker
getFormatThreshold(uint32_t glFormat)1175*35238bceSAndroid Build Coastguard Worker tcu::RGBA getFormatThreshold(uint32_t glFormat)
1176*35238bceSAndroid Build Coastguard Worker {
1177*35238bceSAndroid Build Coastguard Worker const tcu::TextureFormat format = glu::mapGLInternalFormat(glFormat);
1178*35238bceSAndroid Build Coastguard Worker
1179*35238bceSAndroid Build Coastguard Worker return getFormatThreshold(format);
1180*35238bceSAndroid Build Coastguard Worker }
1181*35238bceSAndroid Build Coastguard Worker
getToSRGB8ConversionError(int srcBits)1182*35238bceSAndroid Build Coastguard Worker static int getToSRGB8ConversionError(int srcBits)
1183*35238bceSAndroid Build Coastguard Worker {
1184*35238bceSAndroid Build Coastguard Worker // \note These are pre-computed based on simulation results.
1185*35238bceSAndroid Build Coastguard Worker static const int errors[] = {
1186*35238bceSAndroid Build Coastguard Worker 1, // 0 bits - rounding
1187*35238bceSAndroid Build Coastguard Worker 255, // 1 bits
1188*35238bceSAndroid Build Coastguard Worker 157, // 2 bits
1189*35238bceSAndroid Build Coastguard Worker 106, // 3 bits
1190*35238bceSAndroid Build Coastguard Worker 74, // 4 bits
1191*35238bceSAndroid Build Coastguard Worker 51, // 5 bits
1192*35238bceSAndroid Build Coastguard Worker 34, // 6 bits
1193*35238bceSAndroid Build Coastguard Worker 22, // 7 bits
1194*35238bceSAndroid Build Coastguard Worker 13, // 8 bits
1195*35238bceSAndroid Build Coastguard Worker 7, // 9 bits
1196*35238bceSAndroid Build Coastguard Worker 4, // 10 bits
1197*35238bceSAndroid Build Coastguard Worker 3, // 11 bits
1198*35238bceSAndroid Build Coastguard Worker 2, // 12 bits
1199*35238bceSAndroid Build Coastguard Worker // 1 from this on
1200*35238bceSAndroid Build Coastguard Worker };
1201*35238bceSAndroid Build Coastguard Worker
1202*35238bceSAndroid Build Coastguard Worker DE_ASSERT(srcBits >= 0);
1203*35238bceSAndroid Build Coastguard Worker if (srcBits < DE_LENGTH_OF_ARRAY(errors))
1204*35238bceSAndroid Build Coastguard Worker return errors[srcBits];
1205*35238bceSAndroid Build Coastguard Worker else
1206*35238bceSAndroid Build Coastguard Worker return 1;
1207*35238bceSAndroid Build Coastguard Worker }
1208*35238bceSAndroid Build Coastguard Worker
getToSRGBConversionThreshold(const tcu::TextureFormat & src,const tcu::TextureFormat & dst)1209*35238bceSAndroid Build Coastguard Worker tcu::RGBA getToSRGBConversionThreshold(const tcu::TextureFormat &src, const tcu::TextureFormat &dst)
1210*35238bceSAndroid Build Coastguard Worker {
1211*35238bceSAndroid Build Coastguard Worker // Only SRGB8 and SRGB8_ALPHA8 formats are supported.
1212*35238bceSAndroid Build Coastguard Worker DE_ASSERT(dst.type == tcu::TextureFormat::UNORM_INT8 && tcu::isSRGB(dst));
1213*35238bceSAndroid Build Coastguard Worker
1214*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 bits = tcu::getTextureFormatMantissaBitDepth(src);
1215*35238bceSAndroid Build Coastguard Worker const bool dstHasAlpha = dst.order == tcu::TextureFormat::sRGBA;
1216*35238bceSAndroid Build Coastguard Worker
1217*35238bceSAndroid Build Coastguard Worker return tcu::RGBA(getToSRGB8ConversionError(bits.x()), getToSRGB8ConversionError(bits.y()),
1218*35238bceSAndroid Build Coastguard Worker getToSRGB8ConversionError(bits.z()), dstHasAlpha ? calculateU8ConversionError(bits.w()) : 0);
1219*35238bceSAndroid Build Coastguard Worker }
1220*35238bceSAndroid Build Coastguard Worker
1221*35238bceSAndroid Build Coastguard Worker } // namespace FboTestUtil
1222*35238bceSAndroid Build Coastguard Worker } // namespace Functional
1223*35238bceSAndroid Build Coastguard Worker } // namespace gles3
1224*35238bceSAndroid Build Coastguard Worker } // namespace deqp
1225