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 2016 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 Negative Shader Storage Tests
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es31fNegativeShaderStorageTests.hpp"
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "glwDefs.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
29*35238bceSAndroid Build Coastguard Worker
30*35238bceSAndroid Build Coastguard Worker namespace deqp
31*35238bceSAndroid Build Coastguard Worker {
32*35238bceSAndroid Build Coastguard Worker namespace gles31
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker namespace Functional
35*35238bceSAndroid Build Coastguard Worker {
36*35238bceSAndroid Build Coastguard Worker namespace NegativeTestShared
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker namespace
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker
verifyProgram(NegativeTestContext & ctx,glu::ProgramSources sources)41*35238bceSAndroid Build Coastguard Worker void verifyProgram(NegativeTestContext &ctx, glu::ProgramSources sources)
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log = ctx.getLog();
44*35238bceSAndroid Build Coastguard Worker const glu::ShaderProgram program(ctx.getRenderContext(), sources);
45*35238bceSAndroid Build Coastguard Worker bool testFailed = false;
46*35238bceSAndroid Build Coastguard Worker
47*35238bceSAndroid Build Coastguard Worker log << program;
48*35238bceSAndroid Build Coastguard Worker
49*35238bceSAndroid Build Coastguard Worker testFailed = program.getProgramInfo().linkOk;
50*35238bceSAndroid Build Coastguard Worker
51*35238bceSAndroid Build Coastguard Worker if (testFailed)
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker const char *const message("Program was not expected to link.");
54*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
55*35238bceSAndroid Build Coastguard Worker ctx.fail(message);
56*35238bceSAndroid Build Coastguard Worker }
57*35238bceSAndroid Build Coastguard Worker }
58*35238bceSAndroid Build Coastguard Worker
getShaderExtensionDeclaration(glw::GLenum glShaderType)59*35238bceSAndroid Build Coastguard Worker const char *getShaderExtensionDeclaration(glw::GLenum glShaderType)
60*35238bceSAndroid Build Coastguard Worker {
61*35238bceSAndroid Build Coastguard Worker switch (glShaderType)
62*35238bceSAndroid Build Coastguard Worker {
63*35238bceSAndroid Build Coastguard Worker case GL_TESS_CONTROL_SHADER:
64*35238bceSAndroid Build Coastguard Worker case GL_TESS_EVALUATION_SHADER:
65*35238bceSAndroid Build Coastguard Worker return "#extension GL_EXT_tessellation_shader : require\n";
66*35238bceSAndroid Build Coastguard Worker case GL_GEOMETRY_SHADER:
67*35238bceSAndroid Build Coastguard Worker return "#extension GL_EXT_geometry_shader : require\n";
68*35238bceSAndroid Build Coastguard Worker default:
69*35238bceSAndroid Build Coastguard Worker return "";
70*35238bceSAndroid Build Coastguard Worker }
71*35238bceSAndroid Build Coastguard Worker }
72*35238bceSAndroid Build Coastguard Worker
getGLUShaderType(glw::GLenum glShaderType)73*35238bceSAndroid Build Coastguard Worker glu::ShaderType getGLUShaderType(glw::GLenum glShaderType)
74*35238bceSAndroid Build Coastguard Worker {
75*35238bceSAndroid Build Coastguard Worker switch (glShaderType)
76*35238bceSAndroid Build Coastguard Worker {
77*35238bceSAndroid Build Coastguard Worker case GL_VERTEX_SHADER:
78*35238bceSAndroid Build Coastguard Worker return glu::SHADERTYPE_VERTEX;
79*35238bceSAndroid Build Coastguard Worker case GL_FRAGMENT_SHADER:
80*35238bceSAndroid Build Coastguard Worker return glu::SHADERTYPE_FRAGMENT;
81*35238bceSAndroid Build Coastguard Worker case GL_TESS_CONTROL_SHADER:
82*35238bceSAndroid Build Coastguard Worker return glu::SHADERTYPE_TESSELLATION_CONTROL;
83*35238bceSAndroid Build Coastguard Worker case GL_TESS_EVALUATION_SHADER:
84*35238bceSAndroid Build Coastguard Worker return glu::SHADERTYPE_TESSELLATION_EVALUATION;
85*35238bceSAndroid Build Coastguard Worker case GL_GEOMETRY_SHADER:
86*35238bceSAndroid Build Coastguard Worker return glu::SHADERTYPE_GEOMETRY;
87*35238bceSAndroid Build Coastguard Worker case GL_COMPUTE_SHADER:
88*35238bceSAndroid Build Coastguard Worker return glu::SHADERTYPE_COMPUTE;
89*35238bceSAndroid Build Coastguard Worker default:
90*35238bceSAndroid Build Coastguard Worker DE_FATAL("Unknown shader type");
91*35238bceSAndroid Build Coastguard Worker return glu::SHADERTYPE_LAST;
92*35238bceSAndroid Build Coastguard Worker }
93*35238bceSAndroid Build Coastguard Worker }
94*35238bceSAndroid Build Coastguard Worker
getMaxSSBlockSizeEnum(glw::GLenum glShaderType)95*35238bceSAndroid Build Coastguard Worker glw::GLenum getMaxSSBlockSizeEnum(glw::GLenum glShaderType)
96*35238bceSAndroid Build Coastguard Worker {
97*35238bceSAndroid Build Coastguard Worker switch (glShaderType)
98*35238bceSAndroid Build Coastguard Worker {
99*35238bceSAndroid Build Coastguard Worker case GL_VERTEX_SHADER:
100*35238bceSAndroid Build Coastguard Worker return GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS;
101*35238bceSAndroid Build Coastguard Worker case GL_FRAGMENT_SHADER:
102*35238bceSAndroid Build Coastguard Worker return GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS;
103*35238bceSAndroid Build Coastguard Worker case GL_TESS_CONTROL_SHADER:
104*35238bceSAndroid Build Coastguard Worker return GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS;
105*35238bceSAndroid Build Coastguard Worker case GL_TESS_EVALUATION_SHADER:
106*35238bceSAndroid Build Coastguard Worker return GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS;
107*35238bceSAndroid Build Coastguard Worker case GL_GEOMETRY_SHADER:
108*35238bceSAndroid Build Coastguard Worker return GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS;
109*35238bceSAndroid Build Coastguard Worker case GL_COMPUTE_SHADER:
110*35238bceSAndroid Build Coastguard Worker return GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS;
111*35238bceSAndroid Build Coastguard Worker default:
112*35238bceSAndroid Build Coastguard Worker DE_FATAL("Unknown shader type");
113*35238bceSAndroid Build Coastguard Worker return -1;
114*35238bceSAndroid Build Coastguard Worker }
115*35238bceSAndroid Build Coastguard Worker }
116*35238bceSAndroid Build Coastguard Worker
getMaxSSBlockSize(NegativeTestContext & ctx,glw::GLenum glShaderType)117*35238bceSAndroid Build Coastguard Worker int getMaxSSBlockSize(NegativeTestContext &ctx, glw::GLenum glShaderType)
118*35238bceSAndroid Build Coastguard Worker {
119*35238bceSAndroid Build Coastguard Worker int maxSSBlocks = 0;
120*35238bceSAndroid Build Coastguard Worker ctx.glGetIntegerv(getMaxSSBlockSizeEnum(glShaderType), &maxSSBlocks);
121*35238bceSAndroid Build Coastguard Worker
122*35238bceSAndroid Build Coastguard Worker return maxSSBlocks;
123*35238bceSAndroid Build Coastguard Worker }
124*35238bceSAndroid Build Coastguard Worker
genBlockSource(NegativeTestContext & ctx,int64_t numSSBlocks,glw::GLenum shaderType)125*35238bceSAndroid Build Coastguard Worker std::string genBlockSource(NegativeTestContext &ctx, int64_t numSSBlocks, glw::GLenum shaderType)
126*35238bceSAndroid Build Coastguard Worker {
127*35238bceSAndroid Build Coastguard Worker const bool isES32 = contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
128*35238bceSAndroid Build Coastguard Worker const glu::GLSLVersion version = isES32 ? glu::GLSL_VERSION_320_ES : glu::GLSL_VERSION_310_ES;
129*35238bceSAndroid Build Coastguard Worker std::ostringstream source;
130*35238bceSAndroid Build Coastguard Worker
131*35238bceSAndroid Build Coastguard Worker source << glu::getGLSLVersionDeclaration(version) << "\n"
132*35238bceSAndroid Build Coastguard Worker << ((isES32) ? "" : getShaderExtensionDeclaration(shaderType));
133*35238bceSAndroid Build Coastguard Worker
134*35238bceSAndroid Build Coastguard Worker switch (shaderType)
135*35238bceSAndroid Build Coastguard Worker {
136*35238bceSAndroid Build Coastguard Worker case GL_VERTEX_SHADER:
137*35238bceSAndroid Build Coastguard Worker case GL_FRAGMENT_SHADER:
138*35238bceSAndroid Build Coastguard Worker break;
139*35238bceSAndroid Build Coastguard Worker
140*35238bceSAndroid Build Coastguard Worker case GL_COMPUTE_SHADER:
141*35238bceSAndroid Build Coastguard Worker source << "layout (local_size_x = 1) in;\n";
142*35238bceSAndroid Build Coastguard Worker break;
143*35238bceSAndroid Build Coastguard Worker
144*35238bceSAndroid Build Coastguard Worker case GL_GEOMETRY_SHADER:
145*35238bceSAndroid Build Coastguard Worker source << "layout(points) in;\n"
146*35238bceSAndroid Build Coastguard Worker << "layout(line_strip, max_vertices = 3) out;\n";
147*35238bceSAndroid Build Coastguard Worker break;
148*35238bceSAndroid Build Coastguard Worker
149*35238bceSAndroid Build Coastguard Worker case GL_TESS_CONTROL_SHADER:
150*35238bceSAndroid Build Coastguard Worker source << "layout(vertices = 10) out;\n";
151*35238bceSAndroid Build Coastguard Worker break;
152*35238bceSAndroid Build Coastguard Worker
153*35238bceSAndroid Build Coastguard Worker case GL_TESS_EVALUATION_SHADER:
154*35238bceSAndroid Build Coastguard Worker source << "layout(triangles) in;\n";
155*35238bceSAndroid Build Coastguard Worker break;
156*35238bceSAndroid Build Coastguard Worker
157*35238bceSAndroid Build Coastguard Worker default:
158*35238bceSAndroid Build Coastguard Worker DE_FATAL("Unknown shader type");
159*35238bceSAndroid Build Coastguard Worker break;
160*35238bceSAndroid Build Coastguard Worker }
161*35238bceSAndroid Build Coastguard Worker
162*35238bceSAndroid Build Coastguard Worker source << "\n"
163*35238bceSAndroid Build Coastguard Worker << "layout(std430, binding = 0) buffer Block {\n"
164*35238bceSAndroid Build Coastguard Worker << " int value;\n"
165*35238bceSAndroid Build Coastguard Worker << "} sb_in[" << numSSBlocks << "];\n"
166*35238bceSAndroid Build Coastguard Worker << "void main(void) { sb_in[0].value = 1; }\n";
167*35238bceSAndroid Build Coastguard Worker
168*35238bceSAndroid Build Coastguard Worker return source.str();
169*35238bceSAndroid Build Coastguard Worker }
170*35238bceSAndroid Build Coastguard Worker
genCommonSource(NegativeTestContext & ctx,glw::GLenum shaderType)171*35238bceSAndroid Build Coastguard Worker std::string genCommonSource(NegativeTestContext &ctx, glw::GLenum shaderType)
172*35238bceSAndroid Build Coastguard Worker {
173*35238bceSAndroid Build Coastguard Worker const bool isES32 = contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
174*35238bceSAndroid Build Coastguard Worker const glu::GLSLVersion version = isES32 ? glu::GLSL_VERSION_320_ES : glu::GLSL_VERSION_310_ES;
175*35238bceSAndroid Build Coastguard Worker std::ostringstream source;
176*35238bceSAndroid Build Coastguard Worker
177*35238bceSAndroid Build Coastguard Worker source << glu::getGLSLVersionDeclaration(version) << "\n"
178*35238bceSAndroid Build Coastguard Worker << ((isES32) ? "" : getShaderExtensionDeclaration(shaderType));
179*35238bceSAndroid Build Coastguard Worker
180*35238bceSAndroid Build Coastguard Worker switch (shaderType)
181*35238bceSAndroid Build Coastguard Worker {
182*35238bceSAndroid Build Coastguard Worker case GL_TESS_CONTROL_SHADER:
183*35238bceSAndroid Build Coastguard Worker source << "layout(vertices = 3) out;\n"
184*35238bceSAndroid Build Coastguard Worker << "void main() {}\n";
185*35238bceSAndroid Build Coastguard Worker break;
186*35238bceSAndroid Build Coastguard Worker
187*35238bceSAndroid Build Coastguard Worker case GL_TESS_EVALUATION_SHADER:
188*35238bceSAndroid Build Coastguard Worker source << "layout(triangles, equal_spacing, cw) in;\n"
189*35238bceSAndroid Build Coastguard Worker << "void main() {}\n";
190*35238bceSAndroid Build Coastguard Worker break;
191*35238bceSAndroid Build Coastguard Worker
192*35238bceSAndroid Build Coastguard Worker default:
193*35238bceSAndroid Build Coastguard Worker source << "void main() {}\n";
194*35238bceSAndroid Build Coastguard Worker break;
195*35238bceSAndroid Build Coastguard Worker }
196*35238bceSAndroid Build Coastguard Worker
197*35238bceSAndroid Build Coastguard Worker return source.str();
198*35238bceSAndroid Build Coastguard Worker }
199*35238bceSAndroid Build Coastguard Worker
genMaxSSBlocksSource(NegativeTestContext & ctx,glw::GLenum glShaderType,glu::ProgramSources & sources)200*35238bceSAndroid Build Coastguard Worker int genMaxSSBlocksSource(NegativeTestContext &ctx, glw::GLenum glShaderType, glu::ProgramSources &sources)
201*35238bceSAndroid Build Coastguard Worker {
202*35238bceSAndroid Build Coastguard Worker int maxSSBlocks = getMaxSSBlockSize(ctx, glShaderType);
203*35238bceSAndroid Build Coastguard Worker const std::string shaderSrc = genBlockSource(ctx, (maxSSBlocks), glShaderType);
204*35238bceSAndroid Build Coastguard Worker
205*35238bceSAndroid Build Coastguard Worker sources.sources[getGLUShaderType(glShaderType)].push_back(shaderSrc);
206*35238bceSAndroid Build Coastguard Worker
207*35238bceSAndroid Build Coastguard Worker return maxSSBlocks;
208*35238bceSAndroid Build Coastguard Worker }
209*35238bceSAndroid Build Coastguard Worker
block_number_limits(NegativeTestContext & ctx)210*35238bceSAndroid Build Coastguard Worker void block_number_limits(NegativeTestContext &ctx)
211*35238bceSAndroid Build Coastguard Worker {
212*35238bceSAndroid Build Coastguard Worker const glw::GLenum glShaderTypes[] = {
213*35238bceSAndroid Build Coastguard Worker GL_VERTEX_SHADER, GL_FRAGMENT_SHADER, GL_TESS_CONTROL_SHADER,
214*35238bceSAndroid Build Coastguard Worker GL_TESS_EVALUATION_SHADER, GL_GEOMETRY_SHADER, GL_COMPUTE_SHADER,
215*35238bceSAndroid Build Coastguard Worker };
216*35238bceSAndroid Build Coastguard Worker
217*35238bceSAndroid Build Coastguard Worker const std::string vertSource = genCommonSource(ctx, GL_VERTEX_SHADER);
218*35238bceSAndroid Build Coastguard Worker const std::string fragSource = genCommonSource(ctx, GL_FRAGMENT_SHADER);
219*35238bceSAndroid Build Coastguard Worker const std::string tessControlSource = genCommonSource(ctx, GL_TESS_CONTROL_SHADER);
220*35238bceSAndroid Build Coastguard Worker const std::string tessEvalSource = genCommonSource(ctx, GL_TESS_EVALUATION_SHADER);
221*35238bceSAndroid Build Coastguard Worker
222*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(glShaderTypes); ndx++)
223*35238bceSAndroid Build Coastguard Worker {
224*35238bceSAndroid Build Coastguard Worker ctx.beginSection("maxShaderStorageBlocks: Exceed limits");
225*35238bceSAndroid Build Coastguard Worker
226*35238bceSAndroid Build Coastguard Worker if (!ctx.isShaderSupported(static_cast<glu::ShaderType>(getGLUShaderType(glShaderTypes[ndx]))))
227*35238bceSAndroid Build Coastguard Worker {
228*35238bceSAndroid Build Coastguard Worker ctx.endSection();
229*35238bceSAndroid Build Coastguard Worker continue;
230*35238bceSAndroid Build Coastguard Worker }
231*35238bceSAndroid Build Coastguard Worker
232*35238bceSAndroid Build Coastguard Worker int maxSSBlocks = getMaxSSBlockSize(ctx, glShaderTypes[ndx]);
233*35238bceSAndroid Build Coastguard Worker std::string source = genBlockSource(ctx, maxSSBlocks + 1, glShaderTypes[ndx]);
234*35238bceSAndroid Build Coastguard Worker
235*35238bceSAndroid Build Coastguard Worker glu::ProgramSources sources;
236*35238bceSAndroid Build Coastguard Worker
237*35238bceSAndroid Build Coastguard Worker if (maxSSBlocks == 0)
238*35238bceSAndroid Build Coastguard Worker {
239*35238bceSAndroid Build Coastguard Worker ctx.endSection();
240*35238bceSAndroid Build Coastguard Worker continue;
241*35238bceSAndroid Build Coastguard Worker }
242*35238bceSAndroid Build Coastguard Worker
243*35238bceSAndroid Build Coastguard Worker switch (glShaderTypes[ndx])
244*35238bceSAndroid Build Coastguard Worker {
245*35238bceSAndroid Build Coastguard Worker case GL_VERTEX_SHADER:
246*35238bceSAndroid Build Coastguard Worker sources << glu::VertexSource(source) << glu::FragmentSource(fragSource);
247*35238bceSAndroid Build Coastguard Worker break;
248*35238bceSAndroid Build Coastguard Worker
249*35238bceSAndroid Build Coastguard Worker case GL_FRAGMENT_SHADER:
250*35238bceSAndroid Build Coastguard Worker sources << glu::VertexSource(vertSource) << glu::FragmentSource(source);
251*35238bceSAndroid Build Coastguard Worker break;
252*35238bceSAndroid Build Coastguard Worker
253*35238bceSAndroid Build Coastguard Worker case GL_TESS_CONTROL_SHADER:
254*35238bceSAndroid Build Coastguard Worker sources << glu::VertexSource(vertSource) << glu::FragmentSource(fragSource)
255*35238bceSAndroid Build Coastguard Worker << glu::TessellationControlSource(source) << glu::TessellationEvaluationSource(tessEvalSource);
256*35238bceSAndroid Build Coastguard Worker break;
257*35238bceSAndroid Build Coastguard Worker
258*35238bceSAndroid Build Coastguard Worker case GL_TESS_EVALUATION_SHADER:
259*35238bceSAndroid Build Coastguard Worker sources << glu::VertexSource(vertSource) << glu::FragmentSource(fragSource)
260*35238bceSAndroid Build Coastguard Worker << glu::TessellationControlSource(tessControlSource) << glu::TessellationEvaluationSource(source);
261*35238bceSAndroid Build Coastguard Worker break;
262*35238bceSAndroid Build Coastguard Worker
263*35238bceSAndroid Build Coastguard Worker case GL_GEOMETRY_SHADER:
264*35238bceSAndroid Build Coastguard Worker sources << glu::VertexSource(vertSource) << glu::FragmentSource(fragSource) << glu::GeometrySource(source);
265*35238bceSAndroid Build Coastguard Worker break;
266*35238bceSAndroid Build Coastguard Worker
267*35238bceSAndroid Build Coastguard Worker case GL_COMPUTE_SHADER:
268*35238bceSAndroid Build Coastguard Worker sources << glu::ComputeSource(source);
269*35238bceSAndroid Build Coastguard Worker break;
270*35238bceSAndroid Build Coastguard Worker
271*35238bceSAndroid Build Coastguard Worker default:
272*35238bceSAndroid Build Coastguard Worker DE_FATAL("Unknown shader type");
273*35238bceSAndroid Build Coastguard Worker break;
274*35238bceSAndroid Build Coastguard Worker }
275*35238bceSAndroid Build Coastguard Worker
276*35238bceSAndroid Build Coastguard Worker verifyProgram(ctx, sources);
277*35238bceSAndroid Build Coastguard Worker ctx.endSection();
278*35238bceSAndroid Build Coastguard Worker }
279*35238bceSAndroid Build Coastguard Worker }
280*35238bceSAndroid Build Coastguard Worker
max_combined_block_number_limit(NegativeTestContext & ctx)281*35238bceSAndroid Build Coastguard Worker void max_combined_block_number_limit(NegativeTestContext &ctx)
282*35238bceSAndroid Build Coastguard Worker {
283*35238bceSAndroid Build Coastguard Worker ctx.beginSection("maxCombinedShaderStorageBlocks: Exceed limits");
284*35238bceSAndroid Build Coastguard Worker
285*35238bceSAndroid Build Coastguard Worker glu::ProgramSources sources;
286*35238bceSAndroid Build Coastguard Worker
287*35238bceSAndroid Build Coastguard Worker int combinedSSBlocks = 0;
288*35238bceSAndroid Build Coastguard Worker int maxCombinedSSBlocks = 0;
289*35238bceSAndroid Build Coastguard Worker
290*35238bceSAndroid Build Coastguard Worker combinedSSBlocks += genMaxSSBlocksSource(ctx, GL_VERTEX_SHADER, sources);
291*35238bceSAndroid Build Coastguard Worker combinedSSBlocks += genMaxSSBlocksSource(ctx, GL_FRAGMENT_SHADER, sources);
292*35238bceSAndroid Build Coastguard Worker
293*35238bceSAndroid Build Coastguard Worker if ((ctx.isShaderSupported(glu::SHADERTYPE_TESSELLATION_CONTROL)) &&
294*35238bceSAndroid Build Coastguard Worker (ctx.isShaderSupported(glu::SHADERTYPE_TESSELLATION_EVALUATION)))
295*35238bceSAndroid Build Coastguard Worker {
296*35238bceSAndroid Build Coastguard Worker combinedSSBlocks += genMaxSSBlocksSource(ctx, GL_TESS_CONTROL_SHADER, sources);
297*35238bceSAndroid Build Coastguard Worker combinedSSBlocks += genMaxSSBlocksSource(ctx, GL_TESS_EVALUATION_SHADER, sources);
298*35238bceSAndroid Build Coastguard Worker }
299*35238bceSAndroid Build Coastguard Worker
300*35238bceSAndroid Build Coastguard Worker if (ctx.isShaderSupported(glu::SHADERTYPE_GEOMETRY))
301*35238bceSAndroid Build Coastguard Worker combinedSSBlocks += genMaxSSBlocksSource(ctx, GL_GEOMETRY_SHADER, sources);
302*35238bceSAndroid Build Coastguard Worker
303*35238bceSAndroid Build Coastguard Worker ctx.glGetIntegerv(GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS, &maxCombinedSSBlocks);
304*35238bceSAndroid Build Coastguard Worker
305*35238bceSAndroid Build Coastguard Worker ctx.getLog() << tcu::TestLog::Message << "GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS: " << maxCombinedSSBlocks
306*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
307*35238bceSAndroid Build Coastguard Worker ctx.getLog() << tcu::TestLog::Message << "Combined shader storage blocks: " << combinedSSBlocks
308*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
309*35238bceSAndroid Build Coastguard Worker
310*35238bceSAndroid Build Coastguard Worker if (combinedSSBlocks > maxCombinedSSBlocks)
311*35238bceSAndroid Build Coastguard Worker verifyProgram(ctx, sources);
312*35238bceSAndroid Build Coastguard Worker else
313*35238bceSAndroid Build Coastguard Worker ctx.getLog() << tcu::TestLog::Message
314*35238bceSAndroid Build Coastguard Worker << "Test skipped: Combined shader storage blocks < GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS: "
315*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
316*35238bceSAndroid Build Coastguard Worker
317*35238bceSAndroid Build Coastguard Worker ctx.endSection();
318*35238bceSAndroid Build Coastguard Worker }
319*35238bceSAndroid Build Coastguard Worker
320*35238bceSAndroid Build Coastguard Worker } // namespace
321*35238bceSAndroid Build Coastguard Worker
getNegativeShaderStorageTestFunctions()322*35238bceSAndroid Build Coastguard Worker std::vector<FunctionContainer> getNegativeShaderStorageTestFunctions()
323*35238bceSAndroid Build Coastguard Worker {
324*35238bceSAndroid Build Coastguard Worker const FunctionContainer funcs[] = {
325*35238bceSAndroid Build Coastguard Worker {block_number_limits, "block_number_limits", "Invalid shader linkage"},
326*35238bceSAndroid Build Coastguard Worker {max_combined_block_number_limit, "max_combined_block_number_limit", "Invalid shader linkage"},
327*35238bceSAndroid Build Coastguard Worker };
328*35238bceSAndroid Build Coastguard Worker
329*35238bceSAndroid Build Coastguard Worker return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
330*35238bceSAndroid Build Coastguard Worker }
331*35238bceSAndroid Build Coastguard Worker
332*35238bceSAndroid Build Coastguard Worker } // namespace NegativeTestShared
333*35238bceSAndroid Build Coastguard Worker } // namespace Functional
334*35238bceSAndroid Build Coastguard Worker } // namespace gles31
335*35238bceSAndroid Build Coastguard Worker } // namespace deqp
336