xref: /aosp_15_r20/external/deqp/modules/gles31/functional/es31fProgramPipelineStateQueryTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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