1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.1 Module
3*35238bceSAndroid Build Coastguard Worker * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2015 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 Program Pipeline State Query tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es31fProgramPipelineStateQueryTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "es31fInfoLogQueryShared.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "glsStateQueryUtil.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluCallLogWrapper.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "gluObjectWrapper.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
33*35238bceSAndroid Build Coastguard Worker
34*35238bceSAndroid Build Coastguard Worker namespace deqp
35*35238bceSAndroid Build Coastguard Worker {
36*35238bceSAndroid Build Coastguard Worker namespace gles31
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker namespace Functional
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker namespace
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker
43*35238bceSAndroid Build Coastguard Worker using namespace gls::StateQueryUtil;
44*35238bceSAndroid Build Coastguard Worker
getVerifierSuffix(QueryType type)45*35238bceSAndroid Build Coastguard Worker static const char *getVerifierSuffix(QueryType type)
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker switch (type)
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker case QUERY_PIPELINE_INTEGER:
50*35238bceSAndroid Build Coastguard Worker return "get_program_pipelineiv";
51*35238bceSAndroid Build Coastguard Worker default:
52*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
53*35238bceSAndroid Build Coastguard Worker return DE_NULL;
54*35238bceSAndroid Build Coastguard Worker }
55*35238bceSAndroid Build Coastguard Worker }
56*35238bceSAndroid Build Coastguard Worker
57*35238bceSAndroid Build Coastguard Worker static const char *const s_vertexSource =
58*35238bceSAndroid Build Coastguard Worker "#version 310 es\n"
59*35238bceSAndroid Build Coastguard Worker "out highp vec4 v_color;\n"
60*35238bceSAndroid Build Coastguard Worker "void main()\n"
61*35238bceSAndroid Build Coastguard Worker "{\n"
62*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(float(gl_VertexID) * 0.5, float(gl_VertexID+1) * 0.5, 0.0, 1.0);\n"
63*35238bceSAndroid Build Coastguard Worker " v_color = vec4(float(gl_VertexID), 1.0, 0.0, 1.0);\n"
64*35238bceSAndroid Build Coastguard Worker "}\n";
65*35238bceSAndroid Build Coastguard Worker static const char *const s_fragmentSource = "#version 310 es\n"
66*35238bceSAndroid Build Coastguard Worker "in highp vec4 v_color;\n"
67*35238bceSAndroid Build Coastguard Worker "layout(location=0) out highp vec4 o_color;\n"
68*35238bceSAndroid Build Coastguard Worker "void main()\n"
69*35238bceSAndroid Build Coastguard Worker "{\n"
70*35238bceSAndroid Build Coastguard Worker " o_color = v_color;\n"
71*35238bceSAndroid Build Coastguard Worker "}\n";
72*35238bceSAndroid Build Coastguard Worker static const char *const s_computeSource = "#version 310 es\n"
73*35238bceSAndroid Build Coastguard Worker "layout (local_size_x = 1, local_size_y = 1) in;\n"
74*35238bceSAndroid Build Coastguard Worker "layout(binding = 0) buffer Output\n"
75*35238bceSAndroid Build Coastguard Worker "{\n"
76*35238bceSAndroid Build Coastguard Worker " highp float val;\n"
77*35238bceSAndroid Build Coastguard Worker "} sb_out;\n"
78*35238bceSAndroid Build Coastguard Worker "\n"
79*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
80*35238bceSAndroid Build Coastguard Worker "{\n"
81*35238bceSAndroid Build Coastguard Worker " sb_out.val = 1.0;\n"
82*35238bceSAndroid Build Coastguard Worker "}\n";
83*35238bceSAndroid Build Coastguard Worker
84*35238bceSAndroid Build Coastguard Worker class ActiveProgramCase : public TestCase
85*35238bceSAndroid Build Coastguard Worker {
86*35238bceSAndroid Build Coastguard Worker public:
87*35238bceSAndroid Build Coastguard Worker ActiveProgramCase(Context &context, QueryType verifier, const char *name, const char *desc);
88*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
89*35238bceSAndroid Build Coastguard Worker
90*35238bceSAndroid Build Coastguard Worker private:
91*35238bceSAndroid Build Coastguard Worker const QueryType m_verifier;
92*35238bceSAndroid Build Coastguard Worker };
93*35238bceSAndroid Build Coastguard Worker
ActiveProgramCase(Context & context,QueryType verifier,const char * name,const char * desc)94*35238bceSAndroid Build Coastguard Worker ActiveProgramCase::ActiveProgramCase(Context &context, QueryType verifier, const char *name, const char *desc)
95*35238bceSAndroid Build Coastguard Worker : TestCase(context, name, desc)
96*35238bceSAndroid Build Coastguard Worker , m_verifier(verifier)
97*35238bceSAndroid Build Coastguard Worker {
98*35238bceSAndroid Build Coastguard Worker }
99*35238bceSAndroid Build Coastguard Worker
iterate(void)100*35238bceSAndroid Build Coastguard Worker ActiveProgramCase::IterateResult ActiveProgramCase::iterate(void)
101*35238bceSAndroid Build Coastguard Worker {
102*35238bceSAndroid Build Coastguard Worker const glu::ShaderProgram vtxProgram(m_context.getRenderContext(), glu::ProgramSources()
103*35238bceSAndroid Build Coastguard Worker << glu::ProgramSeparable(true)
104*35238bceSAndroid Build Coastguard Worker << glu::VertexSource(s_vertexSource));
105*35238bceSAndroid Build Coastguard Worker const glu::ShaderProgram frgProgram(m_context.getRenderContext(), glu::ProgramSources()
106*35238bceSAndroid Build Coastguard Worker << glu::ProgramSeparable(true)
107*35238bceSAndroid Build Coastguard Worker << glu::FragmentSource(s_fragmentSource));
108*35238bceSAndroid Build Coastguard Worker const glu::ProgramPipeline pipeline(m_context.getRenderContext());
109*35238bceSAndroid Build Coastguard Worker glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
110*35238bceSAndroid Build Coastguard Worker tcu::ResultCollector result(m_testCtx.getLog(), " // ERROR: ");
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Worker {
113*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "VtxProg", "Vertex program");
114*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << vtxProgram;
115*35238bceSAndroid Build Coastguard Worker }
116*35238bceSAndroid Build Coastguard Worker
117*35238bceSAndroid Build Coastguard Worker {
118*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "FrgProg", "Fragment program");
119*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << frgProgram;
120*35238bceSAndroid Build Coastguard Worker }
121*35238bceSAndroid Build Coastguard Worker
122*35238bceSAndroid Build Coastguard Worker if (!vtxProgram.isOk() || !frgProgram.isOk())
123*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("failed to build program");
124*35238bceSAndroid Build Coastguard Worker
125*35238bceSAndroid Build Coastguard Worker gl.enableLogging(true);
126*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
127*35238bceSAndroid Build Coastguard Worker
128*35238bceSAndroid Build Coastguard Worker gl.glBindProgramPipeline(pipeline.getPipeline());
129*35238bceSAndroid Build Coastguard Worker gl.glUseProgramStages(pipeline.getPipeline(), GL_VERTEX_SHADER_BIT, vtxProgram.getProgram());
130*35238bceSAndroid Build Coastguard Worker gl.glUseProgramStages(pipeline.getPipeline(), GL_FRAGMENT_SHADER_BIT, frgProgram.getProgram());
131*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen pipeline");
132*35238bceSAndroid Build Coastguard Worker gl.glBindProgramPipeline(0);
133*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "unbind pipeline");
134*35238bceSAndroid Build Coastguard Worker
135*35238bceSAndroid Build Coastguard Worker {
136*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
137*35238bceSAndroid Build Coastguard Worker verifyStatePipelineInteger(result, gl, pipeline.getPipeline(), GL_ACTIVE_PROGRAM, 0, m_verifier);
138*35238bceSAndroid Build Coastguard Worker }
139*35238bceSAndroid Build Coastguard Worker
140*35238bceSAndroid Build Coastguard Worker {
141*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "Set", "Set");
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Worker gl.glActiveShaderProgram(pipeline.getPipeline(), frgProgram.getProgram());
144*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen pipeline");
145*35238bceSAndroid Build Coastguard Worker verifyStatePipelineInteger(result, gl, pipeline.getPipeline(), GL_ACTIVE_PROGRAM, (int)frgProgram.getProgram(),
146*35238bceSAndroid Build Coastguard Worker m_verifier);
147*35238bceSAndroid Build Coastguard Worker }
148*35238bceSAndroid Build Coastguard Worker
149*35238bceSAndroid Build Coastguard Worker result.setTestContextResult(m_testCtx);
150*35238bceSAndroid Build Coastguard Worker return STOP;
151*35238bceSAndroid Build Coastguard Worker }
152*35238bceSAndroid Build Coastguard Worker
153*35238bceSAndroid Build Coastguard Worker class PipelineProgramCase : public TestCase
154*35238bceSAndroid Build Coastguard Worker {
155*35238bceSAndroid Build Coastguard Worker public:
156*35238bceSAndroid Build Coastguard Worker PipelineProgramCase(Context &context, QueryType verifier, const char *name, const char *desc, glw::GLenum stage);
157*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
158*35238bceSAndroid Build Coastguard Worker
159*35238bceSAndroid Build Coastguard Worker private:
160*35238bceSAndroid Build Coastguard Worker const QueryType m_verifier;
161*35238bceSAndroid Build Coastguard Worker const glw::GLenum m_targetStage;
162*35238bceSAndroid Build Coastguard Worker };
163*35238bceSAndroid Build Coastguard Worker
PipelineProgramCase(Context & context,QueryType verifier,const char * name,const char * desc,glw::GLenum stage)164*35238bceSAndroid Build Coastguard Worker PipelineProgramCase::PipelineProgramCase(Context &context, QueryType verifier, const char *name, const char *desc,
165*35238bceSAndroid Build Coastguard Worker glw::GLenum stage)
166*35238bceSAndroid Build Coastguard Worker : TestCase(context, name, desc)
167*35238bceSAndroid Build Coastguard Worker , m_verifier(verifier)
168*35238bceSAndroid Build Coastguard Worker , m_targetStage(stage)
169*35238bceSAndroid Build Coastguard Worker {
170*35238bceSAndroid Build Coastguard Worker }
171*35238bceSAndroid Build Coastguard Worker
iterate(void)172*35238bceSAndroid Build Coastguard Worker PipelineProgramCase::IterateResult PipelineProgramCase::iterate(void)
173*35238bceSAndroid Build Coastguard Worker {
174*35238bceSAndroid Build Coastguard Worker glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
175*35238bceSAndroid Build Coastguard Worker tcu::ResultCollector result(m_testCtx.getLog(), " // ERROR: ");
176*35238bceSAndroid Build Coastguard Worker const int stageBit = (m_targetStage == GL_VERTEX_SHADER) ? (GL_VERTEX_SHADER_BIT) :
177*35238bceSAndroid Build Coastguard Worker (m_targetStage == GL_FRAGMENT_SHADER) ? (GL_FRAGMENT_SHADER_BIT) :
178*35238bceSAndroid Build Coastguard Worker (GL_COMPUTE_SHADER_BIT);
179*35238bceSAndroid Build Coastguard Worker glu::ProgramSources sources;
180*35238bceSAndroid Build Coastguard Worker
181*35238bceSAndroid Build Coastguard Worker if (m_targetStage == GL_VERTEX_SHADER)
182*35238bceSAndroid Build Coastguard Worker sources << glu::ProgramSeparable(true) << glu::VertexSource(s_vertexSource);
183*35238bceSAndroid Build Coastguard Worker else if (m_targetStage == GL_FRAGMENT_SHADER)
184*35238bceSAndroid Build Coastguard Worker sources << glu::ProgramSeparable(true) << glu::FragmentSource(s_fragmentSource);
185*35238bceSAndroid Build Coastguard Worker else if (m_targetStage == GL_COMPUTE_SHADER)
186*35238bceSAndroid Build Coastguard Worker sources << glu::ProgramSeparable(true) << glu::ComputeSource(s_computeSource);
187*35238bceSAndroid Build Coastguard Worker else
188*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
189*35238bceSAndroid Build Coastguard Worker
190*35238bceSAndroid Build Coastguard Worker gl.enableLogging(true);
191*35238bceSAndroid Build Coastguard Worker
192*35238bceSAndroid Build Coastguard Worker {
193*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(m_context.getRenderContext(), sources);
194*35238bceSAndroid Build Coastguard Worker
195*35238bceSAndroid Build Coastguard Worker {
196*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "program", "Program");
197*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << program;
198*35238bceSAndroid Build Coastguard Worker }
199*35238bceSAndroid Build Coastguard Worker
200*35238bceSAndroid Build Coastguard Worker if (!program.isOk())
201*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("failed to build program");
202*35238bceSAndroid Build Coastguard Worker
203*35238bceSAndroid Build Coastguard Worker {
204*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
205*35238bceSAndroid Build Coastguard Worker glu::ProgramPipeline pipeline(m_context.getRenderContext());
206*35238bceSAndroid Build Coastguard Worker
207*35238bceSAndroid Build Coastguard Worker gl.glBindProgramPipeline(pipeline.getPipeline());
208*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "setup pipeline");
209*35238bceSAndroid Build Coastguard Worker
210*35238bceSAndroid Build Coastguard Worker verifyStatePipelineInteger(result, gl, pipeline.getPipeline(), m_targetStage, 0, m_verifier);
211*35238bceSAndroid Build Coastguard Worker }
212*35238bceSAndroid Build Coastguard Worker
213*35238bceSAndroid Build Coastguard Worker {
214*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "Set", "Set");
215*35238bceSAndroid Build Coastguard Worker glu::ProgramPipeline pipeline(m_context.getRenderContext());
216*35238bceSAndroid Build Coastguard Worker
217*35238bceSAndroid Build Coastguard Worker gl.glBindProgramPipeline(pipeline.getPipeline());
218*35238bceSAndroid Build Coastguard Worker gl.glUseProgramStages(pipeline.getPipeline(), stageBit, program.getProgram());
219*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "setup pipeline");
220*35238bceSAndroid Build Coastguard Worker
221*35238bceSAndroid Build Coastguard Worker verifyStatePipelineInteger(result, gl, pipeline.getPipeline(), m_targetStage, program.getProgram(),
222*35238bceSAndroid Build Coastguard Worker m_verifier);
223*35238bceSAndroid Build Coastguard Worker }
224*35238bceSAndroid Build Coastguard Worker }
225*35238bceSAndroid Build Coastguard Worker
226*35238bceSAndroid Build Coastguard Worker result.setTestContextResult(m_testCtx);
227*35238bceSAndroid Build Coastguard Worker return STOP;
228*35238bceSAndroid Build Coastguard Worker }
229*35238bceSAndroid Build Coastguard Worker
230*35238bceSAndroid Build Coastguard Worker class ValidateStatusCase : public TestCase
231*35238bceSAndroid Build Coastguard Worker {
232*35238bceSAndroid Build Coastguard Worker public:
233*35238bceSAndroid Build Coastguard Worker ValidateStatusCase(Context &context, QueryType verifier, const char *name, const char *desc);
234*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
235*35238bceSAndroid Build Coastguard Worker
236*35238bceSAndroid Build Coastguard Worker private:
237*35238bceSAndroid Build Coastguard Worker const QueryType m_verifier;
238*35238bceSAndroid Build Coastguard Worker };
239*35238bceSAndroid Build Coastguard Worker
ValidateStatusCase(Context & context,QueryType verifier,const char * name,const char * desc)240*35238bceSAndroid Build Coastguard Worker ValidateStatusCase::ValidateStatusCase(Context &context, QueryType verifier, const char *name, const char *desc)
241*35238bceSAndroid Build Coastguard Worker : TestCase(context, name, desc)
242*35238bceSAndroid Build Coastguard Worker , m_verifier(verifier)
243*35238bceSAndroid Build Coastguard Worker {
244*35238bceSAndroid Build Coastguard Worker }
245*35238bceSAndroid Build Coastguard Worker
iterate(void)246*35238bceSAndroid Build Coastguard Worker ValidateStatusCase::IterateResult ValidateStatusCase::iterate(void)
247*35238bceSAndroid Build Coastguard Worker {
248*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram vtxProgram(m_context.getRenderContext(), glu::ProgramSources()
249*35238bceSAndroid Build Coastguard Worker << glu::ProgramSeparable(true)
250*35238bceSAndroid Build Coastguard Worker << glu::VertexSource(s_vertexSource));
251*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram frgProgram(m_context.getRenderContext(), glu::ProgramSources()
252*35238bceSAndroid Build Coastguard Worker << glu::ProgramSeparable(true)
253*35238bceSAndroid Build Coastguard Worker << glu::FragmentSource(s_fragmentSource));
254*35238bceSAndroid Build Coastguard Worker glu::ProgramPipeline pipeline(m_context.getRenderContext());
255*35238bceSAndroid Build Coastguard Worker glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
256*35238bceSAndroid Build Coastguard Worker tcu::ResultCollector result(m_testCtx.getLog(), " // ERROR: ");
257*35238bceSAndroid Build Coastguard Worker
258*35238bceSAndroid Build Coastguard Worker {
259*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "VtxProg", "Vertex program");
260*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << vtxProgram;
261*35238bceSAndroid Build Coastguard Worker }
262*35238bceSAndroid Build Coastguard Worker
263*35238bceSAndroid Build Coastguard Worker {
264*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "FrgProg", "Fragment program");
265*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << frgProgram;
266*35238bceSAndroid Build Coastguard Worker }
267*35238bceSAndroid Build Coastguard Worker
268*35238bceSAndroid Build Coastguard Worker if (!vtxProgram.isOk() || !frgProgram.isOk())
269*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("failed to build program");
270*35238bceSAndroid Build Coastguard Worker
271*35238bceSAndroid Build Coastguard Worker gl.enableLogging(true);
272*35238bceSAndroid Build Coastguard Worker
273*35238bceSAndroid Build Coastguard Worker gl.glBindProgramPipeline(pipeline.getPipeline());
274*35238bceSAndroid Build Coastguard Worker gl.glUseProgramStages(pipeline.getPipeline(), GL_VERTEX_SHADER_BIT, vtxProgram.getProgram());
275*35238bceSAndroid Build Coastguard Worker gl.glUseProgramStages(pipeline.getPipeline(), GL_FRAGMENT_SHADER_BIT, frgProgram.getProgram());
276*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen pipeline");
277*35238bceSAndroid Build Coastguard Worker gl.glBindProgramPipeline(0);
278*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "unbind pipeline");
279*35238bceSAndroid Build Coastguard Worker
280*35238bceSAndroid Build Coastguard Worker {
281*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
282*35238bceSAndroid Build Coastguard Worker verifyStatePipelineInteger(result, gl, pipeline.getPipeline(), GL_VALIDATE_STATUS, 0, m_verifier);
283*35238bceSAndroid Build Coastguard Worker }
284*35238bceSAndroid Build Coastguard Worker
285*35238bceSAndroid Build Coastguard Worker {
286*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "Set", "Validate");
287*35238bceSAndroid Build Coastguard Worker
288*35238bceSAndroid Build Coastguard Worker gl.glValidateProgramPipeline(pipeline.getPipeline());
289*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen pipeline");
290*35238bceSAndroid Build Coastguard Worker verifyStatePipelineInteger(result, gl, pipeline.getPipeline(), GL_VALIDATE_STATUS, GL_TRUE, m_verifier);
291*35238bceSAndroid Build Coastguard Worker }
292*35238bceSAndroid Build Coastguard Worker
293*35238bceSAndroid Build Coastguard Worker result.setTestContextResult(m_testCtx);
294*35238bceSAndroid Build Coastguard Worker return STOP;
295*35238bceSAndroid Build Coastguard Worker }
296*35238bceSAndroid Build Coastguard Worker
297*35238bceSAndroid Build Coastguard Worker class InfoLogCase : public TestCase
298*35238bceSAndroid Build Coastguard Worker {
299*35238bceSAndroid Build Coastguard Worker public:
300*35238bceSAndroid Build Coastguard Worker InfoLogCase(Context &context, const char *name, const char *desc);
301*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
302*35238bceSAndroid Build Coastguard Worker };
303*35238bceSAndroid Build Coastguard Worker
InfoLogCase(Context & context,const char * name,const char * desc)304*35238bceSAndroid Build Coastguard Worker InfoLogCase::InfoLogCase(Context &context, const char *name, const char *desc) : TestCase(context, name, desc)
305*35238bceSAndroid Build Coastguard Worker {
306*35238bceSAndroid Build Coastguard Worker }
307*35238bceSAndroid Build Coastguard Worker
iterate(void)308*35238bceSAndroid Build Coastguard Worker InfoLogCase::IterateResult InfoLogCase::iterate(void)
309*35238bceSAndroid Build Coastguard Worker {
310*35238bceSAndroid Build Coastguard Worker using gls::StateQueryUtil::StateQueryMemoryWriteGuard;
311*35238bceSAndroid Build Coastguard Worker
312*35238bceSAndroid Build Coastguard Worker static const char *const s_incompatibleFragmentSource = "#version 310 es\n"
313*35238bceSAndroid Build Coastguard Worker "in mediump vec2 v_colorB;\n"
314*35238bceSAndroid Build Coastguard Worker "in mediump vec2 v_colorC;\n"
315*35238bceSAndroid Build Coastguard Worker "layout(location=0) out highp vec4 o_color;\n"
316*35238bceSAndroid Build Coastguard Worker "void main()\n"
317*35238bceSAndroid Build Coastguard Worker "{\n"
318*35238bceSAndroid Build Coastguard Worker " o_color = v_colorB.xxyy + v_colorC.yyxy;\n"
319*35238bceSAndroid Build Coastguard Worker "}\n";
320*35238bceSAndroid Build Coastguard Worker
321*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram vtxProgram(m_context.getRenderContext(), glu::ProgramSources()
322*35238bceSAndroid Build Coastguard Worker << glu::ProgramSeparable(true)
323*35238bceSAndroid Build Coastguard Worker << glu::VertexSource(s_vertexSource));
324*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram frgProgram(m_context.getRenderContext(),
325*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::ProgramSeparable(true)
326*35238bceSAndroid Build Coastguard Worker << glu::FragmentSource(s_incompatibleFragmentSource));
327*35238bceSAndroid Build Coastguard Worker glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
328*35238bceSAndroid Build Coastguard Worker tcu::ResultCollector result(m_testCtx.getLog(), " // ERROR: ");
329*35238bceSAndroid Build Coastguard Worker
330*35238bceSAndroid Build Coastguard Worker {
331*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "VtxProg", "Vertex program");
332*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << vtxProgram;
333*35238bceSAndroid Build Coastguard Worker }
334*35238bceSAndroid Build Coastguard Worker
335*35238bceSAndroid Build Coastguard Worker {
336*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "FrgProg", "Fragment program");
337*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << frgProgram;
338*35238bceSAndroid Build Coastguard Worker }
339*35238bceSAndroid Build Coastguard Worker
340*35238bceSAndroid Build Coastguard Worker if (!vtxProgram.isOk() || !frgProgram.isOk())
341*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("failed to build program");
342*35238bceSAndroid Build Coastguard Worker
343*35238bceSAndroid Build Coastguard Worker gl.enableLogging(true);
344*35238bceSAndroid Build Coastguard Worker
345*35238bceSAndroid Build Coastguard Worker {
346*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
347*35238bceSAndroid Build Coastguard Worker glu::ProgramPipeline pipeline(m_context.getRenderContext());
348*35238bceSAndroid Build Coastguard Worker std::string buf(3, 'X');
349*35238bceSAndroid Build Coastguard Worker int written = -1;
350*35238bceSAndroid Build Coastguard Worker
351*35238bceSAndroid Build Coastguard Worker verifyStatePipelineInteger(result, gl, pipeline.getPipeline(), GL_INFO_LOG_LENGTH, 0, QUERY_PIPELINE_INTEGER);
352*35238bceSAndroid Build Coastguard Worker
353*35238bceSAndroid Build Coastguard Worker gl.glGetProgramPipelineInfoLog(pipeline.getPipeline(), 2, &written, &buf[0]);
354*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "query log");
355*35238bceSAndroid Build Coastguard Worker
356*35238bceSAndroid Build Coastguard Worker if (written == -1)
357*35238bceSAndroid Build Coastguard Worker result.fail("'length' was not written to");
358*35238bceSAndroid Build Coastguard Worker else if (written != 0)
359*35238bceSAndroid Build Coastguard Worker result.fail("'length' was not 0");
360*35238bceSAndroid Build Coastguard Worker else if (buf[0] != '\0')
361*35238bceSAndroid Build Coastguard Worker result.fail("log was not 0-sized null-terminated string");
362*35238bceSAndroid Build Coastguard Worker else if (buf[1] != 'X' || buf[2] != 'X')
363*35238bceSAndroid Build Coastguard Worker result.fail("buffer after returned length modified");
364*35238bceSAndroid Build Coastguard Worker }
365*35238bceSAndroid Build Coastguard Worker
366*35238bceSAndroid Build Coastguard Worker {
367*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection superSection(m_testCtx.getLog(), "ValidationFail", "Failed validation");
368*35238bceSAndroid Build Coastguard Worker glu::ProgramPipeline pipeline(m_context.getRenderContext());
369*35238bceSAndroid Build Coastguard Worker StateQueryMemoryWriteGuard<glw::GLint> logLen;
370*35238bceSAndroid Build Coastguard Worker
371*35238bceSAndroid Build Coastguard Worker gl.glBindProgramPipeline(pipeline.getPipeline());
372*35238bceSAndroid Build Coastguard Worker gl.glUseProgramStages(pipeline.getPipeline(), GL_VERTEX_SHADER_BIT, vtxProgram.getProgram());
373*35238bceSAndroid Build Coastguard Worker gl.glUseProgramStages(pipeline.getPipeline(), GL_FRAGMENT_SHADER_BIT, frgProgram.getProgram());
374*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen pipeline");
375*35238bceSAndroid Build Coastguard Worker
376*35238bceSAndroid Build Coastguard Worker gl.glBindProgramPipeline(0);
377*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "unbind pipeline");
378*35238bceSAndroid Build Coastguard Worker gl.glValidateProgramPipeline(pipeline.getPipeline());
379*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen pipeline");
380*35238bceSAndroid Build Coastguard Worker
381*35238bceSAndroid Build Coastguard Worker gl.glGetProgramPipelineiv(pipeline.getPipeline(), GL_INFO_LOG_LENGTH, &logLen);
382*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "get INFO_LOG_LENGTH");
383*35238bceSAndroid Build Coastguard Worker
384*35238bceSAndroid Build Coastguard Worker if (logLen.verifyValidity(result))
385*35238bceSAndroid Build Coastguard Worker verifyInfoLogQuery(result, gl, logLen, pipeline.getPipeline(),
386*35238bceSAndroid Build Coastguard Worker &glu::CallLogWrapper::glGetProgramPipelineInfoLog, "glGetProgramPipelineInfoLog");
387*35238bceSAndroid Build Coastguard Worker }
388*35238bceSAndroid Build Coastguard Worker
389*35238bceSAndroid Build Coastguard Worker result.setTestContextResult(m_testCtx);
390*35238bceSAndroid Build Coastguard Worker return STOP;
391*35238bceSAndroid Build Coastguard Worker }
392*35238bceSAndroid Build Coastguard Worker
393*35238bceSAndroid Build Coastguard Worker } // namespace
394*35238bceSAndroid Build Coastguard Worker
ProgramPipelineStateQueryTests(Context & context)395*35238bceSAndroid Build Coastguard Worker ProgramPipelineStateQueryTests::ProgramPipelineStateQueryTests(Context &context)
396*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "program_pipeline", "Program Pipeline State Query tests")
397*35238bceSAndroid Build Coastguard Worker {
398*35238bceSAndroid Build Coastguard Worker }
399*35238bceSAndroid Build Coastguard Worker
~ProgramPipelineStateQueryTests(void)400*35238bceSAndroid Build Coastguard Worker ProgramPipelineStateQueryTests::~ProgramPipelineStateQueryTests(void)
401*35238bceSAndroid Build Coastguard Worker {
402*35238bceSAndroid Build Coastguard Worker }
403*35238bceSAndroid Build Coastguard Worker
init(void)404*35238bceSAndroid Build Coastguard Worker void ProgramPipelineStateQueryTests::init(void)
405*35238bceSAndroid Build Coastguard Worker {
406*35238bceSAndroid Build Coastguard Worker static const QueryType verifiers[] = {
407*35238bceSAndroid Build Coastguard Worker QUERY_PIPELINE_INTEGER,
408*35238bceSAndroid Build Coastguard Worker };
409*35238bceSAndroid Build Coastguard Worker
410*35238bceSAndroid Build Coastguard Worker #define FOR_EACH_VERIFIER(X) \
411*35238bceSAndroid Build Coastguard Worker do \
412*35238bceSAndroid Build Coastguard Worker { \
413*35238bceSAndroid Build Coastguard Worker for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx) \
414*35238bceSAndroid Build Coastguard Worker { \
415*35238bceSAndroid Build Coastguard Worker const char *verifierSuffix = getVerifierSuffix(verifiers[verifierNdx]); \
416*35238bceSAndroid Build Coastguard Worker const QueryType verifier = verifiers[verifierNdx]; \
417*35238bceSAndroid Build Coastguard Worker this->addChild(X); \
418*35238bceSAndroid Build Coastguard Worker } \
419*35238bceSAndroid Build Coastguard Worker } while (0)
420*35238bceSAndroid Build Coastguard Worker
421*35238bceSAndroid Build Coastguard Worker FOR_EACH_VERIFIER(new ActiveProgramCase(
422*35238bceSAndroid Build Coastguard Worker m_context, verifier, (std::string("active_program_") + verifierSuffix).c_str(), "Test ACTIVE_PROGRAM"));
423*35238bceSAndroid Build Coastguard Worker FOR_EACH_VERIFIER(new PipelineProgramCase(m_context, verifier,
424*35238bceSAndroid Build Coastguard Worker (std::string("vertex_shader_") + verifierSuffix).c_str(),
425*35238bceSAndroid Build Coastguard Worker "Test VERTEX_SHADER", GL_VERTEX_SHADER));
426*35238bceSAndroid Build Coastguard Worker FOR_EACH_VERIFIER(new PipelineProgramCase(m_context, verifier,
427*35238bceSAndroid Build Coastguard Worker (std::string("fragment_shader_") + verifierSuffix).c_str(),
428*35238bceSAndroid Build Coastguard Worker "Test FRAGMENT_SHADER", GL_FRAGMENT_SHADER));
429*35238bceSAndroid Build Coastguard Worker FOR_EACH_VERIFIER(new PipelineProgramCase(m_context, verifier,
430*35238bceSAndroid Build Coastguard Worker (std::string("compute_shader_") + verifierSuffix).c_str(),
431*35238bceSAndroid Build Coastguard Worker "Test COMPUTE_SHADER", GL_COMPUTE_SHADER));
432*35238bceSAndroid Build Coastguard Worker FOR_EACH_VERIFIER(new ValidateStatusCase(
433*35238bceSAndroid Build Coastguard Worker m_context, verifier, (std::string("validate_status_") + verifierSuffix).c_str(), "Test VALIDATE_STATUS"));
434*35238bceSAndroid Build Coastguard Worker
435*35238bceSAndroid Build Coastguard Worker #undef FOR_EACH_VERIFIER
436*35238bceSAndroid Build Coastguard Worker
437*35238bceSAndroid Build Coastguard Worker this->addChild(new InfoLogCase(m_context, "info_log", "Test info log"));
438*35238bceSAndroid Build Coastguard Worker }
439*35238bceSAndroid Build Coastguard Worker
440*35238bceSAndroid Build Coastguard Worker } // namespace Functional
441*35238bceSAndroid Build Coastguard Worker } // namespace gles31
442*35238bceSAndroid Build Coastguard Worker } // namespace deqp
443