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 Shader API tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es3fShaderApiTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "es3fApiCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
27*35238bceSAndroid Build Coastguard Worker
28*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "gluDrawUtil.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "gluCallLogWrapper.hpp"
34*35238bceSAndroid Build Coastguard Worker
35*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "glwDefs.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
38*35238bceSAndroid Build Coastguard Worker
39*35238bceSAndroid Build Coastguard Worker #include "deString.h"
40*35238bceSAndroid Build Coastguard Worker
41*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
42*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
43*35238bceSAndroid Build Coastguard Worker
44*35238bceSAndroid Build Coastguard Worker #include <string>
45*35238bceSAndroid Build Coastguard Worker #include <sstream>
46*35238bceSAndroid Build Coastguard Worker #include <vector>
47*35238bceSAndroid Build Coastguard Worker #include <map>
48*35238bceSAndroid Build Coastguard Worker
49*35238bceSAndroid Build Coastguard Worker using namespace glw; // GL types
50*35238bceSAndroid Build Coastguard Worker
51*35238bceSAndroid Build Coastguard Worker namespace deqp
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker namespace gles3
54*35238bceSAndroid Build Coastguard Worker {
55*35238bceSAndroid Build Coastguard Worker namespace Functional
56*35238bceSAndroid Build Coastguard Worker {
57*35238bceSAndroid Build Coastguard Worker
58*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
59*35238bceSAndroid Build Coastguard Worker
60*35238bceSAndroid Build Coastguard Worker namespace
61*35238bceSAndroid Build Coastguard Worker {
62*35238bceSAndroid Build Coastguard Worker
63*35238bceSAndroid Build Coastguard Worker enum ShaderSourceCaseFlags
64*35238bceSAndroid Build Coastguard Worker {
65*35238bceSAndroid Build Coastguard Worker CASE_EXPLICIT_SOURCE_LENGTHS = 1,
66*35238bceSAndroid Build Coastguard Worker CASE_RANDOM_NULL_TERMINATED = 2
67*35238bceSAndroid Build Coastguard Worker };
68*35238bceSAndroid Build Coastguard Worker
69*35238bceSAndroid Build Coastguard Worker struct ShaderSources
70*35238bceSAndroid Build Coastguard Worker {
71*35238bceSAndroid Build Coastguard Worker std::vector<std::string> strings;
72*35238bceSAndroid Build Coastguard Worker std::vector<int> lengths;
73*35238bceSAndroid Build Coastguard Worker };
74*35238bceSAndroid Build Coastguard Worker
75*35238bceSAndroid Build Coastguard Worker // Simple shaders
76*35238bceSAndroid Build Coastguard Worker
getSimpleShaderSource(const glu::ShaderType shaderType)77*35238bceSAndroid Build Coastguard Worker const char *getSimpleShaderSource(const glu::ShaderType shaderType)
78*35238bceSAndroid Build Coastguard Worker {
79*35238bceSAndroid Build Coastguard Worker const char *simpleVertexShaderSource = "#version 300 es\n"
80*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
81*35238bceSAndroid Build Coastguard Worker "{\n"
82*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(0.0);\n"
83*35238bceSAndroid Build Coastguard Worker "}\n";
84*35238bceSAndroid Build Coastguard Worker
85*35238bceSAndroid Build Coastguard Worker const char *simpleFragmentShaderSource = "#version 300 es\n"
86*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_fragColor;\n"
87*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
88*35238bceSAndroid Build Coastguard Worker "{\n"
89*35238bceSAndroid Build Coastguard Worker " o_fragColor = vec4(0.0);\n"
90*35238bceSAndroid Build Coastguard Worker "}\n";
91*35238bceSAndroid Build Coastguard Worker
92*35238bceSAndroid Build Coastguard Worker switch (shaderType)
93*35238bceSAndroid Build Coastguard Worker {
94*35238bceSAndroid Build Coastguard Worker case glu::SHADERTYPE_VERTEX:
95*35238bceSAndroid Build Coastguard Worker return simpleVertexShaderSource;
96*35238bceSAndroid Build Coastguard Worker case glu::SHADERTYPE_FRAGMENT:
97*35238bceSAndroid Build Coastguard Worker return simpleFragmentShaderSource;
98*35238bceSAndroid Build Coastguard Worker default:
99*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
100*35238bceSAndroid Build Coastguard Worker }
101*35238bceSAndroid Build Coastguard Worker
102*35238bceSAndroid Build Coastguard Worker return 0;
103*35238bceSAndroid Build Coastguard Worker }
104*35238bceSAndroid Build Coastguard Worker
setShaderSources(glu::Shader & shader,const ShaderSources & sources)105*35238bceSAndroid Build Coastguard Worker void setShaderSources(glu::Shader &shader, const ShaderSources &sources)
106*35238bceSAndroid Build Coastguard Worker {
107*35238bceSAndroid Build Coastguard Worker std::vector<const char *> cStrings(sources.strings.size(), 0);
108*35238bceSAndroid Build Coastguard Worker
109*35238bceSAndroid Build Coastguard Worker for (size_t ndx = 0; ndx < sources.strings.size(); ndx++)
110*35238bceSAndroid Build Coastguard Worker cStrings[ndx] = sources.strings[ndx].c_str();
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Worker if (sources.lengths.size() > 0)
113*35238bceSAndroid Build Coastguard Worker shader.setSources((int)cStrings.size(), &cStrings[0], &sources.lengths[0]);
114*35238bceSAndroid Build Coastguard Worker else
115*35238bceSAndroid Build Coastguard Worker shader.setSources((int)cStrings.size(), &cStrings[0], 0);
116*35238bceSAndroid Build Coastguard Worker }
117*35238bceSAndroid Build Coastguard Worker
sliceSourceString(const std::string & in,ShaderSources & out,const int numSlices,const size_t paddingLength=0)118*35238bceSAndroid Build Coastguard Worker void sliceSourceString(const std::string &in, ShaderSources &out, const int numSlices, const size_t paddingLength = 0)
119*35238bceSAndroid Build Coastguard Worker {
120*35238bceSAndroid Build Coastguard Worker DE_ASSERT(numSlices > 0);
121*35238bceSAndroid Build Coastguard Worker
122*35238bceSAndroid Build Coastguard Worker const size_t sliceSize = in.length() / numSlices;
123*35238bceSAndroid Build Coastguard Worker const size_t sliceSizeRemainder = in.length() - (sliceSize * numSlices);
124*35238bceSAndroid Build Coastguard Worker const std::string padding(paddingLength, 'E');
125*35238bceSAndroid Build Coastguard Worker
126*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < numSlices; ndx++)
127*35238bceSAndroid Build Coastguard Worker {
128*35238bceSAndroid Build Coastguard Worker out.strings.push_back(in.substr(ndx * sliceSize, sliceSize) + padding);
129*35238bceSAndroid Build Coastguard Worker
130*35238bceSAndroid Build Coastguard Worker if (paddingLength > 0)
131*35238bceSAndroid Build Coastguard Worker out.lengths.push_back((int)sliceSize);
132*35238bceSAndroid Build Coastguard Worker }
133*35238bceSAndroid Build Coastguard Worker
134*35238bceSAndroid Build Coastguard Worker if (sliceSizeRemainder > 0)
135*35238bceSAndroid Build Coastguard Worker {
136*35238bceSAndroid Build Coastguard Worker const std::string lastString = in.substr(numSlices * sliceSize);
137*35238bceSAndroid Build Coastguard Worker const int lastStringLength = (int)lastString.length();
138*35238bceSAndroid Build Coastguard Worker
139*35238bceSAndroid Build Coastguard Worker out.strings.push_back(lastString + padding);
140*35238bceSAndroid Build Coastguard Worker
141*35238bceSAndroid Build Coastguard Worker if (paddingLength > 0)
142*35238bceSAndroid Build Coastguard Worker out.lengths.push_back(lastStringLength);
143*35238bceSAndroid Build Coastguard Worker }
144*35238bceSAndroid Build Coastguard Worker }
145*35238bceSAndroid Build Coastguard Worker
queryShaderInfo(glu::RenderContext & renderCtx,uint32_t shader,glu::ShaderInfo & info)146*35238bceSAndroid Build Coastguard Worker void queryShaderInfo(glu::RenderContext &renderCtx, uint32_t shader, glu::ShaderInfo &info)
147*35238bceSAndroid Build Coastguard Worker {
148*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = renderCtx.getFunctions();
149*35238bceSAndroid Build Coastguard Worker
150*35238bceSAndroid Build Coastguard Worker info.compileOk = false;
151*35238bceSAndroid Build Coastguard Worker info.compileTimeUs = 0;
152*35238bceSAndroid Build Coastguard Worker info.infoLog.clear();
153*35238bceSAndroid Build Coastguard Worker
154*35238bceSAndroid Build Coastguard Worker // Query source, status & log.
155*35238bceSAndroid Build Coastguard Worker {
156*35238bceSAndroid Build Coastguard Worker int compileStatus = 0;
157*35238bceSAndroid Build Coastguard Worker int sourceLen = 0;
158*35238bceSAndroid Build Coastguard Worker int infoLogLen = 0;
159*35238bceSAndroid Build Coastguard Worker int unusedLen;
160*35238bceSAndroid Build Coastguard Worker
161*35238bceSAndroid Build Coastguard Worker gl.getShaderiv(shader, GL_COMPILE_STATUS, &compileStatus);
162*35238bceSAndroid Build Coastguard Worker gl.getShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &sourceLen);
163*35238bceSAndroid Build Coastguard Worker gl.getShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLen);
164*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv()");
165*35238bceSAndroid Build Coastguard Worker
166*35238bceSAndroid Build Coastguard Worker info.compileOk = compileStatus != GL_FALSE;
167*35238bceSAndroid Build Coastguard Worker
168*35238bceSAndroid Build Coastguard Worker if (sourceLen > 0)
169*35238bceSAndroid Build Coastguard Worker {
170*35238bceSAndroid Build Coastguard Worker std::vector<char> source(sourceLen);
171*35238bceSAndroid Build Coastguard Worker gl.getShaderSource(shader, (int)source.size(), &unusedLen, &source[0]);
172*35238bceSAndroid Build Coastguard Worker info.source = std::string(&source[0], sourceLen);
173*35238bceSAndroid Build Coastguard Worker }
174*35238bceSAndroid Build Coastguard Worker
175*35238bceSAndroid Build Coastguard Worker if (infoLogLen > 0)
176*35238bceSAndroid Build Coastguard Worker {
177*35238bceSAndroid Build Coastguard Worker std::vector<char> infoLog(infoLogLen);
178*35238bceSAndroid Build Coastguard Worker gl.getShaderInfoLog(shader, (int)infoLog.size(), &unusedLen, &infoLog[0]);
179*35238bceSAndroid Build Coastguard Worker info.infoLog = std::string(&infoLog[0], infoLogLen);
180*35238bceSAndroid Build Coastguard Worker }
181*35238bceSAndroid Build Coastguard Worker }
182*35238bceSAndroid Build Coastguard Worker }
183*35238bceSAndroid Build Coastguard Worker
184*35238bceSAndroid Build Coastguard Worker // Draw test quad
185*35238bceSAndroid Build Coastguard Worker
drawWithProgram(glu::RenderContext & renderCtx,uint32_t program)186*35238bceSAndroid Build Coastguard Worker void drawWithProgram(glu::RenderContext &renderCtx, uint32_t program)
187*35238bceSAndroid Build Coastguard Worker {
188*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = renderCtx.getFunctions();
189*35238bceSAndroid Build Coastguard Worker
190*35238bceSAndroid Build Coastguard Worker const float position[] = {-1.0f, -1.0f, 0.0f, 1.0f, -1.0f, +1.0f, 0.0f, 1.0f,
191*35238bceSAndroid Build Coastguard Worker +1.0f, -1.0f, 0.0f, 1.0f, +1.0f, +1.0f, 0.0f, 1.0f};
192*35238bceSAndroid Build Coastguard Worker const uint16_t quadIndices[] = {0, 1, 2, 2, 1, 3};
193*35238bceSAndroid Build Coastguard Worker
194*35238bceSAndroid Build Coastguard Worker gl.useProgram(program);
195*35238bceSAndroid Build Coastguard Worker
196*35238bceSAndroid Build Coastguard Worker {
197*35238bceSAndroid Build Coastguard Worker glu::VertexArrayBinding vertexArrays[] = {glu::va::Float("a_position", 4, 4, 0, &position[0])};
198*35238bceSAndroid Build Coastguard Worker glu::draw(renderCtx, program, DE_LENGTH_OF_ARRAY(vertexArrays), &vertexArrays[0],
199*35238bceSAndroid Build Coastguard Worker glu::pr::Triangles(DE_LENGTH_OF_ARRAY(quadIndices), &quadIndices[0]));
200*35238bceSAndroid Build Coastguard Worker }
201*35238bceSAndroid Build Coastguard Worker
202*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Draw test quad");
203*35238bceSAndroid Build Coastguard Worker }
204*35238bceSAndroid Build Coastguard Worker
205*35238bceSAndroid Build Coastguard Worker // Shader source generator
206*35238bceSAndroid Build Coastguard Worker
207*35238bceSAndroid Build Coastguard Worker class SourceGenerator
208*35238bceSAndroid Build Coastguard Worker {
209*35238bceSAndroid Build Coastguard Worker public:
~SourceGenerator(void)210*35238bceSAndroid Build Coastguard Worker virtual ~SourceGenerator(void)
211*35238bceSAndroid Build Coastguard Worker {
212*35238bceSAndroid Build Coastguard Worker }
213*35238bceSAndroid Build Coastguard Worker
214*35238bceSAndroid Build Coastguard Worker virtual std::string next(const glu::ShaderType shaderType) = 0;
215*35238bceSAndroid Build Coastguard Worker virtual bool finished(const glu::ShaderType shaderType) const = 0;
216*35238bceSAndroid Build Coastguard Worker };
217*35238bceSAndroid Build Coastguard Worker
218*35238bceSAndroid Build Coastguard Worker class ConstantShaderGenerator : public SourceGenerator
219*35238bceSAndroid Build Coastguard Worker {
220*35238bceSAndroid Build Coastguard Worker public:
ConstantShaderGenerator(de::Random & rnd)221*35238bceSAndroid Build Coastguard Worker ConstantShaderGenerator(de::Random &rnd) : m_rnd(rnd)
222*35238bceSAndroid Build Coastguard Worker {
223*35238bceSAndroid Build Coastguard Worker }
~ConstantShaderGenerator(void)224*35238bceSAndroid Build Coastguard Worker ~ConstantShaderGenerator(void)
225*35238bceSAndroid Build Coastguard Worker {
226*35238bceSAndroid Build Coastguard Worker }
227*35238bceSAndroid Build Coastguard Worker
finished(const glu::ShaderType shaderType) const228*35238bceSAndroid Build Coastguard Worker bool finished(const glu::ShaderType shaderType) const
229*35238bceSAndroid Build Coastguard Worker {
230*35238bceSAndroid Build Coastguard Worker DE_UNREF(shaderType);
231*35238bceSAndroid Build Coastguard Worker return false;
232*35238bceSAndroid Build Coastguard Worker }
233*35238bceSAndroid Build Coastguard Worker
234*35238bceSAndroid Build Coastguard Worker std::string next(const glu::ShaderType shaderType);
235*35238bceSAndroid Build Coastguard Worker
236*35238bceSAndroid Build Coastguard Worker private:
237*35238bceSAndroid Build Coastguard Worker de::Random m_rnd;
238*35238bceSAndroid Build Coastguard Worker };
239*35238bceSAndroid Build Coastguard Worker
next(const glu::ShaderType shaderType)240*35238bceSAndroid Build Coastguard Worker std::string ConstantShaderGenerator::next(const glu::ShaderType shaderType)
241*35238bceSAndroid Build Coastguard Worker {
242*35238bceSAndroid Build Coastguard Worker DE_ASSERT(shaderType == glu::SHADERTYPE_VERTEX || shaderType == glu::SHADERTYPE_FRAGMENT);
243*35238bceSAndroid Build Coastguard Worker
244*35238bceSAndroid Build Coastguard Worker const float value = m_rnd.getFloat(0.0f, 1.0f);
245*35238bceSAndroid Build Coastguard Worker const std::string valueString = de::toString(value);
246*35238bceSAndroid Build Coastguard Worker const std::string outputName = (shaderType == glu::SHADERTYPE_VERTEX) ? "gl_Position" : "o_fragColor";
247*35238bceSAndroid Build Coastguard Worker
248*35238bceSAndroid Build Coastguard Worker std::ostringstream out;
249*35238bceSAndroid Build Coastguard Worker
250*35238bceSAndroid Build Coastguard Worker out << "#version 300 es\n";
251*35238bceSAndroid Build Coastguard Worker
252*35238bceSAndroid Build Coastguard Worker if (shaderType == glu::SHADERTYPE_FRAGMENT)
253*35238bceSAndroid Build Coastguard Worker out << "layout(location = 0) out mediump vec4 o_fragColor;\n";
254*35238bceSAndroid Build Coastguard Worker
255*35238bceSAndroid Build Coastguard Worker out << "void main (void)\n";
256*35238bceSAndroid Build Coastguard Worker out << "{\n";
257*35238bceSAndroid Build Coastguard Worker out << " " << outputName << " = vec4(" << valueString << ");\n";
258*35238bceSAndroid Build Coastguard Worker out << "}\n";
259*35238bceSAndroid Build Coastguard Worker
260*35238bceSAndroid Build Coastguard Worker return out.str();
261*35238bceSAndroid Build Coastguard Worker }
262*35238bceSAndroid Build Coastguard Worker
263*35238bceSAndroid Build Coastguard Worker // Shader allocation utility
264*35238bceSAndroid Build Coastguard Worker
265*35238bceSAndroid Build Coastguard Worker class ShaderAllocator
266*35238bceSAndroid Build Coastguard Worker {
267*35238bceSAndroid Build Coastguard Worker public:
268*35238bceSAndroid Build Coastguard Worker ShaderAllocator(glu::RenderContext &context, SourceGenerator &generator);
269*35238bceSAndroid Build Coastguard Worker ~ShaderAllocator(void);
270*35238bceSAndroid Build Coastguard Worker
271*35238bceSAndroid Build Coastguard Worker bool hasShader(const glu::ShaderType shaderType);
272*35238bceSAndroid Build Coastguard Worker
273*35238bceSAndroid Build Coastguard Worker void setSource(const glu::ShaderType shaderType);
274*35238bceSAndroid Build Coastguard Worker
275*35238bceSAndroid Build Coastguard Worker glu::Shader &createShader(const glu::ShaderType shaderType);
276*35238bceSAndroid Build Coastguard Worker void deleteShader(const glu::ShaderType shaderType);
277*35238bceSAndroid Build Coastguard Worker
get(const glu::ShaderType shaderType)278*35238bceSAndroid Build Coastguard Worker glu::Shader &get(const glu::ShaderType shaderType)
279*35238bceSAndroid Build Coastguard Worker {
280*35238bceSAndroid Build Coastguard Worker DE_ASSERT(hasShader(shaderType));
281*35238bceSAndroid Build Coastguard Worker return *m_shaders[shaderType];
282*35238bceSAndroid Build Coastguard Worker }
283*35238bceSAndroid Build Coastguard Worker
284*35238bceSAndroid Build Coastguard Worker private:
285*35238bceSAndroid Build Coastguard Worker const glu::RenderContext &m_context;
286*35238bceSAndroid Build Coastguard Worker SourceGenerator &m_srcGen;
287*35238bceSAndroid Build Coastguard Worker std::map<glu::ShaderType, glu::Shader *> m_shaders;
288*35238bceSAndroid Build Coastguard Worker };
289*35238bceSAndroid Build Coastguard Worker
ShaderAllocator(glu::RenderContext & context,SourceGenerator & generator)290*35238bceSAndroid Build Coastguard Worker ShaderAllocator::ShaderAllocator(glu::RenderContext &context, SourceGenerator &generator)
291*35238bceSAndroid Build Coastguard Worker : m_context(context)
292*35238bceSAndroid Build Coastguard Worker , m_srcGen(generator)
293*35238bceSAndroid Build Coastguard Worker {
294*35238bceSAndroid Build Coastguard Worker }
295*35238bceSAndroid Build Coastguard Worker
~ShaderAllocator(void)296*35238bceSAndroid Build Coastguard Worker ShaderAllocator::~ShaderAllocator(void)
297*35238bceSAndroid Build Coastguard Worker {
298*35238bceSAndroid Build Coastguard Worker for (std::map<glu::ShaderType, glu::Shader *>::iterator shaderIter = m_shaders.begin();
299*35238bceSAndroid Build Coastguard Worker shaderIter != m_shaders.end(); shaderIter++)
300*35238bceSAndroid Build Coastguard Worker delete shaderIter->second;
301*35238bceSAndroid Build Coastguard Worker m_shaders.clear();
302*35238bceSAndroid Build Coastguard Worker }
303*35238bceSAndroid Build Coastguard Worker
hasShader(const glu::ShaderType shaderType)304*35238bceSAndroid Build Coastguard Worker bool ShaderAllocator::hasShader(const glu::ShaderType shaderType)
305*35238bceSAndroid Build Coastguard Worker {
306*35238bceSAndroid Build Coastguard Worker if (m_shaders.find(shaderType) != m_shaders.end())
307*35238bceSAndroid Build Coastguard Worker return true;
308*35238bceSAndroid Build Coastguard Worker else
309*35238bceSAndroid Build Coastguard Worker return false;
310*35238bceSAndroid Build Coastguard Worker }
311*35238bceSAndroid Build Coastguard Worker
createShader(const glu::ShaderType shaderType)312*35238bceSAndroid Build Coastguard Worker glu::Shader &ShaderAllocator::createShader(const glu::ShaderType shaderType)
313*35238bceSAndroid Build Coastguard Worker {
314*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!this->hasShader(shaderType));
315*35238bceSAndroid Build Coastguard Worker
316*35238bceSAndroid Build Coastguard Worker glu::Shader *const shader = new glu::Shader(m_context, shaderType);
317*35238bceSAndroid Build Coastguard Worker
318*35238bceSAndroid Build Coastguard Worker m_shaders[shaderType] = shader;
319*35238bceSAndroid Build Coastguard Worker this->setSource(shaderType);
320*35238bceSAndroid Build Coastguard Worker
321*35238bceSAndroid Build Coastguard Worker return *shader;
322*35238bceSAndroid Build Coastguard Worker }
323*35238bceSAndroid Build Coastguard Worker
deleteShader(const glu::ShaderType shaderType)324*35238bceSAndroid Build Coastguard Worker void ShaderAllocator::deleteShader(const glu::ShaderType shaderType)
325*35238bceSAndroid Build Coastguard Worker {
326*35238bceSAndroid Build Coastguard Worker DE_ASSERT(this->hasShader(shaderType));
327*35238bceSAndroid Build Coastguard Worker
328*35238bceSAndroid Build Coastguard Worker delete m_shaders[shaderType];
329*35238bceSAndroid Build Coastguard Worker m_shaders.erase(shaderType);
330*35238bceSAndroid Build Coastguard Worker }
331*35238bceSAndroid Build Coastguard Worker
setSource(const glu::ShaderType shaderType)332*35238bceSAndroid Build Coastguard Worker void ShaderAllocator::setSource(const glu::ShaderType shaderType)
333*35238bceSAndroid Build Coastguard Worker {
334*35238bceSAndroid Build Coastguard Worker DE_ASSERT(this->hasShader(shaderType));
335*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_srcGen.finished(shaderType));
336*35238bceSAndroid Build Coastguard Worker
337*35238bceSAndroid Build Coastguard Worker const std::string source = m_srcGen.next(shaderType);
338*35238bceSAndroid Build Coastguard Worker const char *const cSource = source.c_str();
339*35238bceSAndroid Build Coastguard Worker
340*35238bceSAndroid Build Coastguard Worker m_shaders[shaderType]->setSources(1, &cSource, 0);
341*35238bceSAndroid Build Coastguard Worker }
342*35238bceSAndroid Build Coastguard Worker
343*35238bceSAndroid Build Coastguard Worker // Logging utilities
344*35238bceSAndroid Build Coastguard Worker
logShader(TestLog & log,glu::RenderContext & renderCtx,glu::Shader & shader)345*35238bceSAndroid Build Coastguard Worker void logShader(TestLog &log, glu::RenderContext &renderCtx, glu::Shader &shader)
346*35238bceSAndroid Build Coastguard Worker {
347*35238bceSAndroid Build Coastguard Worker glu::ShaderInfo info;
348*35238bceSAndroid Build Coastguard Worker
349*35238bceSAndroid Build Coastguard Worker queryShaderInfo(renderCtx, shader.getShader(), info);
350*35238bceSAndroid Build Coastguard Worker
351*35238bceSAndroid Build Coastguard Worker log << TestLog::Shader(getLogShaderType(shader.getType()), info.source, info.compileOk, info.infoLog);
352*35238bceSAndroid Build Coastguard Worker }
353*35238bceSAndroid Build Coastguard Worker
logProgram(TestLog & log,glu::RenderContext & renderCtx,glu::Program & program,ShaderAllocator & shaders)354*35238bceSAndroid Build Coastguard Worker void logProgram(TestLog &log, glu::RenderContext &renderCtx, glu::Program &program, ShaderAllocator &shaders)
355*35238bceSAndroid Build Coastguard Worker {
356*35238bceSAndroid Build Coastguard Worker log << TestLog::ShaderProgram(program.getLinkStatus(), program.getInfoLog());
357*35238bceSAndroid Build Coastguard Worker
358*35238bceSAndroid Build Coastguard Worker for (int shaderTypeInt = 0; shaderTypeInt < glu::SHADERTYPE_LAST; shaderTypeInt++)
359*35238bceSAndroid Build Coastguard Worker {
360*35238bceSAndroid Build Coastguard Worker const glu::ShaderType shaderType = (glu::ShaderType)shaderTypeInt;
361*35238bceSAndroid Build Coastguard Worker
362*35238bceSAndroid Build Coastguard Worker if (shaders.hasShader(shaderType))
363*35238bceSAndroid Build Coastguard Worker logShader(log, renderCtx, shaders.get(shaderType));
364*35238bceSAndroid Build Coastguard Worker }
365*35238bceSAndroid Build Coastguard Worker
366*35238bceSAndroid Build Coastguard Worker log << TestLog::EndShaderProgram;
367*35238bceSAndroid Build Coastguard Worker }
368*35238bceSAndroid Build Coastguard Worker
logVertexFragmentProgram(TestLog & log,glu::RenderContext & renderCtx,glu::Program & program,glu::Shader & vertShader,glu::Shader & fragShader)369*35238bceSAndroid Build Coastguard Worker void logVertexFragmentProgram(TestLog &log, glu::RenderContext &renderCtx, glu::Program &program,
370*35238bceSAndroid Build Coastguard Worker glu::Shader &vertShader, glu::Shader &fragShader)
371*35238bceSAndroid Build Coastguard Worker {
372*35238bceSAndroid Build Coastguard Worker DE_ASSERT(vertShader.getType() == glu::SHADERTYPE_VERTEX && fragShader.getType() == glu::SHADERTYPE_FRAGMENT);
373*35238bceSAndroid Build Coastguard Worker
374*35238bceSAndroid Build Coastguard Worker log << TestLog::ShaderProgram(program.getLinkStatus(), program.getInfoLog());
375*35238bceSAndroid Build Coastguard Worker
376*35238bceSAndroid Build Coastguard Worker logShader(log, renderCtx, vertShader);
377*35238bceSAndroid Build Coastguard Worker logShader(log, renderCtx, fragShader);
378*35238bceSAndroid Build Coastguard Worker
379*35238bceSAndroid Build Coastguard Worker log << TestLog::EndShaderProgram;
380*35238bceSAndroid Build Coastguard Worker }
381*35238bceSAndroid Build Coastguard Worker
382*35238bceSAndroid Build Coastguard Worker } // namespace
383*35238bceSAndroid Build Coastguard Worker
384*35238bceSAndroid Build Coastguard Worker // Simple glCreateShader() case
385*35238bceSAndroid Build Coastguard Worker
386*35238bceSAndroid Build Coastguard Worker class CreateShaderCase : public ApiCase
387*35238bceSAndroid Build Coastguard Worker {
388*35238bceSAndroid Build Coastguard Worker public:
CreateShaderCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)389*35238bceSAndroid Build Coastguard Worker CreateShaderCase(Context &context, const char *name, const char *desc, glu::ShaderType shaderType)
390*35238bceSAndroid Build Coastguard Worker : ApiCase(context, name, desc)
391*35238bceSAndroid Build Coastguard Worker , m_shaderType(shaderType)
392*35238bceSAndroid Build Coastguard Worker {
393*35238bceSAndroid Build Coastguard Worker }
394*35238bceSAndroid Build Coastguard Worker
test(void)395*35238bceSAndroid Build Coastguard Worker void test(void)
396*35238bceSAndroid Build Coastguard Worker {
397*35238bceSAndroid Build Coastguard Worker const GLuint shaderObject = glCreateShader(glu::getGLShaderType(m_shaderType));
398*35238bceSAndroid Build Coastguard Worker
399*35238bceSAndroid Build Coastguard Worker TCU_CHECK(shaderObject != 0);
400*35238bceSAndroid Build Coastguard Worker
401*35238bceSAndroid Build Coastguard Worker glDeleteShader(shaderObject);
402*35238bceSAndroid Build Coastguard Worker }
403*35238bceSAndroid Build Coastguard Worker
404*35238bceSAndroid Build Coastguard Worker private:
405*35238bceSAndroid Build Coastguard Worker const glu::ShaderType m_shaderType;
406*35238bceSAndroid Build Coastguard Worker };
407*35238bceSAndroid Build Coastguard Worker
408*35238bceSAndroid Build Coastguard Worker // Simple glCompileShader() case
409*35238bceSAndroid Build Coastguard Worker
410*35238bceSAndroid Build Coastguard Worker class CompileShaderCase : public ApiCase
411*35238bceSAndroid Build Coastguard Worker {
412*35238bceSAndroid Build Coastguard Worker public:
CompileShaderCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)413*35238bceSAndroid Build Coastguard Worker CompileShaderCase(Context &context, const char *name, const char *desc, glu::ShaderType shaderType)
414*35238bceSAndroid Build Coastguard Worker : ApiCase(context, name, desc)
415*35238bceSAndroid Build Coastguard Worker , m_shaderType(shaderType)
416*35238bceSAndroid Build Coastguard Worker {
417*35238bceSAndroid Build Coastguard Worker }
418*35238bceSAndroid Build Coastguard Worker
checkCompileStatus(const GLuint shaderObject)419*35238bceSAndroid Build Coastguard Worker bool checkCompileStatus(const GLuint shaderObject)
420*35238bceSAndroid Build Coastguard Worker {
421*35238bceSAndroid Build Coastguard Worker GLint compileStatus = -1;
422*35238bceSAndroid Build Coastguard Worker glGetShaderiv(shaderObject, GL_COMPILE_STATUS, &compileStatus);
423*35238bceSAndroid Build Coastguard Worker GLU_CHECK();
424*35238bceSAndroid Build Coastguard Worker
425*35238bceSAndroid Build Coastguard Worker return (compileStatus == GL_TRUE);
426*35238bceSAndroid Build Coastguard Worker }
427*35238bceSAndroid Build Coastguard Worker
test(void)428*35238bceSAndroid Build Coastguard Worker void test(void)
429*35238bceSAndroid Build Coastguard Worker {
430*35238bceSAndroid Build Coastguard Worker const char *shaderSource = getSimpleShaderSource(m_shaderType);
431*35238bceSAndroid Build Coastguard Worker const GLuint shaderObject = glCreateShader(glu::getGLShaderType(m_shaderType));
432*35238bceSAndroid Build Coastguard Worker
433*35238bceSAndroid Build Coastguard Worker TCU_CHECK(shaderObject != 0);
434*35238bceSAndroid Build Coastguard Worker
435*35238bceSAndroid Build Coastguard Worker glShaderSource(shaderObject, 1, &shaderSource, 0);
436*35238bceSAndroid Build Coastguard Worker glCompileShader(shaderObject);
437*35238bceSAndroid Build Coastguard Worker
438*35238bceSAndroid Build Coastguard Worker TCU_CHECK(checkCompileStatus(shaderObject));
439*35238bceSAndroid Build Coastguard Worker
440*35238bceSAndroid Build Coastguard Worker glDeleteShader(shaderObject);
441*35238bceSAndroid Build Coastguard Worker }
442*35238bceSAndroid Build Coastguard Worker
443*35238bceSAndroid Build Coastguard Worker private:
444*35238bceSAndroid Build Coastguard Worker const glu::ShaderType m_shaderType;
445*35238bceSAndroid Build Coastguard Worker };
446*35238bceSAndroid Build Coastguard Worker
447*35238bceSAndroid Build Coastguard Worker // Base class for simple program API tests
448*35238bceSAndroid Build Coastguard Worker
449*35238bceSAndroid Build Coastguard Worker class SimpleProgramCase : public ApiCase
450*35238bceSAndroid Build Coastguard Worker {
451*35238bceSAndroid Build Coastguard Worker public:
SimpleProgramCase(Context & context,const char * name,const char * desc)452*35238bceSAndroid Build Coastguard Worker SimpleProgramCase(Context &context, const char *name, const char *desc)
453*35238bceSAndroid Build Coastguard Worker : ApiCase(context, name, desc)
454*35238bceSAndroid Build Coastguard Worker , m_vertShader(0)
455*35238bceSAndroid Build Coastguard Worker , m_fragShader(0)
456*35238bceSAndroid Build Coastguard Worker , m_program(0)
457*35238bceSAndroid Build Coastguard Worker {
458*35238bceSAndroid Build Coastguard Worker }
459*35238bceSAndroid Build Coastguard Worker
~SimpleProgramCase(void)460*35238bceSAndroid Build Coastguard Worker virtual ~SimpleProgramCase(void)
461*35238bceSAndroid Build Coastguard Worker {
462*35238bceSAndroid Build Coastguard Worker }
463*35238bceSAndroid Build Coastguard Worker
compileShaders(void)464*35238bceSAndroid Build Coastguard Worker virtual void compileShaders(void)
465*35238bceSAndroid Build Coastguard Worker {
466*35238bceSAndroid Build Coastguard Worker const char *vertSource = getSimpleShaderSource(glu::SHADERTYPE_VERTEX);
467*35238bceSAndroid Build Coastguard Worker const char *fragSource = getSimpleShaderSource(glu::SHADERTYPE_FRAGMENT);
468*35238bceSAndroid Build Coastguard Worker
469*35238bceSAndroid Build Coastguard Worker const GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
470*35238bceSAndroid Build Coastguard Worker const GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
471*35238bceSAndroid Build Coastguard Worker
472*35238bceSAndroid Build Coastguard Worker TCU_CHECK(vertShader != 0);
473*35238bceSAndroid Build Coastguard Worker TCU_CHECK(fragShader != 0);
474*35238bceSAndroid Build Coastguard Worker
475*35238bceSAndroid Build Coastguard Worker glShaderSource(vertShader, 1, &vertSource, 0);
476*35238bceSAndroid Build Coastguard Worker glCompileShader(vertShader);
477*35238bceSAndroid Build Coastguard Worker
478*35238bceSAndroid Build Coastguard Worker glShaderSource(fragShader, 1, &fragSource, 0);
479*35238bceSAndroid Build Coastguard Worker glCompileShader(fragShader);
480*35238bceSAndroid Build Coastguard Worker
481*35238bceSAndroid Build Coastguard Worker GLU_CHECK();
482*35238bceSAndroid Build Coastguard Worker
483*35238bceSAndroid Build Coastguard Worker m_vertShader = vertShader;
484*35238bceSAndroid Build Coastguard Worker m_fragShader = fragShader;
485*35238bceSAndroid Build Coastguard Worker }
486*35238bceSAndroid Build Coastguard Worker
linkProgram(void)487*35238bceSAndroid Build Coastguard Worker void linkProgram(void)
488*35238bceSAndroid Build Coastguard Worker {
489*35238bceSAndroid Build Coastguard Worker const GLuint program = glCreateProgram();
490*35238bceSAndroid Build Coastguard Worker
491*35238bceSAndroid Build Coastguard Worker TCU_CHECK(program != 0);
492*35238bceSAndroid Build Coastguard Worker
493*35238bceSAndroid Build Coastguard Worker glAttachShader(program, m_vertShader);
494*35238bceSAndroid Build Coastguard Worker glAttachShader(program, m_fragShader);
495*35238bceSAndroid Build Coastguard Worker GLU_CHECK();
496*35238bceSAndroid Build Coastguard Worker
497*35238bceSAndroid Build Coastguard Worker glLinkProgram(program);
498*35238bceSAndroid Build Coastguard Worker
499*35238bceSAndroid Build Coastguard Worker m_program = program;
500*35238bceSAndroid Build Coastguard Worker }
501*35238bceSAndroid Build Coastguard Worker
cleanup(void)502*35238bceSAndroid Build Coastguard Worker void cleanup(void)
503*35238bceSAndroid Build Coastguard Worker {
504*35238bceSAndroid Build Coastguard Worker glDeleteShader(m_vertShader);
505*35238bceSAndroid Build Coastguard Worker glDeleteShader(m_fragShader);
506*35238bceSAndroid Build Coastguard Worker glDeleteProgram(m_program);
507*35238bceSAndroid Build Coastguard Worker }
508*35238bceSAndroid Build Coastguard Worker
509*35238bceSAndroid Build Coastguard Worker protected:
510*35238bceSAndroid Build Coastguard Worker GLuint m_vertShader;
511*35238bceSAndroid Build Coastguard Worker GLuint m_fragShader;
512*35238bceSAndroid Build Coastguard Worker GLuint m_program;
513*35238bceSAndroid Build Coastguard Worker };
514*35238bceSAndroid Build Coastguard Worker
515*35238bceSAndroid Build Coastguard Worker // glDeleteShader() case
516*35238bceSAndroid Build Coastguard Worker
517*35238bceSAndroid Build Coastguard Worker class DeleteShaderCase : public SimpleProgramCase
518*35238bceSAndroid Build Coastguard Worker {
519*35238bceSAndroid Build Coastguard Worker public:
DeleteShaderCase(Context & context,const char * name,const char * desc)520*35238bceSAndroid Build Coastguard Worker DeleteShaderCase(Context &context, const char *name, const char *desc) : SimpleProgramCase(context, name, desc)
521*35238bceSAndroid Build Coastguard Worker {
522*35238bceSAndroid Build Coastguard Worker }
523*35238bceSAndroid Build Coastguard Worker
checkDeleteStatus(GLuint shader)524*35238bceSAndroid Build Coastguard Worker bool checkDeleteStatus(GLuint shader)
525*35238bceSAndroid Build Coastguard Worker {
526*35238bceSAndroid Build Coastguard Worker GLint deleteStatus = -1;
527*35238bceSAndroid Build Coastguard Worker glGetShaderiv(shader, GL_DELETE_STATUS, &deleteStatus);
528*35238bceSAndroid Build Coastguard Worker GLU_CHECK();
529*35238bceSAndroid Build Coastguard Worker
530*35238bceSAndroid Build Coastguard Worker return (deleteStatus == GL_TRUE);
531*35238bceSAndroid Build Coastguard Worker }
532*35238bceSAndroid Build Coastguard Worker
deleteShaders(void)533*35238bceSAndroid Build Coastguard Worker void deleteShaders(void)
534*35238bceSAndroid Build Coastguard Worker {
535*35238bceSAndroid Build Coastguard Worker glDeleteShader(m_vertShader);
536*35238bceSAndroid Build Coastguard Worker glDeleteShader(m_fragShader);
537*35238bceSAndroid Build Coastguard Worker GLU_CHECK();
538*35238bceSAndroid Build Coastguard Worker }
539*35238bceSAndroid Build Coastguard Worker
test(void)540*35238bceSAndroid Build Coastguard Worker void test(void)
541*35238bceSAndroid Build Coastguard Worker {
542*35238bceSAndroid Build Coastguard Worker compileShaders();
543*35238bceSAndroid Build Coastguard Worker linkProgram();
544*35238bceSAndroid Build Coastguard Worker GLU_CHECK();
545*35238bceSAndroid Build Coastguard Worker
546*35238bceSAndroid Build Coastguard Worker deleteShaders();
547*35238bceSAndroid Build Coastguard Worker
548*35238bceSAndroid Build Coastguard Worker TCU_CHECK(checkDeleteStatus(m_vertShader) && checkDeleteStatus(m_fragShader));
549*35238bceSAndroid Build Coastguard Worker
550*35238bceSAndroid Build Coastguard Worker glDeleteProgram(m_program);
551*35238bceSAndroid Build Coastguard Worker
552*35238bceSAndroid Build Coastguard Worker TCU_CHECK(!(glIsShader(m_vertShader) || glIsShader(m_fragShader)));
553*35238bceSAndroid Build Coastguard Worker }
554*35238bceSAndroid Build Coastguard Worker };
555*35238bceSAndroid Build Coastguard Worker
556*35238bceSAndroid Build Coastguard Worker // Simple glLinkProgram() case
557*35238bceSAndroid Build Coastguard Worker
558*35238bceSAndroid Build Coastguard Worker class LinkVertexFragmentCase : public SimpleProgramCase
559*35238bceSAndroid Build Coastguard Worker {
560*35238bceSAndroid Build Coastguard Worker public:
LinkVertexFragmentCase(Context & context,const char * name,const char * desc)561*35238bceSAndroid Build Coastguard Worker LinkVertexFragmentCase(Context &context, const char *name, const char *desc)
562*35238bceSAndroid Build Coastguard Worker : SimpleProgramCase(context, name, desc)
563*35238bceSAndroid Build Coastguard Worker {
564*35238bceSAndroid Build Coastguard Worker }
565*35238bceSAndroid Build Coastguard Worker
checkLinkStatus(const GLuint programObject)566*35238bceSAndroid Build Coastguard Worker bool checkLinkStatus(const GLuint programObject)
567*35238bceSAndroid Build Coastguard Worker {
568*35238bceSAndroid Build Coastguard Worker GLint linkStatus = -1;
569*35238bceSAndroid Build Coastguard Worker glGetProgramiv(programObject, GL_LINK_STATUS, &linkStatus);
570*35238bceSAndroid Build Coastguard Worker GLU_CHECK();
571*35238bceSAndroid Build Coastguard Worker
572*35238bceSAndroid Build Coastguard Worker return (linkStatus == GL_TRUE);
573*35238bceSAndroid Build Coastguard Worker }
574*35238bceSAndroid Build Coastguard Worker
test(void)575*35238bceSAndroid Build Coastguard Worker void test(void)
576*35238bceSAndroid Build Coastguard Worker {
577*35238bceSAndroid Build Coastguard Worker compileShaders();
578*35238bceSAndroid Build Coastguard Worker linkProgram();
579*35238bceSAndroid Build Coastguard Worker
580*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("Linking failed.");
581*35238bceSAndroid Build Coastguard Worker TCU_CHECK_MSG(checkLinkStatus(m_program), "Fail, expected LINK_STATUS to be TRUE.");
582*35238bceSAndroid Build Coastguard Worker
583*35238bceSAndroid Build Coastguard Worker cleanup();
584*35238bceSAndroid Build Coastguard Worker }
585*35238bceSAndroid Build Coastguard Worker };
586*35238bceSAndroid Build Coastguard Worker
587*35238bceSAndroid Build Coastguard Worker class ShaderSourceReplaceCase : public ApiCase
588*35238bceSAndroid Build Coastguard Worker {
589*35238bceSAndroid Build Coastguard Worker public:
ShaderSourceReplaceCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)590*35238bceSAndroid Build Coastguard Worker ShaderSourceReplaceCase(Context &context, const char *name, const char *desc, glu::ShaderType shaderType)
591*35238bceSAndroid Build Coastguard Worker : ApiCase(context, name, desc)
592*35238bceSAndroid Build Coastguard Worker , m_shaderType(shaderType)
593*35238bceSAndroid Build Coastguard Worker {
594*35238bceSAndroid Build Coastguard Worker }
595*35238bceSAndroid Build Coastguard Worker
generateFirstSource(void)596*35238bceSAndroid Build Coastguard Worker std::string generateFirstSource(void)
597*35238bceSAndroid Build Coastguard Worker {
598*35238bceSAndroid Build Coastguard Worker return getSimpleShaderSource(m_shaderType);
599*35238bceSAndroid Build Coastguard Worker }
600*35238bceSAndroid Build Coastguard Worker
generateSecondSource(void)601*35238bceSAndroid Build Coastguard Worker std::string generateSecondSource(void)
602*35238bceSAndroid Build Coastguard Worker {
603*35238bceSAndroid Build Coastguard Worker std::ostringstream out;
604*35238bceSAndroid Build Coastguard Worker
605*35238bceSAndroid Build Coastguard Worker out << "#version 300 es\n";
606*35238bceSAndroid Build Coastguard Worker out << "precision mediump float;\n";
607*35238bceSAndroid Build Coastguard Worker
608*35238bceSAndroid Build Coastguard Worker if (m_shaderType == glu::SHADERTYPE_FRAGMENT)
609*35238bceSAndroid Build Coastguard Worker out << "layout(location = 0) out mediump vec4 o_fragColor;\n";
610*35238bceSAndroid Build Coastguard Worker
611*35238bceSAndroid Build Coastguard Worker out << "void main()\n";
612*35238bceSAndroid Build Coastguard Worker out << "{\n";
613*35238bceSAndroid Build Coastguard Worker out << " float variable = 1.0f;\n";
614*35238bceSAndroid Build Coastguard Worker
615*35238bceSAndroid Build Coastguard Worker if (m_shaderType == glu::SHADERTYPE_VERTEX)
616*35238bceSAndroid Build Coastguard Worker out << " gl_Position = vec4(variable);\n";
617*35238bceSAndroid Build Coastguard Worker else if (m_shaderType == glu::SHADERTYPE_FRAGMENT)
618*35238bceSAndroid Build Coastguard Worker out << " o_fragColor = vec4(variable);\n";
619*35238bceSAndroid Build Coastguard Worker
620*35238bceSAndroid Build Coastguard Worker out << "}\n";
621*35238bceSAndroid Build Coastguard Worker
622*35238bceSAndroid Build Coastguard Worker return out.str();
623*35238bceSAndroid Build Coastguard Worker }
624*35238bceSAndroid Build Coastguard Worker
getSourceLength(glu::Shader & shader)625*35238bceSAndroid Build Coastguard Worker GLint getSourceLength(glu::Shader &shader)
626*35238bceSAndroid Build Coastguard Worker {
627*35238bceSAndroid Build Coastguard Worker GLint sourceLength = 0;
628*35238bceSAndroid Build Coastguard Worker glGetShaderiv(shader.getShader(), GL_SHADER_SOURCE_LENGTH, &sourceLength);
629*35238bceSAndroid Build Coastguard Worker GLU_CHECK();
630*35238bceSAndroid Build Coastguard Worker
631*35238bceSAndroid Build Coastguard Worker return sourceLength;
632*35238bceSAndroid Build Coastguard Worker }
633*35238bceSAndroid Build Coastguard Worker
readSource(glu::Shader & shader)634*35238bceSAndroid Build Coastguard Worker std::string readSource(glu::Shader &shader)
635*35238bceSAndroid Build Coastguard Worker {
636*35238bceSAndroid Build Coastguard Worker const GLint sourceLength = getSourceLength(shader);
637*35238bceSAndroid Build Coastguard Worker std::vector<char> sourceBuffer(sourceLength + 1);
638*35238bceSAndroid Build Coastguard Worker
639*35238bceSAndroid Build Coastguard Worker glGetShaderSource(shader.getShader(), (GLsizei)sourceBuffer.size(), 0, &sourceBuffer[0]);
640*35238bceSAndroid Build Coastguard Worker
641*35238bceSAndroid Build Coastguard Worker return std::string(&sourceBuffer[0]);
642*35238bceSAndroid Build Coastguard Worker }
643*35238bceSAndroid Build Coastguard Worker
verifyShaderSourceReplaced(glu::Shader & shader,const std::string & firstSource,const std::string & secondSource)644*35238bceSAndroid Build Coastguard Worker void verifyShaderSourceReplaced(glu::Shader &shader, const std::string &firstSource,
645*35238bceSAndroid Build Coastguard Worker const std::string &secondSource)
646*35238bceSAndroid Build Coastguard Worker {
647*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
648*35238bceSAndroid Build Coastguard Worker const std::string result = readSource(shader);
649*35238bceSAndroid Build Coastguard Worker
650*35238bceSAndroid Build Coastguard Worker if (result == firstSource)
651*35238bceSAndroid Build Coastguard Worker {
652*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Fail, source was not replaced." << TestLog::EndMessage;
653*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Shader source nor replaced");
654*35238bceSAndroid Build Coastguard Worker }
655*35238bceSAndroid Build Coastguard Worker else if (result != secondSource)
656*35238bceSAndroid Build Coastguard Worker {
657*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Fail, invalid shader source." << TestLog::EndMessage;
658*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid source");
659*35238bceSAndroid Build Coastguard Worker }
660*35238bceSAndroid Build Coastguard Worker }
661*35238bceSAndroid Build Coastguard Worker
test(void)662*35238bceSAndroid Build Coastguard Worker void test(void)
663*35238bceSAndroid Build Coastguard Worker {
664*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
665*35238bceSAndroid Build Coastguard Worker
666*35238bceSAndroid Build Coastguard Worker glu::Shader shader(m_context.getRenderContext(), m_shaderType);
667*35238bceSAndroid Build Coastguard Worker
668*35238bceSAndroid Build Coastguard Worker const std::string firstSourceStr = generateFirstSource();
669*35238bceSAndroid Build Coastguard Worker const std::string secondSourceStr = generateSecondSource();
670*35238bceSAndroid Build Coastguard Worker
671*35238bceSAndroid Build Coastguard Worker const char *firstSource = firstSourceStr.c_str();
672*35238bceSAndroid Build Coastguard Worker const char *secondSource = secondSourceStr.c_str();
673*35238bceSAndroid Build Coastguard Worker
674*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Setting shader source." << TestLog::EndMessage;
675*35238bceSAndroid Build Coastguard Worker
676*35238bceSAndroid Build Coastguard Worker shader.setSources(1, &firstSource, 0);
677*35238bceSAndroid Build Coastguard Worker GLU_CHECK();
678*35238bceSAndroid Build Coastguard Worker
679*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Replacing shader source." << TestLog::EndMessage;
680*35238bceSAndroid Build Coastguard Worker
681*35238bceSAndroid Build Coastguard Worker shader.setSources(1, &secondSource, 0);
682*35238bceSAndroid Build Coastguard Worker GLU_CHECK();
683*35238bceSAndroid Build Coastguard Worker
684*35238bceSAndroid Build Coastguard Worker verifyShaderSourceReplaced(shader, firstSourceStr, secondSourceStr);
685*35238bceSAndroid Build Coastguard Worker }
686*35238bceSAndroid Build Coastguard Worker
687*35238bceSAndroid Build Coastguard Worker private:
688*35238bceSAndroid Build Coastguard Worker glu::ShaderType m_shaderType;
689*35238bceSAndroid Build Coastguard Worker };
690*35238bceSAndroid Build Coastguard Worker
691*35238bceSAndroid Build Coastguard Worker // glShaderSource() split source case
692*35238bceSAndroid Build Coastguard Worker
693*35238bceSAndroid Build Coastguard Worker class ShaderSourceSplitCase : public ApiCase
694*35238bceSAndroid Build Coastguard Worker {
695*35238bceSAndroid Build Coastguard Worker public:
ShaderSourceSplitCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType,const int numSlices,const uint32_t flags=0)696*35238bceSAndroid Build Coastguard Worker ShaderSourceSplitCase(Context &context, const char *name, const char *desc, glu::ShaderType shaderType,
697*35238bceSAndroid Build Coastguard Worker const int numSlices, const uint32_t flags = 0)
698*35238bceSAndroid Build Coastguard Worker : ApiCase(context, name, desc)
699*35238bceSAndroid Build Coastguard Worker , m_rnd(deStringHash(getName()) ^ 0x4fb2337d)
700*35238bceSAndroid Build Coastguard Worker , m_shaderType(shaderType)
701*35238bceSAndroid Build Coastguard Worker , m_numSlices(numSlices)
702*35238bceSAndroid Build Coastguard Worker , m_explicitLengths((flags & CASE_EXPLICIT_SOURCE_LENGTHS) != 0)
703*35238bceSAndroid Build Coastguard Worker , m_randomNullTerm((flags & CASE_RANDOM_NULL_TERMINATED) != 0)
704*35238bceSAndroid Build Coastguard Worker {
705*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_shaderType == glu::SHADERTYPE_VERTEX || m_shaderType == glu::SHADERTYPE_FRAGMENT);
706*35238bceSAndroid Build Coastguard Worker }
707*35238bceSAndroid Build Coastguard Worker
~ShaderSourceSplitCase(void)708*35238bceSAndroid Build Coastguard Worker virtual ~ShaderSourceSplitCase(void)
709*35238bceSAndroid Build Coastguard Worker {
710*35238bceSAndroid Build Coastguard Worker }
711*35238bceSAndroid Build Coastguard Worker
generateFullSource(void)712*35238bceSAndroid Build Coastguard Worker std::string generateFullSource(void)
713*35238bceSAndroid Build Coastguard Worker {
714*35238bceSAndroid Build Coastguard Worker std::ostringstream out;
715*35238bceSAndroid Build Coastguard Worker
716*35238bceSAndroid Build Coastguard Worker out << "#version 300 es\n";
717*35238bceSAndroid Build Coastguard Worker out << "precision mediump float;\n";
718*35238bceSAndroid Build Coastguard Worker
719*35238bceSAndroid Build Coastguard Worker if (m_shaderType == glu::SHADERTYPE_FRAGMENT)
720*35238bceSAndroid Build Coastguard Worker out << "layout(location = 0) out mediump vec4 o_fragColor;\n";
721*35238bceSAndroid Build Coastguard Worker
722*35238bceSAndroid Build Coastguard Worker out << "void main()\n";
723*35238bceSAndroid Build Coastguard Worker out << "{\n";
724*35238bceSAndroid Build Coastguard Worker out << " float variable = 1.0f;\n";
725*35238bceSAndroid Build Coastguard Worker
726*35238bceSAndroid Build Coastguard Worker if (m_shaderType == glu::SHADERTYPE_VERTEX)
727*35238bceSAndroid Build Coastguard Worker out << " gl_Position = vec4(variable);\n";
728*35238bceSAndroid Build Coastguard Worker else if (m_shaderType == glu::SHADERTYPE_FRAGMENT)
729*35238bceSAndroid Build Coastguard Worker out << " o_fragColor = vec4(variable);\n";
730*35238bceSAndroid Build Coastguard Worker
731*35238bceSAndroid Build Coastguard Worker out << "}\n";
732*35238bceSAndroid Build Coastguard Worker
733*35238bceSAndroid Build Coastguard Worker return out.str();
734*35238bceSAndroid Build Coastguard Worker }
735*35238bceSAndroid Build Coastguard Worker
insertRandomNullTermStrings(ShaderSources & sources)736*35238bceSAndroid Build Coastguard Worker void insertRandomNullTermStrings(ShaderSources &sources)
737*35238bceSAndroid Build Coastguard Worker {
738*35238bceSAndroid Build Coastguard Worker const int numInserts = de::max(m_numSlices >> 2, 1);
739*35238bceSAndroid Build Coastguard Worker std::vector<int> indices(sources.strings.size(), 0);
740*35238bceSAndroid Build Coastguard Worker
741*35238bceSAndroid Build Coastguard Worker DE_ASSERT(sources.lengths.size() > 0);
742*35238bceSAndroid Build Coastguard Worker DE_ASSERT(sources.lengths.size() == sources.strings.size());
743*35238bceSAndroid Build Coastguard Worker
744*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)sources.strings.size(); i++)
745*35238bceSAndroid Build Coastguard Worker indices[i] = i;
746*35238bceSAndroid Build Coastguard Worker
747*35238bceSAndroid Build Coastguard Worker m_rnd.shuffle(indices.begin(), indices.end());
748*35238bceSAndroid Build Coastguard Worker
749*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < numInserts; i++)
750*35238bceSAndroid Build Coastguard Worker {
751*35238bceSAndroid Build Coastguard Worker const int ndx = indices[i];
752*35238bceSAndroid Build Coastguard Worker const int unpaddedLength = sources.lengths[ndx];
753*35238bceSAndroid Build Coastguard Worker const std::string unpaddedString = sources.strings[ndx].substr(0, unpaddedLength);
754*35238bceSAndroid Build Coastguard Worker
755*35238bceSAndroid Build Coastguard Worker sources.strings[ndx] = unpaddedString;
756*35238bceSAndroid Build Coastguard Worker sources.lengths[ndx] = m_rnd.getInt(-10, -1);
757*35238bceSAndroid Build Coastguard Worker }
758*35238bceSAndroid Build Coastguard Worker }
759*35238bceSAndroid Build Coastguard Worker
generateSources(ShaderSources & sources)760*35238bceSAndroid Build Coastguard Worker void generateSources(ShaderSources &sources)
761*35238bceSAndroid Build Coastguard Worker {
762*35238bceSAndroid Build Coastguard Worker const size_t paddingLength = (m_explicitLengths ? 10 : 0);
763*35238bceSAndroid Build Coastguard Worker std::string str = generateFullSource();
764*35238bceSAndroid Build Coastguard Worker
765*35238bceSAndroid Build Coastguard Worker sliceSourceString(str, sources, m_numSlices, paddingLength);
766*35238bceSAndroid Build Coastguard Worker
767*35238bceSAndroid Build Coastguard Worker if (m_randomNullTerm)
768*35238bceSAndroid Build Coastguard Worker insertRandomNullTermStrings(sources);
769*35238bceSAndroid Build Coastguard Worker }
770*35238bceSAndroid Build Coastguard Worker
buildProgram(glu::Shader & shader)771*35238bceSAndroid Build Coastguard Worker void buildProgram(glu::Shader &shader)
772*35238bceSAndroid Build Coastguard Worker {
773*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
774*35238bceSAndroid Build Coastguard Worker glu::RenderContext &renderCtx = m_context.getRenderContext();
775*35238bceSAndroid Build Coastguard Worker
776*35238bceSAndroid Build Coastguard Worker const glu::ShaderType supportShaderType =
777*35238bceSAndroid Build Coastguard Worker (m_shaderType == glu::SHADERTYPE_FRAGMENT ? glu::SHADERTYPE_VERTEX : glu::SHADERTYPE_FRAGMENT);
778*35238bceSAndroid Build Coastguard Worker const char *supportShaderSource = getSimpleShaderSource(supportShaderType);
779*35238bceSAndroid Build Coastguard Worker glu::Shader supportShader(renderCtx, supportShaderType);
780*35238bceSAndroid Build Coastguard Worker
781*35238bceSAndroid Build Coastguard Worker glu::Program program(renderCtx);
782*35238bceSAndroid Build Coastguard Worker
783*35238bceSAndroid Build Coastguard Worker supportShader.setSources(1, &supportShaderSource, 0);
784*35238bceSAndroid Build Coastguard Worker supportShader.compile();
785*35238bceSAndroid Build Coastguard Worker
786*35238bceSAndroid Build Coastguard Worker program.attachShader(shader.getShader());
787*35238bceSAndroid Build Coastguard Worker program.attachShader(supportShader.getShader());
788*35238bceSAndroid Build Coastguard Worker
789*35238bceSAndroid Build Coastguard Worker program.link();
790*35238bceSAndroid Build Coastguard Worker
791*35238bceSAndroid Build Coastguard Worker if (m_shaderType == glu::SHADERTYPE_VERTEX)
792*35238bceSAndroid Build Coastguard Worker logVertexFragmentProgram(log, renderCtx, program, shader, supportShader);
793*35238bceSAndroid Build Coastguard Worker else
794*35238bceSAndroid Build Coastguard Worker logVertexFragmentProgram(log, renderCtx, program, supportShader, shader);
795*35238bceSAndroid Build Coastguard Worker }
796*35238bceSAndroid Build Coastguard Worker
test(void)797*35238bceSAndroid Build Coastguard Worker void test(void)
798*35238bceSAndroid Build Coastguard Worker {
799*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
800*35238bceSAndroid Build Coastguard Worker glu::RenderContext &renderCtx = m_context.getRenderContext();
801*35238bceSAndroid Build Coastguard Worker
802*35238bceSAndroid Build Coastguard Worker ShaderSources sources;
803*35238bceSAndroid Build Coastguard Worker glu::Shader shader(renderCtx, m_shaderType);
804*35238bceSAndroid Build Coastguard Worker
805*35238bceSAndroid Build Coastguard Worker generateSources(sources);
806*35238bceSAndroid Build Coastguard Worker setShaderSources(shader, sources);
807*35238bceSAndroid Build Coastguard Worker shader.compile();
808*35238bceSAndroid Build Coastguard Worker
809*35238bceSAndroid Build Coastguard Worker buildProgram(shader);
810*35238bceSAndroid Build Coastguard Worker
811*35238bceSAndroid Build Coastguard Worker if (!shader.getCompileStatus())
812*35238bceSAndroid Build Coastguard Worker {
813*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Compilation failed." << TestLog::EndMessage;
814*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Compile failed");
815*35238bceSAndroid Build Coastguard Worker }
816*35238bceSAndroid Build Coastguard Worker }
817*35238bceSAndroid Build Coastguard Worker
818*35238bceSAndroid Build Coastguard Worker private:
819*35238bceSAndroid Build Coastguard Worker de::Random m_rnd;
820*35238bceSAndroid Build Coastguard Worker
821*35238bceSAndroid Build Coastguard Worker const glu::ShaderType m_shaderType;
822*35238bceSAndroid Build Coastguard Worker const int m_numSlices;
823*35238bceSAndroid Build Coastguard Worker
824*35238bceSAndroid Build Coastguard Worker const bool m_explicitLengths;
825*35238bceSAndroid Build Coastguard Worker const bool m_randomNullTerm;
826*35238bceSAndroid Build Coastguard Worker };
827*35238bceSAndroid Build Coastguard Worker
828*35238bceSAndroid Build Coastguard Worker // Base class for program state persistence cases
829*35238bceSAndroid Build Coastguard Worker
830*35238bceSAndroid Build Coastguard Worker class ProgramStateCase : public ApiCase
831*35238bceSAndroid Build Coastguard Worker {
832*35238bceSAndroid Build Coastguard Worker public:
833*35238bceSAndroid Build Coastguard Worker ProgramStateCase(Context &context, const char *name, const char *desc, glu::ShaderType shaderType);
~ProgramStateCase(void)834*35238bceSAndroid Build Coastguard Worker virtual ~ProgramStateCase(void)
835*35238bceSAndroid Build Coastguard Worker {
836*35238bceSAndroid Build Coastguard Worker }
837*35238bceSAndroid Build Coastguard Worker
838*35238bceSAndroid Build Coastguard Worker void buildProgram(glu::Program &program, ShaderAllocator &shaders);
839*35238bceSAndroid Build Coastguard Worker void verify(glu::Program &program, const glu::ProgramInfo &reference);
840*35238bceSAndroid Build Coastguard Worker
841*35238bceSAndroid Build Coastguard Worker void test(void);
842*35238bceSAndroid Build Coastguard Worker
843*35238bceSAndroid Build Coastguard Worker virtual void executeForProgram(glu::Program &program, ShaderAllocator &shaders) = 0;
844*35238bceSAndroid Build Coastguard Worker
845*35238bceSAndroid Build Coastguard Worker protected:
846*35238bceSAndroid Build Coastguard Worker de::Random m_rnd;
847*35238bceSAndroid Build Coastguard Worker const glu::ShaderType m_shaderType;
848*35238bceSAndroid Build Coastguard Worker };
849*35238bceSAndroid Build Coastguard Worker
ProgramStateCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)850*35238bceSAndroid Build Coastguard Worker ProgramStateCase::ProgramStateCase(Context &context, const char *name, const char *desc, glu::ShaderType shaderType)
851*35238bceSAndroid Build Coastguard Worker : ApiCase(context, name, desc)
852*35238bceSAndroid Build Coastguard Worker , m_rnd(deStringHash(name) ^ 0x713de0ca)
853*35238bceSAndroid Build Coastguard Worker , m_shaderType(shaderType)
854*35238bceSAndroid Build Coastguard Worker {
855*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_shaderType == glu::SHADERTYPE_VERTEX || m_shaderType == glu::SHADERTYPE_FRAGMENT);
856*35238bceSAndroid Build Coastguard Worker }
857*35238bceSAndroid Build Coastguard Worker
buildProgram(glu::Program & program,ShaderAllocator & shaders)858*35238bceSAndroid Build Coastguard Worker void ProgramStateCase::buildProgram(glu::Program &program, ShaderAllocator &shaders)
859*35238bceSAndroid Build Coastguard Worker {
860*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
861*35238bceSAndroid Build Coastguard Worker
862*35238bceSAndroid Build Coastguard Worker glu::Shader &vertShader = shaders.createShader(glu::SHADERTYPE_VERTEX);
863*35238bceSAndroid Build Coastguard Worker glu::Shader &fragShader = shaders.createShader(glu::SHADERTYPE_FRAGMENT);
864*35238bceSAndroid Build Coastguard Worker
865*35238bceSAndroid Build Coastguard Worker vertShader.compile();
866*35238bceSAndroid Build Coastguard Worker fragShader.compile();
867*35238bceSAndroid Build Coastguard Worker
868*35238bceSAndroid Build Coastguard Worker program.attachShader(vertShader.getShader());
869*35238bceSAndroid Build Coastguard Worker program.attachShader(fragShader.getShader());
870*35238bceSAndroid Build Coastguard Worker program.link();
871*35238bceSAndroid Build Coastguard Worker
872*35238bceSAndroid Build Coastguard Worker logProgram(log, m_context.getRenderContext(), program, shaders);
873*35238bceSAndroid Build Coastguard Worker }
874*35238bceSAndroid Build Coastguard Worker
verify(glu::Program & program,const glu::ProgramInfo & reference)875*35238bceSAndroid Build Coastguard Worker void ProgramStateCase::verify(glu::Program &program, const glu::ProgramInfo &reference)
876*35238bceSAndroid Build Coastguard Worker {
877*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
878*35238bceSAndroid Build Coastguard Worker const glu::ProgramInfo &programInfo = program.getInfo();
879*35238bceSAndroid Build Coastguard Worker
880*35238bceSAndroid Build Coastguard Worker if (!programInfo.linkOk)
881*35238bceSAndroid Build Coastguard Worker {
882*35238bceSAndroid Build Coastguard Worker log << TestLog::Message
883*35238bceSAndroid Build Coastguard Worker << "Fail, link status may only change as a result of linking or loading a program binary."
884*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
885*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Link status changed");
886*35238bceSAndroid Build Coastguard Worker }
887*35238bceSAndroid Build Coastguard Worker
888*35238bceSAndroid Build Coastguard Worker if (programInfo.linkTimeUs != reference.linkTimeUs)
889*35238bceSAndroid Build Coastguard Worker {
890*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Fail, reported link time changed." << TestLog::EndMessage;
891*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Link time changed");
892*35238bceSAndroid Build Coastguard Worker }
893*35238bceSAndroid Build Coastguard Worker
894*35238bceSAndroid Build Coastguard Worker if (programInfo.infoLog != reference.infoLog)
895*35238bceSAndroid Build Coastguard Worker {
896*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Fail, program infolog changed." << TestLog::EndMessage;
897*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Infolog changed");
898*35238bceSAndroid Build Coastguard Worker }
899*35238bceSAndroid Build Coastguard Worker }
900*35238bceSAndroid Build Coastguard Worker
test(void)901*35238bceSAndroid Build Coastguard Worker void ProgramStateCase::test(void)
902*35238bceSAndroid Build Coastguard Worker {
903*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
904*35238bceSAndroid Build Coastguard Worker glu::RenderContext &renderCtx = m_context.getRenderContext();
905*35238bceSAndroid Build Coastguard Worker
906*35238bceSAndroid Build Coastguard Worker ConstantShaderGenerator sourceGen(m_rnd);
907*35238bceSAndroid Build Coastguard Worker
908*35238bceSAndroid Build Coastguard Worker ShaderAllocator shaders(renderCtx, sourceGen);
909*35238bceSAndroid Build Coastguard Worker glu::Program program(renderCtx);
910*35238bceSAndroid Build Coastguard Worker
911*35238bceSAndroid Build Coastguard Worker buildProgram(program, shaders);
912*35238bceSAndroid Build Coastguard Worker
913*35238bceSAndroid Build Coastguard Worker if (program.getLinkStatus())
914*35238bceSAndroid Build Coastguard Worker {
915*35238bceSAndroid Build Coastguard Worker glu::ProgramInfo programInfo = program.getInfo();
916*35238bceSAndroid Build Coastguard Worker
917*35238bceSAndroid Build Coastguard Worker executeForProgram(program, shaders);
918*35238bceSAndroid Build Coastguard Worker
919*35238bceSAndroid Build Coastguard Worker verify(program, programInfo);
920*35238bceSAndroid Build Coastguard Worker
921*35238bceSAndroid Build Coastguard Worker logProgram(log, renderCtx, program, shaders);
922*35238bceSAndroid Build Coastguard Worker }
923*35238bceSAndroid Build Coastguard Worker else
924*35238bceSAndroid Build Coastguard Worker {
925*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Fail, couldn't link program." << TestLog::EndMessage;
926*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Linking failed");
927*35238bceSAndroid Build Coastguard Worker }
928*35238bceSAndroid Build Coastguard Worker }
929*35238bceSAndroid Build Coastguard Worker
930*35238bceSAndroid Build Coastguard Worker // Program state case utilities
931*35238bceSAndroid Build Coastguard Worker
932*35238bceSAndroid Build Coastguard Worker namespace
933*35238bceSAndroid Build Coastguard Worker {
934*35238bceSAndroid Build Coastguard Worker
935*35238bceSAndroid Build Coastguard Worker template <class T>
addProgramStateCase(TestCaseGroup * group,Context & context,const std::string & name,const std::string & desc)936*35238bceSAndroid Build Coastguard Worker void addProgramStateCase(TestCaseGroup *group, Context &context, const std::string &name, const std::string &desc)
937*35238bceSAndroid Build Coastguard Worker {
938*35238bceSAndroid Build Coastguard Worker for (int shaderTypeInt = 0; shaderTypeInt < 2; shaderTypeInt++)
939*35238bceSAndroid Build Coastguard Worker {
940*35238bceSAndroid Build Coastguard Worker const glu::ShaderType shaderType = (shaderTypeInt == 1) ? glu::SHADERTYPE_FRAGMENT : glu::SHADERTYPE_VERTEX;
941*35238bceSAndroid Build Coastguard Worker const std::string shaderTypeName = getShaderTypeName(shaderType);
942*35238bceSAndroid Build Coastguard Worker
943*35238bceSAndroid Build Coastguard Worker const std::string caseName = name + "_" + shaderTypeName;
944*35238bceSAndroid Build Coastguard Worker const std::string caseDesc = "Build program, " + desc + ", for " + shaderTypeName + " shader.";
945*35238bceSAndroid Build Coastguard Worker
946*35238bceSAndroid Build Coastguard Worker group->addChild(new T(context, caseName.c_str(), caseDesc.c_str(), shaderType));
947*35238bceSAndroid Build Coastguard Worker }
948*35238bceSAndroid Build Coastguard Worker }
949*35238bceSAndroid Build Coastguard Worker
950*35238bceSAndroid Build Coastguard Worker } // namespace
951*35238bceSAndroid Build Coastguard Worker
952*35238bceSAndroid Build Coastguard Worker // Specialized program state cases
953*35238bceSAndroid Build Coastguard Worker
954*35238bceSAndroid Build Coastguard Worker class ProgramStateDetachShaderCase : public ProgramStateCase
955*35238bceSAndroid Build Coastguard Worker {
956*35238bceSAndroid Build Coastguard Worker public:
ProgramStateDetachShaderCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)957*35238bceSAndroid Build Coastguard Worker ProgramStateDetachShaderCase(Context &context, const char *name, const char *desc, glu::ShaderType shaderType)
958*35238bceSAndroid Build Coastguard Worker : ProgramStateCase(context, name, desc, shaderType)
959*35238bceSAndroid Build Coastguard Worker {
960*35238bceSAndroid Build Coastguard Worker }
961*35238bceSAndroid Build Coastguard Worker
~ProgramStateDetachShaderCase(void)962*35238bceSAndroid Build Coastguard Worker virtual ~ProgramStateDetachShaderCase(void)
963*35238bceSAndroid Build Coastguard Worker {
964*35238bceSAndroid Build Coastguard Worker }
965*35238bceSAndroid Build Coastguard Worker
executeForProgram(glu::Program & program,ShaderAllocator & shaders)966*35238bceSAndroid Build Coastguard Worker void executeForProgram(glu::Program &program, ShaderAllocator &shaders)
967*35238bceSAndroid Build Coastguard Worker {
968*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
969*35238bceSAndroid Build Coastguard Worker glu::Shader &caseShader = shaders.get(m_shaderType);
970*35238bceSAndroid Build Coastguard Worker
971*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Detaching " + std::string(getShaderTypeName(m_shaderType)) + " shader"
972*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
973*35238bceSAndroid Build Coastguard Worker program.detachShader(caseShader.getShader());
974*35238bceSAndroid Build Coastguard Worker }
975*35238bceSAndroid Build Coastguard Worker };
976*35238bceSAndroid Build Coastguard Worker
977*35238bceSAndroid Build Coastguard Worker class ProgramStateReattachShaderCase : public ProgramStateCase
978*35238bceSAndroid Build Coastguard Worker {
979*35238bceSAndroid Build Coastguard Worker public:
ProgramStateReattachShaderCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)980*35238bceSAndroid Build Coastguard Worker ProgramStateReattachShaderCase(Context &context, const char *name, const char *desc, glu::ShaderType shaderType)
981*35238bceSAndroid Build Coastguard Worker : ProgramStateCase(context, name, desc, shaderType)
982*35238bceSAndroid Build Coastguard Worker {
983*35238bceSAndroid Build Coastguard Worker }
984*35238bceSAndroid Build Coastguard Worker
~ProgramStateReattachShaderCase(void)985*35238bceSAndroid Build Coastguard Worker virtual ~ProgramStateReattachShaderCase(void)
986*35238bceSAndroid Build Coastguard Worker {
987*35238bceSAndroid Build Coastguard Worker }
988*35238bceSAndroid Build Coastguard Worker
executeForProgram(glu::Program & program,ShaderAllocator & shaders)989*35238bceSAndroid Build Coastguard Worker void executeForProgram(glu::Program &program, ShaderAllocator &shaders)
990*35238bceSAndroid Build Coastguard Worker {
991*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
992*35238bceSAndroid Build Coastguard Worker glu::Shader &caseShader = shaders.get(m_shaderType);
993*35238bceSAndroid Build Coastguard Worker
994*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Reattaching " + std::string(getShaderTypeName(m_shaderType)) + " shader"
995*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
996*35238bceSAndroid Build Coastguard Worker program.detachShader(caseShader.getShader());
997*35238bceSAndroid Build Coastguard Worker program.attachShader(caseShader.getShader());
998*35238bceSAndroid Build Coastguard Worker }
999*35238bceSAndroid Build Coastguard Worker };
1000*35238bceSAndroid Build Coastguard Worker
1001*35238bceSAndroid Build Coastguard Worker class ProgramStateDeleteShaderCase : public ProgramStateCase
1002*35238bceSAndroid Build Coastguard Worker {
1003*35238bceSAndroid Build Coastguard Worker public:
ProgramStateDeleteShaderCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)1004*35238bceSAndroid Build Coastguard Worker ProgramStateDeleteShaderCase(Context &context, const char *name, const char *desc, glu::ShaderType shaderType)
1005*35238bceSAndroid Build Coastguard Worker : ProgramStateCase(context, name, desc, shaderType)
1006*35238bceSAndroid Build Coastguard Worker {
1007*35238bceSAndroid Build Coastguard Worker }
1008*35238bceSAndroid Build Coastguard Worker
~ProgramStateDeleteShaderCase(void)1009*35238bceSAndroid Build Coastguard Worker virtual ~ProgramStateDeleteShaderCase(void)
1010*35238bceSAndroid Build Coastguard Worker {
1011*35238bceSAndroid Build Coastguard Worker }
1012*35238bceSAndroid Build Coastguard Worker
executeForProgram(glu::Program & program,ShaderAllocator & shaders)1013*35238bceSAndroid Build Coastguard Worker void executeForProgram(glu::Program &program, ShaderAllocator &shaders)
1014*35238bceSAndroid Build Coastguard Worker {
1015*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1016*35238bceSAndroid Build Coastguard Worker glu::Shader &caseShader = shaders.get(m_shaderType);
1017*35238bceSAndroid Build Coastguard Worker
1018*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Deleting " + std::string(getShaderTypeName(m_shaderType)) + " shader"
1019*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1020*35238bceSAndroid Build Coastguard Worker program.detachShader(caseShader.getShader());
1021*35238bceSAndroid Build Coastguard Worker shaders.deleteShader(m_shaderType);
1022*35238bceSAndroid Build Coastguard Worker }
1023*35238bceSAndroid Build Coastguard Worker };
1024*35238bceSAndroid Build Coastguard Worker
1025*35238bceSAndroid Build Coastguard Worker class ProgramStateReplaceShaderCase : public ProgramStateCase
1026*35238bceSAndroid Build Coastguard Worker {
1027*35238bceSAndroid Build Coastguard Worker public:
ProgramStateReplaceShaderCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)1028*35238bceSAndroid Build Coastguard Worker ProgramStateReplaceShaderCase(Context &context, const char *name, const char *desc, glu::ShaderType shaderType)
1029*35238bceSAndroid Build Coastguard Worker : ProgramStateCase(context, name, desc, shaderType)
1030*35238bceSAndroid Build Coastguard Worker {
1031*35238bceSAndroid Build Coastguard Worker }
1032*35238bceSAndroid Build Coastguard Worker
~ProgramStateReplaceShaderCase(void)1033*35238bceSAndroid Build Coastguard Worker virtual ~ProgramStateReplaceShaderCase(void)
1034*35238bceSAndroid Build Coastguard Worker {
1035*35238bceSAndroid Build Coastguard Worker }
1036*35238bceSAndroid Build Coastguard Worker
executeForProgram(glu::Program & program,ShaderAllocator & shaders)1037*35238bceSAndroid Build Coastguard Worker void executeForProgram(glu::Program &program, ShaderAllocator &shaders)
1038*35238bceSAndroid Build Coastguard Worker {
1039*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1040*35238bceSAndroid Build Coastguard Worker glu::Shader &caseShader = shaders.get(m_shaderType);
1041*35238bceSAndroid Build Coastguard Worker
1042*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Deleting and replacing " + std::string(getShaderTypeName(m_shaderType)) + " shader"
1043*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1044*35238bceSAndroid Build Coastguard Worker program.detachShader(caseShader.getShader());
1045*35238bceSAndroid Build Coastguard Worker shaders.deleteShader(m_shaderType);
1046*35238bceSAndroid Build Coastguard Worker program.attachShader(shaders.createShader(m_shaderType).getShader());
1047*35238bceSAndroid Build Coastguard Worker }
1048*35238bceSAndroid Build Coastguard Worker };
1049*35238bceSAndroid Build Coastguard Worker
1050*35238bceSAndroid Build Coastguard Worker class ProgramStateRecompileShaderCase : public ProgramStateCase
1051*35238bceSAndroid Build Coastguard Worker {
1052*35238bceSAndroid Build Coastguard Worker public:
ProgramStateRecompileShaderCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)1053*35238bceSAndroid Build Coastguard Worker ProgramStateRecompileShaderCase(Context &context, const char *name, const char *desc, glu::ShaderType shaderType)
1054*35238bceSAndroid Build Coastguard Worker : ProgramStateCase(context, name, desc, shaderType)
1055*35238bceSAndroid Build Coastguard Worker {
1056*35238bceSAndroid Build Coastguard Worker }
1057*35238bceSAndroid Build Coastguard Worker
~ProgramStateRecompileShaderCase(void)1058*35238bceSAndroid Build Coastguard Worker virtual ~ProgramStateRecompileShaderCase(void)
1059*35238bceSAndroid Build Coastguard Worker {
1060*35238bceSAndroid Build Coastguard Worker }
1061*35238bceSAndroid Build Coastguard Worker
executeForProgram(glu::Program & program,ShaderAllocator & shaders)1062*35238bceSAndroid Build Coastguard Worker void executeForProgram(glu::Program &program, ShaderAllocator &shaders)
1063*35238bceSAndroid Build Coastguard Worker {
1064*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1065*35238bceSAndroid Build Coastguard Worker glu::Shader &caseShader = shaders.get(m_shaderType);
1066*35238bceSAndroid Build Coastguard Worker
1067*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Recompiling " + std::string(getShaderTypeName(m_shaderType)) + " shader"
1068*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1069*35238bceSAndroid Build Coastguard Worker caseShader.compile();
1070*35238bceSAndroid Build Coastguard Worker DE_UNREF(program);
1071*35238bceSAndroid Build Coastguard Worker }
1072*35238bceSAndroid Build Coastguard Worker };
1073*35238bceSAndroid Build Coastguard Worker
1074*35238bceSAndroid Build Coastguard Worker class ProgramStateReplaceSourceCase : public ProgramStateCase
1075*35238bceSAndroid Build Coastguard Worker {
1076*35238bceSAndroid Build Coastguard Worker public:
ProgramStateReplaceSourceCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)1077*35238bceSAndroid Build Coastguard Worker ProgramStateReplaceSourceCase(Context &context, const char *name, const char *desc, glu::ShaderType shaderType)
1078*35238bceSAndroid Build Coastguard Worker : ProgramStateCase(context, name, desc, shaderType)
1079*35238bceSAndroid Build Coastguard Worker {
1080*35238bceSAndroid Build Coastguard Worker }
1081*35238bceSAndroid Build Coastguard Worker
~ProgramStateReplaceSourceCase(void)1082*35238bceSAndroid Build Coastguard Worker virtual ~ProgramStateReplaceSourceCase(void)
1083*35238bceSAndroid Build Coastguard Worker {
1084*35238bceSAndroid Build Coastguard Worker }
1085*35238bceSAndroid Build Coastguard Worker
executeForProgram(glu::Program & program,ShaderAllocator & shaders)1086*35238bceSAndroid Build Coastguard Worker void executeForProgram(glu::Program &program, ShaderAllocator &shaders)
1087*35238bceSAndroid Build Coastguard Worker {
1088*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1089*35238bceSAndroid Build Coastguard Worker glu::Shader &caseShader = shaders.get(m_shaderType);
1090*35238bceSAndroid Build Coastguard Worker
1091*35238bceSAndroid Build Coastguard Worker log << TestLog::Message
1092*35238bceSAndroid Build Coastguard Worker << "Replacing " + std::string(getShaderTypeName(m_shaderType)) + " shader source and recompiling"
1093*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1094*35238bceSAndroid Build Coastguard Worker shaders.setSource(m_shaderType);
1095*35238bceSAndroid Build Coastguard Worker caseShader.compile();
1096*35238bceSAndroid Build Coastguard Worker DE_UNREF(program);
1097*35238bceSAndroid Build Coastguard Worker }
1098*35238bceSAndroid Build Coastguard Worker };
1099*35238bceSAndroid Build Coastguard Worker
1100*35238bceSAndroid Build Coastguard Worker // Program binary utilities
1101*35238bceSAndroid Build Coastguard Worker
1102*35238bceSAndroid Build Coastguard Worker namespace
1103*35238bceSAndroid Build Coastguard Worker {
1104*35238bceSAndroid Build Coastguard Worker
1105*35238bceSAndroid Build Coastguard Worker struct ProgramBinary
1106*35238bceSAndroid Build Coastguard Worker {
1107*35238bceSAndroid Build Coastguard Worker GLenum format;
1108*35238bceSAndroid Build Coastguard Worker std::vector<uint8_t> data;
1109*35238bceSAndroid Build Coastguard Worker };
1110*35238bceSAndroid Build Coastguard Worker
programBinariesEqual(const ProgramBinary & first,const ProgramBinary & second)1111*35238bceSAndroid Build Coastguard Worker bool programBinariesEqual(const ProgramBinary &first, const ProgramBinary &second)
1112*35238bceSAndroid Build Coastguard Worker {
1113*35238bceSAndroid Build Coastguard Worker if ((first.format != second.format) || (first.data.size() != second.data.size()))
1114*35238bceSAndroid Build Coastguard Worker return false;
1115*35238bceSAndroid Build Coastguard Worker
1116*35238bceSAndroid Build Coastguard Worker return std::equal(first.data.begin(), first.data.end(), second.data.begin());
1117*35238bceSAndroid Build Coastguard Worker }
1118*35238bceSAndroid Build Coastguard Worker
1119*35238bceSAndroid Build Coastguard Worker } // namespace
1120*35238bceSAndroid Build Coastguard Worker
1121*35238bceSAndroid Build Coastguard Worker // Base class for program binary cases
1122*35238bceSAndroid Build Coastguard Worker
1123*35238bceSAndroid Build Coastguard Worker class ProgramBinaryCase : public TestCase, protected glu::CallLogWrapper
1124*35238bceSAndroid Build Coastguard Worker {
1125*35238bceSAndroid Build Coastguard Worker public:
1126*35238bceSAndroid Build Coastguard Worker ProgramBinaryCase(Context &context, const char *name, const char *desc);
1127*35238bceSAndroid Build Coastguard Worker virtual ~ProgramBinaryCase(void);
1128*35238bceSAndroid Build Coastguard Worker
1129*35238bceSAndroid Build Coastguard Worker void getBinaryFormats(std::vector<GLenum> &out);
1130*35238bceSAndroid Build Coastguard Worker bool isFormatSupported(const glw::GLenum format) const;
1131*35238bceSAndroid Build Coastguard Worker
1132*35238bceSAndroid Build Coastguard Worker void getProgramBinary(ProgramBinary &out, GLuint program);
1133*35238bceSAndroid Build Coastguard Worker void loadProgramBinary(ProgramBinary &binary, GLuint program);
1134*35238bceSAndroid Build Coastguard Worker
1135*35238bceSAndroid Build Coastguard Worker void verifyProgramBinary(ProgramBinary &binary);
1136*35238bceSAndroid Build Coastguard Worker
1137*35238bceSAndroid Build Coastguard Worker void init(void);
1138*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
1139*35238bceSAndroid Build Coastguard Worker
1140*35238bceSAndroid Build Coastguard Worker virtual void test(void) = 0;
1141*35238bceSAndroid Build Coastguard Worker
1142*35238bceSAndroid Build Coastguard Worker protected:
1143*35238bceSAndroid Build Coastguard Worker std::vector<GLenum> m_formats;
1144*35238bceSAndroid Build Coastguard Worker };
1145*35238bceSAndroid Build Coastguard Worker
ProgramBinaryCase(Context & context,const char * name,const char * desc)1146*35238bceSAndroid Build Coastguard Worker ProgramBinaryCase::ProgramBinaryCase(Context &context, const char *name, const char *desc)
1147*35238bceSAndroid Build Coastguard Worker : TestCase(context, name, desc)
1148*35238bceSAndroid Build Coastguard Worker , CallLogWrapper(context.getRenderContext().getFunctions(), context.getTestContext().getLog())
1149*35238bceSAndroid Build Coastguard Worker {
1150*35238bceSAndroid Build Coastguard Worker }
1151*35238bceSAndroid Build Coastguard Worker
~ProgramBinaryCase(void)1152*35238bceSAndroid Build Coastguard Worker ProgramBinaryCase::~ProgramBinaryCase(void)
1153*35238bceSAndroid Build Coastguard Worker {
1154*35238bceSAndroid Build Coastguard Worker }
1155*35238bceSAndroid Build Coastguard Worker
getBinaryFormats(std::vector<GLenum> & out)1156*35238bceSAndroid Build Coastguard Worker void ProgramBinaryCase::getBinaryFormats(std::vector<GLenum> &out)
1157*35238bceSAndroid Build Coastguard Worker {
1158*35238bceSAndroid Build Coastguard Worker GLint numFormats = -1;
1159*35238bceSAndroid Build Coastguard Worker glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &numFormats);
1160*35238bceSAndroid Build Coastguard Worker
1161*35238bceSAndroid Build Coastguard Worker out.clear();
1162*35238bceSAndroid Build Coastguard Worker
1163*35238bceSAndroid Build Coastguard Worker if (numFormats > 0)
1164*35238bceSAndroid Build Coastguard Worker {
1165*35238bceSAndroid Build Coastguard Worker out.resize(numFormats, 0);
1166*35238bceSAndroid Build Coastguard Worker
1167*35238bceSAndroid Build Coastguard Worker glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, (GLint *)&out[0]);
1168*35238bceSAndroid Build Coastguard Worker }
1169*35238bceSAndroid Build Coastguard Worker }
1170*35238bceSAndroid Build Coastguard Worker
isFormatSupported(const glw::GLenum format) const1171*35238bceSAndroid Build Coastguard Worker bool ProgramBinaryCase::isFormatSupported(const glw::GLenum format) const
1172*35238bceSAndroid Build Coastguard Worker {
1173*35238bceSAndroid Build Coastguard Worker return (std::find(m_formats.begin(), m_formats.end(), format) != m_formats.end());
1174*35238bceSAndroid Build Coastguard Worker }
1175*35238bceSAndroid Build Coastguard Worker
getProgramBinary(ProgramBinary & out,GLuint program)1176*35238bceSAndroid Build Coastguard Worker void ProgramBinaryCase::getProgramBinary(ProgramBinary &out, GLuint program)
1177*35238bceSAndroid Build Coastguard Worker {
1178*35238bceSAndroid Build Coastguard Worker GLint binaryLength = -1;
1179*35238bceSAndroid Build Coastguard Worker glGetProgramiv(program, GL_PROGRAM_BINARY_LENGTH, &binaryLength);
1180*35238bceSAndroid Build Coastguard Worker
1181*35238bceSAndroid Build Coastguard Worker if (binaryLength > 0)
1182*35238bceSAndroid Build Coastguard Worker {
1183*35238bceSAndroid Build Coastguard Worker GLsizei actualLength;
1184*35238bceSAndroid Build Coastguard Worker GLenum format;
1185*35238bceSAndroid Build Coastguard Worker
1186*35238bceSAndroid Build Coastguard Worker out.data.clear();
1187*35238bceSAndroid Build Coastguard Worker out.data.resize(binaryLength, 0);
1188*35238bceSAndroid Build Coastguard Worker
1189*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glGetProgramBinary(program, (GLsizei)out.data.size(), &actualLength, &format, &(out.data[0])));
1190*35238bceSAndroid Build Coastguard Worker
1191*35238bceSAndroid Build Coastguard Worker TCU_CHECK(actualLength == binaryLength);
1192*35238bceSAndroid Build Coastguard Worker
1193*35238bceSAndroid Build Coastguard Worker out.format = format;
1194*35238bceSAndroid Build Coastguard Worker }
1195*35238bceSAndroid Build Coastguard Worker }
1196*35238bceSAndroid Build Coastguard Worker
loadProgramBinary(ProgramBinary & binary,GLuint program)1197*35238bceSAndroid Build Coastguard Worker void ProgramBinaryCase::loadProgramBinary(ProgramBinary &binary, GLuint program)
1198*35238bceSAndroid Build Coastguard Worker {
1199*35238bceSAndroid Build Coastguard Worker glProgramBinary(program, binary.format, &binary.data[0], (GLsizei)binary.data.size());
1200*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("Failed to load program binary.");
1201*35238bceSAndroid Build Coastguard Worker }
1202*35238bceSAndroid Build Coastguard Worker
verifyProgramBinary(ProgramBinary & binary)1203*35238bceSAndroid Build Coastguard Worker void ProgramBinaryCase::verifyProgramBinary(ProgramBinary &binary)
1204*35238bceSAndroid Build Coastguard Worker {
1205*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1206*35238bceSAndroid Build Coastguard Worker
1207*35238bceSAndroid Build Coastguard Worker if (!isFormatSupported(binary.format))
1208*35238bceSAndroid Build Coastguard Worker {
1209*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Program binary format " << binary.format
1210*35238bceSAndroid Build Coastguard Worker << " is not among the supported formats reported by the platform." << TestLog::EndMessage;
1211*35238bceSAndroid Build Coastguard Worker
1212*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid format");
1213*35238bceSAndroid Build Coastguard Worker }
1214*35238bceSAndroid Build Coastguard Worker }
1215*35238bceSAndroid Build Coastguard Worker
init(void)1216*35238bceSAndroid Build Coastguard Worker void ProgramBinaryCase::init(void)
1217*35238bceSAndroid Build Coastguard Worker {
1218*35238bceSAndroid Build Coastguard Worker getBinaryFormats(m_formats);
1219*35238bceSAndroid Build Coastguard Worker }
1220*35238bceSAndroid Build Coastguard Worker
iterate(void)1221*35238bceSAndroid Build Coastguard Worker tcu::TestNode::IterateResult ProgramBinaryCase::iterate(void)
1222*35238bceSAndroid Build Coastguard Worker {
1223*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1224*35238bceSAndroid Build Coastguard Worker
1225*35238bceSAndroid Build Coastguard Worker if (m_formats.empty())
1226*35238bceSAndroid Build Coastguard Worker {
1227*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "No program binary formats are supported." << TestLog::EndMessage;
1228*35238bceSAndroid Build Coastguard Worker
1229*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not supported");
1230*35238bceSAndroid Build Coastguard Worker }
1231*35238bceSAndroid Build Coastguard Worker else
1232*35238bceSAndroid Build Coastguard Worker {
1233*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1234*35238bceSAndroid Build Coastguard Worker
1235*35238bceSAndroid Build Coastguard Worker enableLogging(true);
1236*35238bceSAndroid Build Coastguard Worker test();
1237*35238bceSAndroid Build Coastguard Worker }
1238*35238bceSAndroid Build Coastguard Worker
1239*35238bceSAndroid Build Coastguard Worker return STOP;
1240*35238bceSAndroid Build Coastguard Worker }
1241*35238bceSAndroid Build Coastguard Worker
1242*35238bceSAndroid Build Coastguard Worker // Simple program binary case
1243*35238bceSAndroid Build Coastguard Worker
1244*35238bceSAndroid Build Coastguard Worker class ProgramBinarySimpleCase : public ProgramBinaryCase
1245*35238bceSAndroid Build Coastguard Worker {
1246*35238bceSAndroid Build Coastguard Worker public:
ProgramBinarySimpleCase(Context & context,const char * name,const char * desc)1247*35238bceSAndroid Build Coastguard Worker ProgramBinarySimpleCase(Context &context, const char *name, const char *desc)
1248*35238bceSAndroid Build Coastguard Worker : ProgramBinaryCase(context, name, desc)
1249*35238bceSAndroid Build Coastguard Worker {
1250*35238bceSAndroid Build Coastguard Worker }
1251*35238bceSAndroid Build Coastguard Worker
~ProgramBinarySimpleCase(void)1252*35238bceSAndroid Build Coastguard Worker virtual ~ProgramBinarySimpleCase(void)
1253*35238bceSAndroid Build Coastguard Worker {
1254*35238bceSAndroid Build Coastguard Worker }
1255*35238bceSAndroid Build Coastguard Worker
test(void)1256*35238bceSAndroid Build Coastguard Worker void test(void)
1257*35238bceSAndroid Build Coastguard Worker {
1258*35238bceSAndroid Build Coastguard Worker const std::string vertSrc = getSimpleShaderSource(glu::SHADERTYPE_VERTEX);
1259*35238bceSAndroid Build Coastguard Worker const std::string fragSrc = getSimpleShaderSource(glu::SHADERTYPE_FRAGMENT);
1260*35238bceSAndroid Build Coastguard Worker
1261*35238bceSAndroid Build Coastguard Worker const glu::ProgramSources sources = glu::makeVtxFragSources(vertSrc, fragSrc);
1262*35238bceSAndroid Build Coastguard Worker
1263*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(m_context.getRenderContext(), sources);
1264*35238bceSAndroid Build Coastguard Worker
1265*35238bceSAndroid Build Coastguard Worker if (program.isOk())
1266*35238bceSAndroid Build Coastguard Worker {
1267*35238bceSAndroid Build Coastguard Worker ProgramBinary binary;
1268*35238bceSAndroid Build Coastguard Worker
1269*35238bceSAndroid Build Coastguard Worker getProgramBinary(binary, program.getProgram());
1270*35238bceSAndroid Build Coastguard Worker verifyProgramBinary(binary);
1271*35238bceSAndroid Build Coastguard Worker }
1272*35238bceSAndroid Build Coastguard Worker }
1273*35238bceSAndroid Build Coastguard Worker };
1274*35238bceSAndroid Build Coastguard Worker
1275*35238bceSAndroid Build Coastguard Worker // Program binary uniform reset case
1276*35238bceSAndroid Build Coastguard Worker
1277*35238bceSAndroid Build Coastguard Worker class ProgramBinaryUniformResetCase : public ProgramBinaryCase
1278*35238bceSAndroid Build Coastguard Worker {
1279*35238bceSAndroid Build Coastguard Worker public:
ProgramBinaryUniformResetCase(Context & context,const char * name,const char * desc)1280*35238bceSAndroid Build Coastguard Worker ProgramBinaryUniformResetCase(Context &context, const char *name, const char *desc)
1281*35238bceSAndroid Build Coastguard Worker : ProgramBinaryCase(context, name, desc)
1282*35238bceSAndroid Build Coastguard Worker , m_rnd(deStringHash(name) ^ 0xf2b48c6a)
1283*35238bceSAndroid Build Coastguard Worker {
1284*35238bceSAndroid Build Coastguard Worker }
1285*35238bceSAndroid Build Coastguard Worker
~ProgramBinaryUniformResetCase(void)1286*35238bceSAndroid Build Coastguard Worker virtual ~ProgramBinaryUniformResetCase(void)
1287*35238bceSAndroid Build Coastguard Worker {
1288*35238bceSAndroid Build Coastguard Worker }
1289*35238bceSAndroid Build Coastguard Worker
getShaderSource(const glu::ShaderType shaderType) const1290*35238bceSAndroid Build Coastguard Worker std::string getShaderSource(const glu::ShaderType shaderType) const
1291*35238bceSAndroid Build Coastguard Worker {
1292*35238bceSAndroid Build Coastguard Worker const char *vertSrc = "#version 300 es\n"
1293*35238bceSAndroid Build Coastguard Worker "uniform bool u_boolVar;\n"
1294*35238bceSAndroid Build Coastguard Worker "uniform highp int u_intVar;\n"
1295*35238bceSAndroid Build Coastguard Worker "uniform highp float u_floatVar;\n\n"
1296*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n\n"
1297*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
1298*35238bceSAndroid Build Coastguard Worker "{\n"
1299*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
1300*35238bceSAndroid Build Coastguard Worker "}\n";
1301*35238bceSAndroid Build Coastguard Worker const char *fragSrc = "#version 300 es\n"
1302*35238bceSAndroid Build Coastguard Worker "uniform bool u_boolVar;\n"
1303*35238bceSAndroid Build Coastguard Worker "uniform highp int u_intVar;\n"
1304*35238bceSAndroid Build Coastguard Worker "uniform highp float u_floatVar;\n\n"
1305*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_fragColor;\n\n"
1306*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
1307*35238bceSAndroid Build Coastguard Worker "{\n"
1308*35238bceSAndroid Build Coastguard Worker " mediump float refAll = float(u_boolVar) + float(u_intVar) + u_floatVar;\n"
1309*35238bceSAndroid Build Coastguard Worker " o_fragColor = vec4(refAll);\n"
1310*35238bceSAndroid Build Coastguard Worker "}\n";
1311*35238bceSAndroid Build Coastguard Worker
1312*35238bceSAndroid Build Coastguard Worker DE_ASSERT(shaderType == glu::SHADERTYPE_VERTEX || shaderType == glu::SHADERTYPE_FRAGMENT);
1313*35238bceSAndroid Build Coastguard Worker
1314*35238bceSAndroid Build Coastguard Worker return (shaderType == glu::SHADERTYPE_VERTEX) ? vertSrc : fragSrc;
1315*35238bceSAndroid Build Coastguard Worker }
1316*35238bceSAndroid Build Coastguard Worker
setUniformsRandom(glu::ShaderProgram & program)1317*35238bceSAndroid Build Coastguard Worker void setUniformsRandom(glu::ShaderProgram &program)
1318*35238bceSAndroid Build Coastguard Worker {
1319*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1320*35238bceSAndroid Build Coastguard Worker const uint32_t glProg = program.getProgram();
1321*35238bceSAndroid Build Coastguard Worker
1322*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Setting uniforms to random non-zero values." << TestLog::EndMessage;
1323*35238bceSAndroid Build Coastguard Worker
1324*35238bceSAndroid Build Coastguard Worker glUseProgram(glProg);
1325*35238bceSAndroid Build Coastguard Worker
1326*35238bceSAndroid Build Coastguard Worker {
1327*35238bceSAndroid Build Coastguard Worker const GLint boolLoc = glGetUniformLocation(glProg, "u_boolVar");
1328*35238bceSAndroid Build Coastguard Worker const GLint intLoc = glGetUniformLocation(glProg, "u_intVar");
1329*35238bceSAndroid Build Coastguard Worker const GLint floatLoc = glGetUniformLocation(glProg, "u_floatVar");
1330*35238bceSAndroid Build Coastguard Worker
1331*35238bceSAndroid Build Coastguard Worker const int32_t intVal = m_rnd.getInt(1, 1000);
1332*35238bceSAndroid Build Coastguard Worker const float floatVal = m_rnd.getFloat(1.0, 1000.0);
1333*35238bceSAndroid Build Coastguard Worker
1334*35238bceSAndroid Build Coastguard Worker glUniform1i(boolLoc, GL_TRUE);
1335*35238bceSAndroid Build Coastguard Worker glUniform1f(floatLoc, floatVal);
1336*35238bceSAndroid Build Coastguard Worker glUniform1i(intLoc, intVal);
1337*35238bceSAndroid Build Coastguard Worker }
1338*35238bceSAndroid Build Coastguard Worker }
1339*35238bceSAndroid Build Coastguard Worker
verifyUniformInt(glu::ShaderProgram & program,const std::string & name)1340*35238bceSAndroid Build Coastguard Worker void verifyUniformInt(glu::ShaderProgram &program, const std::string &name)
1341*35238bceSAndroid Build Coastguard Worker {
1342*35238bceSAndroid Build Coastguard Worker const GLint intLoc = glGetUniformLocation(program.getProgram(), name.c_str());
1343*35238bceSAndroid Build Coastguard Worker GLint intVar = -1;
1344*35238bceSAndroid Build Coastguard Worker
1345*35238bceSAndroid Build Coastguard Worker glGetUniformiv(program.getProgram(), intLoc, &intVar);
1346*35238bceSAndroid Build Coastguard Worker
1347*35238bceSAndroid Build Coastguard Worker if (intVar != 0)
1348*35238bceSAndroid Build Coastguard Worker {
1349*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "Fail, expected zero value for " << name
1350*35238bceSAndroid Build Coastguard Worker << ", received: " << intVar << TestLog::EndMessage;
1351*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Uniform value not reset");
1352*35238bceSAndroid Build Coastguard Worker }
1353*35238bceSAndroid Build Coastguard Worker }
1354*35238bceSAndroid Build Coastguard Worker
verifyUniformFloat(glu::ShaderProgram & program,const std::string & name)1355*35238bceSAndroid Build Coastguard Worker void verifyUniformFloat(glu::ShaderProgram &program, const std::string &name)
1356*35238bceSAndroid Build Coastguard Worker {
1357*35238bceSAndroid Build Coastguard Worker const GLint floatLoc = glGetUniformLocation(program.getProgram(), name.c_str());
1358*35238bceSAndroid Build Coastguard Worker GLfloat floatVar = -1;
1359*35238bceSAndroid Build Coastguard Worker
1360*35238bceSAndroid Build Coastguard Worker glGetUniformfv(program.getProgram(), floatLoc, &floatVar);
1361*35238bceSAndroid Build Coastguard Worker
1362*35238bceSAndroid Build Coastguard Worker if (floatVar != 0.0f)
1363*35238bceSAndroid Build Coastguard Worker {
1364*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "Fail, expected zero value for " << name
1365*35238bceSAndroid Build Coastguard Worker << ", received: " << de::toString(floatVar) << TestLog::EndMessage;
1366*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Uniform value not reset");
1367*35238bceSAndroid Build Coastguard Worker }
1368*35238bceSAndroid Build Coastguard Worker }
1369*35238bceSAndroid Build Coastguard Worker
verifyUniformsReset(glu::ShaderProgram & program)1370*35238bceSAndroid Build Coastguard Worker void verifyUniformsReset(glu::ShaderProgram &program)
1371*35238bceSAndroid Build Coastguard Worker {
1372*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "Verifying uniform reset to 0/false." << TestLog::EndMessage;
1373*35238bceSAndroid Build Coastguard Worker
1374*35238bceSAndroid Build Coastguard Worker verifyUniformInt(program, "u_boolVar");
1375*35238bceSAndroid Build Coastguard Worker verifyUniformInt(program, "u_intVar");
1376*35238bceSAndroid Build Coastguard Worker verifyUniformFloat(program, "u_floatVar");
1377*35238bceSAndroid Build Coastguard Worker }
1378*35238bceSAndroid Build Coastguard Worker
test(void)1379*35238bceSAndroid Build Coastguard Worker void test(void)
1380*35238bceSAndroid Build Coastguard Worker {
1381*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1382*35238bceSAndroid Build Coastguard Worker
1383*35238bceSAndroid Build Coastguard Worker const std::string vertSrc = getShaderSource(glu::SHADERTYPE_VERTEX);
1384*35238bceSAndroid Build Coastguard Worker const std::string fragSrc = getShaderSource(glu::SHADERTYPE_FRAGMENT);
1385*35238bceSAndroid Build Coastguard Worker
1386*35238bceSAndroid Build Coastguard Worker const glu::ProgramSources sources = glu::makeVtxFragSources(vertSrc, fragSrc);
1387*35238bceSAndroid Build Coastguard Worker
1388*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(m_context.getRenderContext(), sources);
1389*35238bceSAndroid Build Coastguard Worker
1390*35238bceSAndroid Build Coastguard Worker log << program;
1391*35238bceSAndroid Build Coastguard Worker
1392*35238bceSAndroid Build Coastguard Worker TCU_CHECK_MSG(program.isOk(), "Couldn't build program");
1393*35238bceSAndroid Build Coastguard Worker
1394*35238bceSAndroid Build Coastguard Worker {
1395*35238bceSAndroid Build Coastguard Worker ProgramBinary binary;
1396*35238bceSAndroid Build Coastguard Worker
1397*35238bceSAndroid Build Coastguard Worker getProgramBinary(binary, program.getProgram());
1398*35238bceSAndroid Build Coastguard Worker verifyProgramBinary(binary);
1399*35238bceSAndroid Build Coastguard Worker
1400*35238bceSAndroid Build Coastguard Worker setUniformsRandom(program);
1401*35238bceSAndroid Build Coastguard Worker
1402*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Rendering test image and reloading binary" << TestLog::EndMessage;
1403*35238bceSAndroid Build Coastguard Worker
1404*35238bceSAndroid Build Coastguard Worker drawWithProgram(m_context.getRenderContext(), program.getProgram());
1405*35238bceSAndroid Build Coastguard Worker loadProgramBinary(binary, program.getProgram());
1406*35238bceSAndroid Build Coastguard Worker
1407*35238bceSAndroid Build Coastguard Worker verifyUniformsReset(program);
1408*35238bceSAndroid Build Coastguard Worker }
1409*35238bceSAndroid Build Coastguard Worker }
1410*35238bceSAndroid Build Coastguard Worker
1411*35238bceSAndroid Build Coastguard Worker private:
1412*35238bceSAndroid Build Coastguard Worker de::Random m_rnd;
1413*35238bceSAndroid Build Coastguard Worker };
1414*35238bceSAndroid Build Coastguard Worker
1415*35238bceSAndroid Build Coastguard Worker // Base class for program state persistence cases
1416*35238bceSAndroid Build Coastguard Worker
1417*35238bceSAndroid Build Coastguard Worker class ProgramBinaryPersistenceCase : public ProgramBinaryCase
1418*35238bceSAndroid Build Coastguard Worker {
1419*35238bceSAndroid Build Coastguard Worker public:
1420*35238bceSAndroid Build Coastguard Worker ProgramBinaryPersistenceCase(Context &context, const char *name, const char *desc, glu::ShaderType shaderType);
~ProgramBinaryPersistenceCase(void)1421*35238bceSAndroid Build Coastguard Worker virtual ~ProgramBinaryPersistenceCase(void)
1422*35238bceSAndroid Build Coastguard Worker {
1423*35238bceSAndroid Build Coastguard Worker }
1424*35238bceSAndroid Build Coastguard Worker
1425*35238bceSAndroid Build Coastguard Worker void buildProgram(glu::Program &program, ShaderAllocator &shaders);
1426*35238bceSAndroid Build Coastguard Worker
1427*35238bceSAndroid Build Coastguard Worker void test(void);
1428*35238bceSAndroid Build Coastguard Worker
1429*35238bceSAndroid Build Coastguard Worker virtual void executeForProgram(glu::Program &program, ShaderAllocator &shaders) = 0;
1430*35238bceSAndroid Build Coastguard Worker virtual void verify(glu::Program &program, const ProgramBinary &binary);
1431*35238bceSAndroid Build Coastguard Worker
1432*35238bceSAndroid Build Coastguard Worker protected:
1433*35238bceSAndroid Build Coastguard Worker de::Random m_rnd;
1434*35238bceSAndroid Build Coastguard Worker const glu::ShaderType m_shaderType;
1435*35238bceSAndroid Build Coastguard Worker };
1436*35238bceSAndroid Build Coastguard Worker
ProgramBinaryPersistenceCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)1437*35238bceSAndroid Build Coastguard Worker ProgramBinaryPersistenceCase::ProgramBinaryPersistenceCase(Context &context, const char *name, const char *desc,
1438*35238bceSAndroid Build Coastguard Worker glu::ShaderType shaderType)
1439*35238bceSAndroid Build Coastguard Worker : ProgramBinaryCase(context, name, desc)
1440*35238bceSAndroid Build Coastguard Worker , m_rnd(deStringHash(name) ^ 0x713de0ca)
1441*35238bceSAndroid Build Coastguard Worker , m_shaderType(shaderType)
1442*35238bceSAndroid Build Coastguard Worker {
1443*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_shaderType == glu::SHADERTYPE_VERTEX || m_shaderType == glu::SHADERTYPE_FRAGMENT);
1444*35238bceSAndroid Build Coastguard Worker }
1445*35238bceSAndroid Build Coastguard Worker
buildProgram(glu::Program & program,ShaderAllocator & shaders)1446*35238bceSAndroid Build Coastguard Worker void ProgramBinaryPersistenceCase::buildProgram(glu::Program &program, ShaderAllocator &shaders)
1447*35238bceSAndroid Build Coastguard Worker {
1448*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1449*35238bceSAndroid Build Coastguard Worker
1450*35238bceSAndroid Build Coastguard Worker glu::Shader &vertShader = shaders.createShader(glu::SHADERTYPE_VERTEX);
1451*35238bceSAndroid Build Coastguard Worker glu::Shader &fragShader = shaders.createShader(glu::SHADERTYPE_FRAGMENT);
1452*35238bceSAndroid Build Coastguard Worker
1453*35238bceSAndroid Build Coastguard Worker vertShader.compile();
1454*35238bceSAndroid Build Coastguard Worker fragShader.compile();
1455*35238bceSAndroid Build Coastguard Worker
1456*35238bceSAndroid Build Coastguard Worker program.attachShader(vertShader.getShader());
1457*35238bceSAndroid Build Coastguard Worker program.attachShader(fragShader.getShader());
1458*35238bceSAndroid Build Coastguard Worker program.link();
1459*35238bceSAndroid Build Coastguard Worker
1460*35238bceSAndroid Build Coastguard Worker logProgram(log, m_context.getRenderContext(), program, shaders);
1461*35238bceSAndroid Build Coastguard Worker }
1462*35238bceSAndroid Build Coastguard Worker
verify(glu::Program & program,const ProgramBinary & binary)1463*35238bceSAndroid Build Coastguard Worker void ProgramBinaryPersistenceCase::verify(glu::Program &program, const ProgramBinary &binary)
1464*35238bceSAndroid Build Coastguard Worker {
1465*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1466*35238bceSAndroid Build Coastguard Worker ProgramBinary currentBinary;
1467*35238bceSAndroid Build Coastguard Worker
1468*35238bceSAndroid Build Coastguard Worker getProgramBinary(currentBinary, program.getProgram());
1469*35238bceSAndroid Build Coastguard Worker
1470*35238bceSAndroid Build Coastguard Worker if (!programBinariesEqual(binary, currentBinary))
1471*35238bceSAndroid Build Coastguard Worker {
1472*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Fail, program binary may only change as a result of linking or loading."
1473*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1474*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Program binary changed");
1475*35238bceSAndroid Build Coastguard Worker }
1476*35238bceSAndroid Build Coastguard Worker }
1477*35238bceSAndroid Build Coastguard Worker
test(void)1478*35238bceSAndroid Build Coastguard Worker void ProgramBinaryPersistenceCase::test(void)
1479*35238bceSAndroid Build Coastguard Worker {
1480*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1481*35238bceSAndroid Build Coastguard Worker glu::RenderContext &renderCtx = m_context.getRenderContext();
1482*35238bceSAndroid Build Coastguard Worker
1483*35238bceSAndroid Build Coastguard Worker ConstantShaderGenerator sourceGen(m_rnd);
1484*35238bceSAndroid Build Coastguard Worker
1485*35238bceSAndroid Build Coastguard Worker ShaderAllocator shaders(renderCtx, sourceGen);
1486*35238bceSAndroid Build Coastguard Worker glu::Program program(renderCtx);
1487*35238bceSAndroid Build Coastguard Worker
1488*35238bceSAndroid Build Coastguard Worker buildProgram(program, shaders);
1489*35238bceSAndroid Build Coastguard Worker
1490*35238bceSAndroid Build Coastguard Worker if (program.getLinkStatus())
1491*35238bceSAndroid Build Coastguard Worker {
1492*35238bceSAndroid Build Coastguard Worker ProgramBinary binary;
1493*35238bceSAndroid Build Coastguard Worker getProgramBinary(binary, program.getProgram());
1494*35238bceSAndroid Build Coastguard Worker
1495*35238bceSAndroid Build Coastguard Worker executeForProgram(program, shaders);
1496*35238bceSAndroid Build Coastguard Worker
1497*35238bceSAndroid Build Coastguard Worker verify(program, binary);
1498*35238bceSAndroid Build Coastguard Worker
1499*35238bceSAndroid Build Coastguard Worker logProgram(log, renderCtx, program, shaders);
1500*35238bceSAndroid Build Coastguard Worker }
1501*35238bceSAndroid Build Coastguard Worker else
1502*35238bceSAndroid Build Coastguard Worker {
1503*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Fail, couldn't link program." << TestLog::EndMessage;
1504*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Linking failed");
1505*35238bceSAndroid Build Coastguard Worker }
1506*35238bceSAndroid Build Coastguard Worker }
1507*35238bceSAndroid Build Coastguard Worker
1508*35238bceSAndroid Build Coastguard Worker // Program state case utilities
1509*35238bceSAndroid Build Coastguard Worker
1510*35238bceSAndroid Build Coastguard Worker namespace
1511*35238bceSAndroid Build Coastguard Worker {
1512*35238bceSAndroid Build Coastguard Worker
1513*35238bceSAndroid Build Coastguard Worker template <class T>
addProgramBinaryPersistenceCase(TestCaseGroup * group,Context & context,const std::string & name,const std::string & desc)1514*35238bceSAndroid Build Coastguard Worker void addProgramBinaryPersistenceCase(TestCaseGroup *group, Context &context, const std::string &name,
1515*35238bceSAndroid Build Coastguard Worker const std::string &desc)
1516*35238bceSAndroid Build Coastguard Worker {
1517*35238bceSAndroid Build Coastguard Worker for (int shaderTypeInt = 0; shaderTypeInt < 2; shaderTypeInt++)
1518*35238bceSAndroid Build Coastguard Worker {
1519*35238bceSAndroid Build Coastguard Worker const glu::ShaderType shaderType = (shaderTypeInt == 1) ? glu::SHADERTYPE_FRAGMENT : glu::SHADERTYPE_VERTEX;
1520*35238bceSAndroid Build Coastguard Worker const std::string shaderTypeName = getShaderTypeName(shaderType);
1521*35238bceSAndroid Build Coastguard Worker
1522*35238bceSAndroid Build Coastguard Worker const std::string caseName = name + "_" + shaderTypeName;
1523*35238bceSAndroid Build Coastguard Worker const std::string caseDesc = "Build program, " + desc + ", for " + shaderTypeName + " shader.";
1524*35238bceSAndroid Build Coastguard Worker
1525*35238bceSAndroid Build Coastguard Worker group->addChild(new T(context, caseName.c_str(), caseDesc.c_str(), shaderType));
1526*35238bceSAndroid Build Coastguard Worker }
1527*35238bceSAndroid Build Coastguard Worker }
1528*35238bceSAndroid Build Coastguard Worker
1529*35238bceSAndroid Build Coastguard Worker } // namespace
1530*35238bceSAndroid Build Coastguard Worker
1531*35238bceSAndroid Build Coastguard Worker // Specialized program state cases
1532*35238bceSAndroid Build Coastguard Worker
1533*35238bceSAndroid Build Coastguard Worker class ProgramBinaryPersistenceDetachShaderCase : public ProgramBinaryPersistenceCase
1534*35238bceSAndroid Build Coastguard Worker {
1535*35238bceSAndroid Build Coastguard Worker public:
ProgramBinaryPersistenceDetachShaderCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)1536*35238bceSAndroid Build Coastguard Worker ProgramBinaryPersistenceDetachShaderCase(Context &context, const char *name, const char *desc,
1537*35238bceSAndroid Build Coastguard Worker glu::ShaderType shaderType)
1538*35238bceSAndroid Build Coastguard Worker : ProgramBinaryPersistenceCase(context, name, desc, shaderType)
1539*35238bceSAndroid Build Coastguard Worker {
1540*35238bceSAndroid Build Coastguard Worker }
1541*35238bceSAndroid Build Coastguard Worker
~ProgramBinaryPersistenceDetachShaderCase(void)1542*35238bceSAndroid Build Coastguard Worker virtual ~ProgramBinaryPersistenceDetachShaderCase(void)
1543*35238bceSAndroid Build Coastguard Worker {
1544*35238bceSAndroid Build Coastguard Worker }
1545*35238bceSAndroid Build Coastguard Worker
executeForProgram(glu::Program & program,ShaderAllocator & shaders)1546*35238bceSAndroid Build Coastguard Worker void executeForProgram(glu::Program &program, ShaderAllocator &shaders)
1547*35238bceSAndroid Build Coastguard Worker {
1548*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1549*35238bceSAndroid Build Coastguard Worker glu::Shader &caseShader = shaders.get(m_shaderType);
1550*35238bceSAndroid Build Coastguard Worker
1551*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Detaching " + std::string(getShaderTypeName(m_shaderType)) + " shader"
1552*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1553*35238bceSAndroid Build Coastguard Worker program.detachShader(caseShader.getShader());
1554*35238bceSAndroid Build Coastguard Worker }
1555*35238bceSAndroid Build Coastguard Worker };
1556*35238bceSAndroid Build Coastguard Worker
1557*35238bceSAndroid Build Coastguard Worker class ProgramBinaryPersistenceReattachShaderCase : public ProgramBinaryPersistenceCase
1558*35238bceSAndroid Build Coastguard Worker {
1559*35238bceSAndroid Build Coastguard Worker public:
ProgramBinaryPersistenceReattachShaderCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)1560*35238bceSAndroid Build Coastguard Worker ProgramBinaryPersistenceReattachShaderCase(Context &context, const char *name, const char *desc,
1561*35238bceSAndroid Build Coastguard Worker glu::ShaderType shaderType)
1562*35238bceSAndroid Build Coastguard Worker : ProgramBinaryPersistenceCase(context, name, desc, shaderType)
1563*35238bceSAndroid Build Coastguard Worker {
1564*35238bceSAndroid Build Coastguard Worker }
1565*35238bceSAndroid Build Coastguard Worker
~ProgramBinaryPersistenceReattachShaderCase(void)1566*35238bceSAndroid Build Coastguard Worker virtual ~ProgramBinaryPersistenceReattachShaderCase(void)
1567*35238bceSAndroid Build Coastguard Worker {
1568*35238bceSAndroid Build Coastguard Worker }
1569*35238bceSAndroid Build Coastguard Worker
executeForProgram(glu::Program & program,ShaderAllocator & shaders)1570*35238bceSAndroid Build Coastguard Worker void executeForProgram(glu::Program &program, ShaderAllocator &shaders)
1571*35238bceSAndroid Build Coastguard Worker {
1572*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1573*35238bceSAndroid Build Coastguard Worker glu::Shader &caseShader = shaders.get(m_shaderType);
1574*35238bceSAndroid Build Coastguard Worker
1575*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Reattaching " + std::string(getShaderTypeName(m_shaderType)) + " shader"
1576*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1577*35238bceSAndroid Build Coastguard Worker program.detachShader(caseShader.getShader());
1578*35238bceSAndroid Build Coastguard Worker program.attachShader(caseShader.getShader());
1579*35238bceSAndroid Build Coastguard Worker }
1580*35238bceSAndroid Build Coastguard Worker };
1581*35238bceSAndroid Build Coastguard Worker
1582*35238bceSAndroid Build Coastguard Worker class ProgramBinaryPersistenceDeleteShaderCase : public ProgramBinaryPersistenceCase
1583*35238bceSAndroid Build Coastguard Worker {
1584*35238bceSAndroid Build Coastguard Worker public:
ProgramBinaryPersistenceDeleteShaderCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)1585*35238bceSAndroid Build Coastguard Worker ProgramBinaryPersistenceDeleteShaderCase(Context &context, const char *name, const char *desc,
1586*35238bceSAndroid Build Coastguard Worker glu::ShaderType shaderType)
1587*35238bceSAndroid Build Coastguard Worker : ProgramBinaryPersistenceCase(context, name, desc, shaderType)
1588*35238bceSAndroid Build Coastguard Worker {
1589*35238bceSAndroid Build Coastguard Worker }
1590*35238bceSAndroid Build Coastguard Worker
~ProgramBinaryPersistenceDeleteShaderCase(void)1591*35238bceSAndroid Build Coastguard Worker virtual ~ProgramBinaryPersistenceDeleteShaderCase(void)
1592*35238bceSAndroid Build Coastguard Worker {
1593*35238bceSAndroid Build Coastguard Worker }
1594*35238bceSAndroid Build Coastguard Worker
executeForProgram(glu::Program & program,ShaderAllocator & shaders)1595*35238bceSAndroid Build Coastguard Worker void executeForProgram(glu::Program &program, ShaderAllocator &shaders)
1596*35238bceSAndroid Build Coastguard Worker {
1597*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1598*35238bceSAndroid Build Coastguard Worker glu::Shader &caseShader = shaders.get(m_shaderType);
1599*35238bceSAndroid Build Coastguard Worker
1600*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Deleting " + std::string(getShaderTypeName(m_shaderType)) + " shader"
1601*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1602*35238bceSAndroid Build Coastguard Worker program.detachShader(caseShader.getShader());
1603*35238bceSAndroid Build Coastguard Worker shaders.deleteShader(m_shaderType);
1604*35238bceSAndroid Build Coastguard Worker }
1605*35238bceSAndroid Build Coastguard Worker };
1606*35238bceSAndroid Build Coastguard Worker
1607*35238bceSAndroid Build Coastguard Worker class ProgramBinaryPersistenceReplaceShaderCase : public ProgramBinaryPersistenceCase
1608*35238bceSAndroid Build Coastguard Worker {
1609*35238bceSAndroid Build Coastguard Worker public:
ProgramBinaryPersistenceReplaceShaderCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)1610*35238bceSAndroid Build Coastguard Worker ProgramBinaryPersistenceReplaceShaderCase(Context &context, const char *name, const char *desc,
1611*35238bceSAndroid Build Coastguard Worker glu::ShaderType shaderType)
1612*35238bceSAndroid Build Coastguard Worker : ProgramBinaryPersistenceCase(context, name, desc, shaderType)
1613*35238bceSAndroid Build Coastguard Worker {
1614*35238bceSAndroid Build Coastguard Worker }
1615*35238bceSAndroid Build Coastguard Worker
~ProgramBinaryPersistenceReplaceShaderCase(void)1616*35238bceSAndroid Build Coastguard Worker virtual ~ProgramBinaryPersistenceReplaceShaderCase(void)
1617*35238bceSAndroid Build Coastguard Worker {
1618*35238bceSAndroid Build Coastguard Worker }
1619*35238bceSAndroid Build Coastguard Worker
executeForProgram(glu::Program & program,ShaderAllocator & shaders)1620*35238bceSAndroid Build Coastguard Worker void executeForProgram(glu::Program &program, ShaderAllocator &shaders)
1621*35238bceSAndroid Build Coastguard Worker {
1622*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1623*35238bceSAndroid Build Coastguard Worker glu::Shader &caseShader = shaders.get(m_shaderType);
1624*35238bceSAndroid Build Coastguard Worker
1625*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Deleting and replacing " + std::string(getShaderTypeName(m_shaderType)) + " shader"
1626*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1627*35238bceSAndroid Build Coastguard Worker program.detachShader(caseShader.getShader());
1628*35238bceSAndroid Build Coastguard Worker shaders.deleteShader(m_shaderType);
1629*35238bceSAndroid Build Coastguard Worker program.attachShader(shaders.createShader(m_shaderType).getShader());
1630*35238bceSAndroid Build Coastguard Worker }
1631*35238bceSAndroid Build Coastguard Worker };
1632*35238bceSAndroid Build Coastguard Worker
1633*35238bceSAndroid Build Coastguard Worker class ProgramBinaryPersistenceRecompileShaderCase : public ProgramBinaryPersistenceCase
1634*35238bceSAndroid Build Coastguard Worker {
1635*35238bceSAndroid Build Coastguard Worker public:
ProgramBinaryPersistenceRecompileShaderCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)1636*35238bceSAndroid Build Coastguard Worker ProgramBinaryPersistenceRecompileShaderCase(Context &context, const char *name, const char *desc,
1637*35238bceSAndroid Build Coastguard Worker glu::ShaderType shaderType)
1638*35238bceSAndroid Build Coastguard Worker : ProgramBinaryPersistenceCase(context, name, desc, shaderType)
1639*35238bceSAndroid Build Coastguard Worker {
1640*35238bceSAndroid Build Coastguard Worker }
1641*35238bceSAndroid Build Coastguard Worker
~ProgramBinaryPersistenceRecompileShaderCase(void)1642*35238bceSAndroid Build Coastguard Worker virtual ~ProgramBinaryPersistenceRecompileShaderCase(void)
1643*35238bceSAndroid Build Coastguard Worker {
1644*35238bceSAndroid Build Coastguard Worker }
1645*35238bceSAndroid Build Coastguard Worker
executeForProgram(glu::Program & program,ShaderAllocator & shaders)1646*35238bceSAndroid Build Coastguard Worker void executeForProgram(glu::Program &program, ShaderAllocator &shaders)
1647*35238bceSAndroid Build Coastguard Worker {
1648*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1649*35238bceSAndroid Build Coastguard Worker glu::Shader &caseShader = shaders.get(m_shaderType);
1650*35238bceSAndroid Build Coastguard Worker
1651*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Recompiling " + std::string(getShaderTypeName(m_shaderType)) + " shader"
1652*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1653*35238bceSAndroid Build Coastguard Worker caseShader.compile();
1654*35238bceSAndroid Build Coastguard Worker DE_UNREF(program);
1655*35238bceSAndroid Build Coastguard Worker }
1656*35238bceSAndroid Build Coastguard Worker };
1657*35238bceSAndroid Build Coastguard Worker
1658*35238bceSAndroid Build Coastguard Worker class ProgramBinaryPersistenceReplaceSourceCase : public ProgramBinaryPersistenceCase
1659*35238bceSAndroid Build Coastguard Worker {
1660*35238bceSAndroid Build Coastguard Worker public:
ProgramBinaryPersistenceReplaceSourceCase(Context & context,const char * name,const char * desc,glu::ShaderType shaderType)1661*35238bceSAndroid Build Coastguard Worker ProgramBinaryPersistenceReplaceSourceCase(Context &context, const char *name, const char *desc,
1662*35238bceSAndroid Build Coastguard Worker glu::ShaderType shaderType)
1663*35238bceSAndroid Build Coastguard Worker : ProgramBinaryPersistenceCase(context, name, desc, shaderType)
1664*35238bceSAndroid Build Coastguard Worker {
1665*35238bceSAndroid Build Coastguard Worker }
1666*35238bceSAndroid Build Coastguard Worker
~ProgramBinaryPersistenceReplaceSourceCase(void)1667*35238bceSAndroid Build Coastguard Worker virtual ~ProgramBinaryPersistenceReplaceSourceCase(void)
1668*35238bceSAndroid Build Coastguard Worker {
1669*35238bceSAndroid Build Coastguard Worker }
1670*35238bceSAndroid Build Coastguard Worker
executeForProgram(glu::Program & program,ShaderAllocator & shaders)1671*35238bceSAndroid Build Coastguard Worker void executeForProgram(glu::Program &program, ShaderAllocator &shaders)
1672*35238bceSAndroid Build Coastguard Worker {
1673*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
1674*35238bceSAndroid Build Coastguard Worker glu::Shader &caseShader = shaders.get(m_shaderType);
1675*35238bceSAndroid Build Coastguard Worker
1676*35238bceSAndroid Build Coastguard Worker log << TestLog::Message
1677*35238bceSAndroid Build Coastguard Worker << "Replacing " + std::string(getShaderTypeName(m_shaderType)) + " shader source and recompiling"
1678*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1679*35238bceSAndroid Build Coastguard Worker shaders.setSource(m_shaderType);
1680*35238bceSAndroid Build Coastguard Worker caseShader.compile();
1681*35238bceSAndroid Build Coastguard Worker DE_UNREF(program);
1682*35238bceSAndroid Build Coastguard Worker }
1683*35238bceSAndroid Build Coastguard Worker };
1684*35238bceSAndroid Build Coastguard Worker
1685*35238bceSAndroid Build Coastguard Worker // Test group
1686*35238bceSAndroid Build Coastguard Worker
ShaderApiTests(Context & context)1687*35238bceSAndroid Build Coastguard Worker ShaderApiTests::ShaderApiTests(Context &context) : TestCaseGroup(context, "shader_api", "Shader API Cases")
1688*35238bceSAndroid Build Coastguard Worker {
1689*35238bceSAndroid Build Coastguard Worker }
1690*35238bceSAndroid Build Coastguard Worker
~ShaderApiTests(void)1691*35238bceSAndroid Build Coastguard Worker ShaderApiTests::~ShaderApiTests(void)
1692*35238bceSAndroid Build Coastguard Worker {
1693*35238bceSAndroid Build Coastguard Worker }
1694*35238bceSAndroid Build Coastguard Worker
init(void)1695*35238bceSAndroid Build Coastguard Worker void ShaderApiTests::init(void)
1696*35238bceSAndroid Build Coastguard Worker {
1697*35238bceSAndroid Build Coastguard Worker // create and delete shaders
1698*35238bceSAndroid Build Coastguard Worker {
1699*35238bceSAndroid Build Coastguard Worker TestCaseGroup *createDeleteGroup = new TestCaseGroup(m_context, "create_delete", "glCreateShader() tests");
1700*35238bceSAndroid Build Coastguard Worker addChild(createDeleteGroup);
1701*35238bceSAndroid Build Coastguard Worker
1702*35238bceSAndroid Build Coastguard Worker createDeleteGroup->addChild(new CreateShaderCase(m_context, "create_vertex_shader",
1703*35238bceSAndroid Build Coastguard Worker "Create vertex shader object", glu::SHADERTYPE_VERTEX));
1704*35238bceSAndroid Build Coastguard Worker createDeleteGroup->addChild(new CreateShaderCase(m_context, "create_fragment_shader",
1705*35238bceSAndroid Build Coastguard Worker "Create fragment shader object", glu::SHADERTYPE_FRAGMENT));
1706*35238bceSAndroid Build Coastguard Worker
1707*35238bceSAndroid Build Coastguard Worker createDeleteGroup->addChild(
1708*35238bceSAndroid Build Coastguard Worker new DeleteShaderCase(m_context, "delete_vertex_fragment", "Delete vertex shader and fragment shader"));
1709*35238bceSAndroid Build Coastguard Worker }
1710*35238bceSAndroid Build Coastguard Worker
1711*35238bceSAndroid Build Coastguard Worker // compile and link
1712*35238bceSAndroid Build Coastguard Worker {
1713*35238bceSAndroid Build Coastguard Worker TestCaseGroup *compileLinkGroup = new TestCaseGroup(m_context, "compile_link", "Compile and link tests");
1714*35238bceSAndroid Build Coastguard Worker addChild(compileLinkGroup);
1715*35238bceSAndroid Build Coastguard Worker
1716*35238bceSAndroid Build Coastguard Worker compileLinkGroup->addChild(
1717*35238bceSAndroid Build Coastguard Worker new CompileShaderCase(m_context, "compile_vertex_shader", "Compile vertex shader", glu::SHADERTYPE_VERTEX));
1718*35238bceSAndroid Build Coastguard Worker compileLinkGroup->addChild(new CompileShaderCase(m_context, "compile_fragment_shader",
1719*35238bceSAndroid Build Coastguard Worker "Compile fragment shader", glu::SHADERTYPE_FRAGMENT));
1720*35238bceSAndroid Build Coastguard Worker
1721*35238bceSAndroid Build Coastguard Worker compileLinkGroup->addChild(
1722*35238bceSAndroid Build Coastguard Worker new LinkVertexFragmentCase(m_context, "link_vertex_fragment", "Link vertex and fragment shaders"));
1723*35238bceSAndroid Build Coastguard Worker }
1724*35238bceSAndroid Build Coastguard Worker
1725*35238bceSAndroid Build Coastguard Worker // shader source
1726*35238bceSAndroid Build Coastguard Worker {
1727*35238bceSAndroid Build Coastguard Worker TestCaseGroup *shaderSourceGroup = new TestCaseGroup(m_context, "shader_source", "glShaderSource() tests");
1728*35238bceSAndroid Build Coastguard Worker addChild(shaderSourceGroup);
1729*35238bceSAndroid Build Coastguard Worker
1730*35238bceSAndroid Build Coastguard Worker for (int shaderTypeInt = 0; shaderTypeInt < 2; shaderTypeInt++)
1731*35238bceSAndroid Build Coastguard Worker {
1732*35238bceSAndroid Build Coastguard Worker const glu::ShaderType shaderType = (shaderTypeInt == 1) ? glu::SHADERTYPE_FRAGMENT : glu::SHADERTYPE_VERTEX;
1733*35238bceSAndroid Build Coastguard Worker const std::string shaderTypeName = getShaderTypeName(shaderType);
1734*35238bceSAndroid Build Coastguard Worker
1735*35238bceSAndroid Build Coastguard Worker const std::string caseName = std::string("replace_source_") + shaderTypeName;
1736*35238bceSAndroid Build Coastguard Worker const std::string caseDesc = std::string("Replace source code of ") + shaderTypeName + " shader.";
1737*35238bceSAndroid Build Coastguard Worker
1738*35238bceSAndroid Build Coastguard Worker shaderSourceGroup->addChild(
1739*35238bceSAndroid Build Coastguard Worker new ShaderSourceReplaceCase(m_context, caseName.c_str(), caseDesc.c_str(), shaderType));
1740*35238bceSAndroid Build Coastguard Worker }
1741*35238bceSAndroid Build Coastguard Worker
1742*35238bceSAndroid Build Coastguard Worker for (int stringLengthsInt = 0; stringLengthsInt < 3; stringLengthsInt++)
1743*35238bceSAndroid Build Coastguard Worker for (int caseNdx = 1; caseNdx <= 3; caseNdx++)
1744*35238bceSAndroid Build Coastguard Worker for (int shaderTypeInt = 0; shaderTypeInt < 2; shaderTypeInt++)
1745*35238bceSAndroid Build Coastguard Worker {
1746*35238bceSAndroid Build Coastguard Worker const int numSlices = 1 << caseNdx;
1747*35238bceSAndroid Build Coastguard Worker const glu::ShaderType shaderType =
1748*35238bceSAndroid Build Coastguard Worker (shaderTypeInt == 1) ? glu::SHADERTYPE_FRAGMENT : glu::SHADERTYPE_VERTEX;
1749*35238bceSAndroid Build Coastguard Worker
1750*35238bceSAndroid Build Coastguard Worker const bool explicitLengths = (stringLengthsInt != 0);
1751*35238bceSAndroid Build Coastguard Worker const bool randomNullTerm = (stringLengthsInt == 2);
1752*35238bceSAndroid Build Coastguard Worker
1753*35238bceSAndroid Build Coastguard Worker const uint32_t flags = (explicitLengths ? CASE_EXPLICIT_SOURCE_LENGTHS : 0) |
1754*35238bceSAndroid Build Coastguard Worker (randomNullTerm ? CASE_RANDOM_NULL_TERMINATED : 0);
1755*35238bceSAndroid Build Coastguard Worker
1756*35238bceSAndroid Build Coastguard Worker const std::string caseName =
1757*35238bceSAndroid Build Coastguard Worker "split_source_" + de::toString(numSlices) +
1758*35238bceSAndroid Build Coastguard Worker (randomNullTerm ? "_random_negative_length" :
1759*35238bceSAndroid Build Coastguard Worker (explicitLengths ? "_specify_lengths" : "_null_terminated")) +
1760*35238bceSAndroid Build Coastguard Worker ((shaderType == glu::SHADERTYPE_FRAGMENT) ? "_fragment" : "_vertex");
1761*35238bceSAndroid Build Coastguard Worker
1762*35238bceSAndroid Build Coastguard Worker const std::string caseDesc =
1763*35238bceSAndroid Build Coastguard Worker std::string((shaderType == glu::SHADERTYPE_FRAGMENT) ? "Fragment" : "Vertex") +
1764*35238bceSAndroid Build Coastguard Worker " shader source split into " + de::toString(numSlices) + " pieces" +
1765*35238bceSAndroid Build Coastguard Worker (explicitLengths ? ", using explicitly specified string lengths" : "") +
1766*35238bceSAndroid Build Coastguard Worker (randomNullTerm ? " with random negative length values" : "");
1767*35238bceSAndroid Build Coastguard Worker
1768*35238bceSAndroid Build Coastguard Worker shaderSourceGroup->addChild(new ShaderSourceSplitCase(m_context, caseName.c_str(), caseDesc.c_str(),
1769*35238bceSAndroid Build Coastguard Worker shaderType, numSlices, flags));
1770*35238bceSAndroid Build Coastguard Worker }
1771*35238bceSAndroid Build Coastguard Worker }
1772*35238bceSAndroid Build Coastguard Worker
1773*35238bceSAndroid Build Coastguard Worker // link status and infolog
1774*35238bceSAndroid Build Coastguard Worker {
1775*35238bceSAndroid Build Coastguard Worker TestCaseGroup *linkStatusGroup =
1776*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, "program_state", "Program state persistence tests");
1777*35238bceSAndroid Build Coastguard Worker addChild(linkStatusGroup);
1778*35238bceSAndroid Build Coastguard Worker
1779*35238bceSAndroid Build Coastguard Worker addProgramStateCase<ProgramStateDetachShaderCase>(linkStatusGroup, m_context, "detach_shader", "detach shader");
1780*35238bceSAndroid Build Coastguard Worker addProgramStateCase<ProgramStateReattachShaderCase>(linkStatusGroup, m_context, "reattach_shader",
1781*35238bceSAndroid Build Coastguard Worker "reattach shader");
1782*35238bceSAndroid Build Coastguard Worker addProgramStateCase<ProgramStateDeleteShaderCase>(linkStatusGroup, m_context, "delete_shader", "delete shader");
1783*35238bceSAndroid Build Coastguard Worker addProgramStateCase<ProgramStateReplaceShaderCase>(linkStatusGroup, m_context, "replace_shader",
1784*35238bceSAndroid Build Coastguard Worker "replace shader object");
1785*35238bceSAndroid Build Coastguard Worker addProgramStateCase<ProgramStateRecompileShaderCase>(linkStatusGroup, m_context, "recompile_shader",
1786*35238bceSAndroid Build Coastguard Worker "recompile shader");
1787*35238bceSAndroid Build Coastguard Worker addProgramStateCase<ProgramStateReplaceSourceCase>(linkStatusGroup, m_context, "replace_source",
1788*35238bceSAndroid Build Coastguard Worker "replace shader source");
1789*35238bceSAndroid Build Coastguard Worker }
1790*35238bceSAndroid Build Coastguard Worker
1791*35238bceSAndroid Build Coastguard Worker // program binary
1792*35238bceSAndroid Build Coastguard Worker {
1793*35238bceSAndroid Build Coastguard Worker TestCaseGroup *programBinaryGroup = new TestCaseGroup(m_context, "program_binary", "Program binary API tests");
1794*35238bceSAndroid Build Coastguard Worker addChild(programBinaryGroup);
1795*35238bceSAndroid Build Coastguard Worker
1796*35238bceSAndroid Build Coastguard Worker {
1797*35238bceSAndroid Build Coastguard Worker TestCaseGroup *simpleCaseGroup = new TestCaseGroup(m_context, "simple", "Simple API tests");
1798*35238bceSAndroid Build Coastguard Worker programBinaryGroup->addChild(simpleCaseGroup);
1799*35238bceSAndroid Build Coastguard Worker
1800*35238bceSAndroid Build Coastguard Worker simpleCaseGroup->addChild(new ProgramBinarySimpleCase(m_context, "get_program_binary_vertex_fragment",
1801*35238bceSAndroid Build Coastguard Worker "Get vertex and fragment shader program binary"));
1802*35238bceSAndroid Build Coastguard Worker simpleCaseGroup->addChild(
1803*35238bceSAndroid Build Coastguard Worker new ProgramBinaryUniformResetCase(m_context, "uniform_reset_on_binary_load",
1804*35238bceSAndroid Build Coastguard Worker "Verify uniform reset on successful load of program binary"));
1805*35238bceSAndroid Build Coastguard Worker }
1806*35238bceSAndroid Build Coastguard Worker
1807*35238bceSAndroid Build Coastguard Worker {
1808*35238bceSAndroid Build Coastguard Worker TestCaseGroup *binaryPersistenceGroup =
1809*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, "binary_persistence", "Program binary persistence tests");
1810*35238bceSAndroid Build Coastguard Worker programBinaryGroup->addChild(binaryPersistenceGroup);
1811*35238bceSAndroid Build Coastguard Worker
1812*35238bceSAndroid Build Coastguard Worker addProgramBinaryPersistenceCase<ProgramBinaryPersistenceDetachShaderCase>(binaryPersistenceGroup, m_context,
1813*35238bceSAndroid Build Coastguard Worker "detach_shader", "detach shader");
1814*35238bceSAndroid Build Coastguard Worker addProgramBinaryPersistenceCase<ProgramBinaryPersistenceReattachShaderCase>(
1815*35238bceSAndroid Build Coastguard Worker binaryPersistenceGroup, m_context, "reattach_shader", "reattach shader");
1816*35238bceSAndroid Build Coastguard Worker addProgramBinaryPersistenceCase<ProgramBinaryPersistenceDeleteShaderCase>(binaryPersistenceGroup, m_context,
1817*35238bceSAndroid Build Coastguard Worker "delete_shader", "delete shader");
1818*35238bceSAndroid Build Coastguard Worker addProgramBinaryPersistenceCase<ProgramBinaryPersistenceReplaceShaderCase>(
1819*35238bceSAndroid Build Coastguard Worker binaryPersistenceGroup, m_context, "replace_shader", "replace shader object");
1820*35238bceSAndroid Build Coastguard Worker addProgramBinaryPersistenceCase<ProgramBinaryPersistenceRecompileShaderCase>(
1821*35238bceSAndroid Build Coastguard Worker binaryPersistenceGroup, m_context, "recompile_shader", "recompile shader");
1822*35238bceSAndroid Build Coastguard Worker addProgramBinaryPersistenceCase<ProgramBinaryPersistenceReplaceSourceCase>(
1823*35238bceSAndroid Build Coastguard Worker binaryPersistenceGroup, m_context, "replace_source", "replace shader source");
1824*35238bceSAndroid Build Coastguard Worker }
1825*35238bceSAndroid Build Coastguard Worker }
1826*35238bceSAndroid Build Coastguard Worker }
1827*35238bceSAndroid Build Coastguard Worker
1828*35238bceSAndroid Build Coastguard Worker } // namespace Functional
1829*35238bceSAndroid Build Coastguard Worker } // namespace gles3
1830*35238bceSAndroid Build Coastguard Worker } // namespace deqp
1831