148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/*-------------------------------------------------------------------------
248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * OpenGL Conformance Test Suite
348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * -----------------------------
448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2014-2016 The Khronos Group Inc.
648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * you may not use this file except in compliance with the License.
948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * You may obtain a copy of the License at
1048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
1248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Unless required by applicable law or agreed to in writing, software
1448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
1548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * See the License for the specific language governing permissions and
1748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * limitations under the License.
1848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1984322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*!
2048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file
2148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief
2284322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/
2348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
2448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/**
2548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ /*!
2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file  gl4cPipelineStatisticsQueryTests.cpp
2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief Implements conformance tests for GL_ARB_pipeline_statistics_query functionality
2884322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/
2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gl4cPipelineStatisticsQueryTests.hpp"
3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluContextInfo.hpp"
3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluDefs.hpp"
3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwEnums.hpp"
3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwFunctions.hpp"
3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuRenderTarget.hpp"
3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuTestLog.hpp"
3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <string>
3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <vector>
4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#ifndef GL_VERTICES_SUBMITTED_ARB
4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GL_VERTICES_SUBMITTED_ARB (0x82EE)
4348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif
4448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#ifndef GL_PRIMITIVES_SUBMITTED_ARB
4548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GL_PRIMITIVES_SUBMITTED_ARB (0x82EF)
4648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif
4748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#ifndef GL_VERTEX_SHADER_INVOCATIONS_ARB
4848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GL_VERTEX_SHADER_INVOCATIONS_ARB (0x82F0)
4948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif
5048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#ifndef GL_TESS_CONTROL_SHADER_PATCHES_ARB
5148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GL_TESS_CONTROL_SHADER_PATCHES_ARB (0x82F1)
5248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif
5348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#ifndef GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB
5448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB (0x82F2)
5548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif
5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#ifndef GL_GEOMETRY_SHADER_INVOCATIONS
5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GL_GEOMETRY_SHADER_INVOCATIONS (0x887F)
5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif
5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#ifndef GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB
6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB (0x82F3)
6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif
6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#ifndef GL_FRAGMENT_SHADER_INVOCATIONS_ARB
6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB (0x82F4)
6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif
6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#ifndef GL_COMPUTE_SHADER_INVOCATIONS_ARB
6648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GL_COMPUTE_SHADER_INVOCATIONS_ARB (0x82F5)
6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif
6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#ifndef GL_CLIPPING_INPUT_PRIMITIVES_ARB
6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GL_CLIPPING_INPUT_PRIMITIVES_ARB (0x82F6)
7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif
7148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#ifndef GL_CLIPPING_OUTPUT_PRIMITIVES_ARB
7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB (0x82F7)
7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif
7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace glcts
7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst char* PipelineStatisticsQueryUtilities::dummy_cs_code =
7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"#version 430\n"
7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"\n"
8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"layout(local_size_x=1, local_size_y = 1, local_size_z = 1) in;\n"
8148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"\n"
8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"layout(binding = 0) uniform atomic_uint test_counter;\n"
8348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"\n"
8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"void main()\n"
8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"{\n"
8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"    atomicCounterIncrement(test_counter);\n"
8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"}\n";
8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst char* PipelineStatisticsQueryUtilities::dummy_fs_code = "#version 130\n"
8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "\n"
9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "out vec4 result;\n"
9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "\n"
9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "void main()\n"
9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "{\n"
9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "    result = gl_FragCoord;\n"
9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "}\n";
9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst char* PipelineStatisticsQueryUtilities::dummy_tc_code =
9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"#version 400\n"
9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"\n"
9948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"layout(vertices = 3) out;\n"
10048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"\n"
10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"void main()\n"
10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"{\n"
10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"    gl_TessLevelInner[0]                = 1.0;\n"
10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"    gl_TessLevelInner[1]                = 2.0;\n"
10648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"    gl_TessLevelOuter[0]                = 3.0;\n"
10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"    gl_TessLevelOuter[1]                = 4.0;\n"
10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"    gl_TessLevelOuter[2]                = 5.0;\n"
10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"    gl_TessLevelOuter[3]                = 6.0;\n"
11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"}\n";
11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst char* PipelineStatisticsQueryUtilities::dummy_te_code =
11248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"#version 400\n"
11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"\n"
11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"layout(triangles) in;\n"
11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"\n"
11648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"void main()\n"
11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"{\n"
11848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"    gl_Position = gl_TessCoord.xyxy * gl_in[gl_PrimitiveID].gl_Position;\n"
11948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"}\n";
12048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst char* PipelineStatisticsQueryUtilities::dummy_vs_code = "#version 130\n"
12148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "\n"
12248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "in vec4 position;\n"
12348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "\n"
12448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "void main()\n"
12548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "{\n"
12648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "    gl_Position = position;\n"
12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "}\n";
12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** An array holding all query targets that are introduced by GL_ARB_pipeline_statistics_query */
13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLenum PipelineStatisticsQueryUtilities::query_targets[] = {
13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_VERTICES_SUBMITTED_ARB,
13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_PRIMITIVES_SUBMITTED_ARB,
13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_VERTEX_SHADER_INVOCATIONS_ARB,
13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TESS_CONTROL_SHADER_PATCHES_ARB,
13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB,
13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_GEOMETRY_SHADER_INVOCATIONS,
13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB,
13848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_FRAGMENT_SHADER_INVOCATIONS_ARB,
13948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_COMPUTE_SHADER_INVOCATIONS_ARB,
14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_CLIPPING_INPUT_PRIMITIVES_ARB,
14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_CLIPPING_OUTPUT_PRIMITIVES_ARB,
14248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
14348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst unsigned int PipelineStatisticsQueryUtilities::n_query_targets = sizeof(query_targets) / sizeof(query_targets[0]);
14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
14548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Offsets that point to locations in a buffer object storage that will hold
14648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * query object result values for a specific value type. */
14748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst unsigned int PipelineStatisticsQueryUtilities::qo_bo_int_offset   = (0);
14848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst unsigned int PipelineStatisticsQueryUtilities::qo_bo_int64_offset = (0 + 4 /* int */ + 4 /* alignment */);
14948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst unsigned int PipelineStatisticsQueryUtilities::qo_bo_uint_offset  = (0 + 8 /* int + alignment */ + 8 /* int64 */);
15048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst unsigned int PipelineStatisticsQueryUtilities::qo_bo_uint64_offset =
15148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	(0 + 8 /* int + alignment */ + 8 /* int64 */ + 8 /* uint + alignment */);
15248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst unsigned int PipelineStatisticsQueryUtilities::qo_bo_size = 32;
15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Buffer object size required to run the second functional test. */
15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst unsigned int PipelineStatisticsQueryTestFunctional2::bo_size = 32;
15648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Builds body of a geometry shader, given user-specified properties.
15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  This function works in two different ways:
16048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  1) If the caller only needs the geometry shader to use a single stream, the body
16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *     will be constructed in a way that ignores stream existence completely.
16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  2) Otherwise, the shader will only be compilable by platforms that support vertex
16448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *     streams.
16548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  The shader will emit @param n_primitives_to_emit_in_stream0 primitives on the zeroth
16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  stream, (@param n_primitives_to_emit_in_stream0 + 1) primitives on the first stream,
16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  and so on.
16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
17048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param gs_input                         Input primitive type that should be used by the geometry shader body.
17148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param gs_output                        Output primitive type that should be used by the geometry shader body.
17248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_primitives_to_emit_in_stream0  Number of primitives to be emitted on the zeroth vertex stream.
17348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_streams                        Number of streams the geometry shader should emit primitives on.
17448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
17548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Geometry shader body.
17648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
17748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string PipelineStatisticsQueryUtilities::buildGeometryShaderBody(_geometry_shader_input  gs_input,
17848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																	  _geometry_shader_output gs_output,
17948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																	  unsigned int n_primitives_to_emit_in_stream0,
18048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																	  unsigned int n_streams)
18148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
18248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(n_primitives_to_emit_in_stream0 >= 1);
18348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(n_streams >= 1);
18448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
18548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Each stream will output (n+1) primitives, where n corresponds to the number of primitives emitted
18648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * by the previous stream. Stream 0 emits user-defined number of primitievs.
18748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 */
18848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::stringstream gs_body_sstream;
18948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const std::string gs_input_string  = getGLSLStringForGSInput(gs_input);
19048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const std::string gs_output_string = getGLSLStringForGSOutput(gs_output);
19148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int	  n_max_vertices   = 0;
19248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int	  n_vertices_required_for_gs_output =
19348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		PipelineStatisticsQueryUtilities::getNumberOfVerticesForGSOutput(gs_output);
19448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_stream = 0; n_stream < n_streams; ++n_stream)
19648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
19748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		n_max_vertices += n_vertices_required_for_gs_output * (n_primitives_to_emit_in_stream0 + n_stream);
19848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* for (all streams) */
19948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Form the preamble. Note that we need to use the right ES SL version,
20148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * since vertex streams are not a core GL3.2 feature.
20248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 **/
20348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gs_body_sstream << ((n_streams > 1) ? "#version 400" : "#version 150\n") << "\n"
20448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																				"layout("
20548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< gs_input_string << ")                 in;\n"
20648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										  "layout("
20748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< gs_output_string << ", max_vertices=" << n_max_vertices << ") out;\n";
20848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* If we need to define multiple streams, do it now */
21048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (n_streams > 1)
21148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
21248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gs_body_sstream << "\n";
21348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
21448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (unsigned int n_stream = 0; n_stream < n_streams; ++n_stream)
21548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
21648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gs_body_sstream << "layout(stream = " << n_stream << ") out vec4 out_stream" << n_stream << ";\n";
21748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		} /* for (all streams) */
21848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}	 /* if (n_streams > 1) */
21948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Contine forming actual body */
22148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gs_body_sstream << "\n"
22248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					   "void main()\n"
22348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					   "{\n";
22448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Emit primitives */
22648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int n_output_primitive_vertices =
22748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		PipelineStatisticsQueryUtilities::getNumberOfVerticesForGSOutput(gs_output);
22848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_stream = 0; n_stream < n_streams; ++n_stream)
23048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
23148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const unsigned int n_primitives_to_emit = n_primitives_to_emit_in_stream0 + n_stream;
23248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
23348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (unsigned int n_primitive = 0; n_primitive < n_primitives_to_emit; ++n_primitive)
23448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
23548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (unsigned int n_vertex = 0; n_vertex < n_output_primitive_vertices; ++n_vertex)
23648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
23748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gs_body_sstream << "    gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n";
23848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
23948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (n_streams == 1)
24048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
24148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					gs_body_sstream << "    EmitVertex();\n";
24248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
24348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				else
24448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
24548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					gs_body_sstream << "    EmitStreamVertex(" << n_stream << ");\n";
24648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
24748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
24848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (n_streams == 1)
25048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
25148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gs_body_sstream << "    EndPrimitive();\n";
25248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
25348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			else
25448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
25548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gs_body_sstream << "    EndStreamPrimitive(" << n_stream << ");\n";
25648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
25748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		} /* for (all primitives the caller wants the shader to emit) */
25848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}	 /* for (all streams) */
25948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gs_body_sstream << "}\n";
26148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return gs_body_sstream.str();
26348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
26448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Executes the query and collects the result data from both query object buffer object
26648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (if these are supported by the running OpenGL implementation) and the query counters.
26748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  The result data is then exposed via @param out_result.
26848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
26948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param query_type     Type of the query to be executed for the iteration.
27048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param qo_id          ID of the query object to be used for the execution.
27148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                        The query object must not have been assigned a type
27248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                        prior to the call, or the type must be a match with
27348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                        @param query_type .
27448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param qo_bo_id       ID of the query buffer object to use for the call.
27548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                        Pass 0, if the running OpenGL implementation does not
27648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                        support QBOs.
27748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pfn_draw       Function pointer to caller-specific routine that is
27848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                        going to execute the draw call. Must not be NULL.
27948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param draw_user_arg  Caller-specific user argument to be passed with the
28048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                        @param pfn_draw callback.
28148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param render_context glu::RenderContext& to be used by the method.
28248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param test_context   tcu::TestContext& to be used by the method.
28348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context_info   glu::ContextInfo& to be used by the method.
28448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param out_result     Deref will be used to store the test execution result.
28548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                        Must not be NULL. Will only be modified if the method
28648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                        returns true.
28748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
28848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if the test executed successfully, and @param out_result 's fields
28948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          were modified.
29048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
29148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
29248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryUtilities::executeQuery(glw::GLenum query_type, glw::GLuint qo_id, glw::GLuint qo_bo_id,
29348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													PFNQUERYDRAWHANDLERPROC pfn_draw, void* draw_user_arg,
29448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													const glu::RenderContext& render_context,
29548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													tcu::TestContext&		  test_context,
29648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													const glu::ContextInfo&   context_info,
29748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													_test_execution_result*   out_result)
29848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
29948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLenum			  error_code = GL_NO_ERROR;
30048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl		 = render_context.getFunctions();
30148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool				  result	 = true;
30248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
30348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Check if the implementation provides non-zero number of bits for the query.
30448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * Queries, for which GL implementations provide zero bits of space return
30548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * indeterminate values, so we should skip them */
30648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint n_query_bits = 0;
30748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
30848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.getQueryiv(query_type, GL_QUERY_COUNTER_BITS, &n_query_bits);
30948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
31048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error_code = gl.getError();
31148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (error_code != GL_NO_ERROR)
31248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
31348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_context.getLog() << tcu::TestLog::Message
31448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  << "glGetQueryiv() call failed for GL_QUERY_COUNTER_BITS pname and "
31548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  << PipelineStatisticsQueryUtilities::getStringForEnum(query_type) << "query target."
31648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  << tcu::TestLog::EndMessage;
31748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
31848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false;
31948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
32048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
32148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (n_query_bits == 0)
32248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
32348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_context.getLog() << tcu::TestLog::Message << "Skipping "
32448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														  "["
32548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  << PipelineStatisticsQueryUtilities::getStringForEnum(query_type)
32648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  << "]"
32748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 ": zero bits available for counter storage"
32848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  << tcu::TestLog::EndMessage;
32948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
33048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return result;
33148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
33248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
33348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Start the query */
33448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.beginQuery(query_type, qo_id);
33548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
33648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error_code = gl.getError();
33748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (error_code != GL_NO_ERROR)
33848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
33948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_context.getLog() << tcu::TestLog::Message
34048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  << "A valid glBeginQuery() call generated the following error code:"
34148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "["
34248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  << error_code << "]" << tcu::TestLog::EndMessage;
34348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
34448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false;
34548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
34648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
34748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* If GL_ARB_query_buffer_object is supported and the caller supplied a BO id, use
34848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * it before we fire any draw calls */
34948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (context_info.isExtensionSupported("GL_ARB_query_buffer_object") && qo_bo_id != 0)
35048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
35148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindBuffer(GL_QUERY_BUFFER, qo_bo_id);
35248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
35348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error_code = gl.getError();
35448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (error_code != GL_NO_ERROR)
35548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
35648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			test_context.getLog() << tcu::TestLog::Message
35748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  << "Could not bind a buffer object to GL_QUERY_BUFFER buffer object "
35848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									 "binding point. Error reported:"
35948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									 "["
36048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  << error_code << "]" << tcu::TestLog::EndMessage;
36148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
36248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Stop the query before we leave */
36348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.endQuery(query_type);
36448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
36548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
36648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		} /* if (buffer binding operation failed) */
36748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}	 /* if (GL_ARB_query_buffer_object extension is supported and the supplied QO BO id
36848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 *     is not 0) */
36948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
37048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
37148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Reset the QO BO id, so that we can skip the checks later */
37248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		qo_bo_id = 0;
37348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
37448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
37548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Perform the draw calls, if any supplied call-back function pointer was supplied
37648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * by the caller. */
37748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (pfn_draw != DE_NULL)
37848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
37948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		pfn_draw(draw_user_arg);
38048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
38148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
38248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* End the query */
38348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.endQuery(query_type);
38448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
38548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error_code = gl.getError();
38648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (error_code != GL_NO_ERROR)
38748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
38848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_context.getLog() << tcu::TestLog::Message << "glEndQuery() call failed with error code"
38948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														  "["
39048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  << error_code << "]" << tcu::TestLog::EndMessage;
39148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
39248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false;
39348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* if (glEndQuery() call failed) */
39448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
39548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* We now need to retrieve the result data using all query getter functions
39648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * GL has to offer. This will be handled in two iterations:
39748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 *
39848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * 1. The data will be retrieved using the getters without a QO BO being bound.
39948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * 2. If QO was provided, we will need to issue all getter calls executed against
40048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 *    the QO BO. We will then need to retrieve that data directly from the BO
40148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 *    storage.
40248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 */
40348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int iteration_index_wo_qo_bo   = 0;
40448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int iteration_index_with_qo_bo = 1;
40548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
40648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_iteration = 0; n_iteration < 2; /* as per description */
40748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 ++n_iteration)
40848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
40948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLint*	offset_int			 = DE_NULL;
41048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLint64*  offset_int64			 = DE_NULL;
41148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLuint*   offset_uint			 = DE_NULL;
41248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLuint64* offset_uint64		 = DE_NULL;
41348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLint	 result_int			 = INT_MAX;
41448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLint64   result_int64			 = LLONG_MAX;
41548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		bool		   result_int64_written  = false;
41648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLuint	result_uint			 = UINT_MAX;
41748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLuint64  result_uint64		 = ULLONG_MAX;
41848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		bool		   result_uint64_written = false;
41948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
42048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Skip the QO BO iteration if QO BO id has not been provided */
42148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_iteration == iteration_index_with_qo_bo && qo_bo_id == 0)
42248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
42348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
42448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
42548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
42648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Determine the offsets we should use for the getter calls */
42748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_iteration == iteration_index_wo_qo_bo)
42848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
42948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			offset_int	= &result_int;
43048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			offset_int64  = &result_int64;
43148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			offset_uint   = &result_uint;
43248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			offset_uint64 = &result_uint64;
43348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
43448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
43548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
43648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			offset_int	= (glw::GLint*)(deUintptr)PipelineStatisticsQueryUtilities::qo_bo_int_offset;
43748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			offset_int64  = (glw::GLint64*)(deUintptr)PipelineStatisticsQueryUtilities::qo_bo_int64_offset;
43848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			offset_uint   = (glw::GLuint*)(deUintptr)PipelineStatisticsQueryUtilities::qo_bo_uint_offset;
43948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			offset_uint64 = (glw::GLuint64*)(deUintptr)PipelineStatisticsQueryUtilities::qo_bo_uint64_offset;
44048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
44148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
44248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Bind the QO BO if we need to use it for the getter calls */
44348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_iteration == iteration_index_with_qo_bo)
44448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
44548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.bindBuffer(GL_QUERY_BUFFER, qo_bo_id);
44648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
44748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
44848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
44948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.bindBuffer(GL_QUERY_BUFFER, 0 /* buffer */);
45048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
45148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
45248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error_code = gl.getError();
45348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (error_code != GL_NO_ERROR)
45448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
45548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			test_context.getLog() << tcu::TestLog::Message
45648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  << "glBindBuffer() call failed for GL_QUERY_BUFFER target with error "
45748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									 "["
45848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  << error_code << "]" << tcu::TestLog::EndMessage;
45948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
46048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
46148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
46248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
46348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Issue the getter calls.
46448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 *
46548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 * NOTE: 64-bit getter calls are supported only if >= GL 3.3*/
46648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glu::contextSupports(render_context.getType(), glu::ApiType::core(3, 3)))
46748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
46848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.getQueryObjecti64v(qo_id, GL_QUERY_RESULT, offset_int64);
46948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
47048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			error_code = gl.getError();
47148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (error_code != GL_NO_ERROR)
47248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
47348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				test_context.getLog() << tcu::TestLog::Message << "glGetQueryObjecti64v() call failed with error "
47448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																  "["
47548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  << error_code << "]" << tcu::TestLog::EndMessage;
47648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
47748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return false;
47848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
47948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result_int64_written = true;
48148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
48248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
48348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
48448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result_int64_written = false;
48548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
48648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.getQueryObjectiv(qo_id, GL_QUERY_RESULT, offset_int);
48848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error_code = gl.getError();
49048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (error_code != GL_NO_ERROR)
49148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
49248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			test_context.getLog() << tcu::TestLog::Message << "glGetQueryObjectiv() call failed with error "
49348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "["
49448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  << error_code << "]" << tcu::TestLog::EndMessage;
49548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
49648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
49748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
49848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
49948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glu::contextSupports(render_context.getType(), glu::ApiType::core(3, 3)))
50048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
50148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.getQueryObjectui64v(qo_id, GL_QUERY_RESULT, offset_uint64);
50248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
50348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			error_code = gl.getError();
50448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (error_code != GL_NO_ERROR)
50548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
50648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				test_context.getLog() << tcu::TestLog::Message << "glGetQueryObjectui64v() call failed with error "
50748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																  "["
50848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  << error_code << "]" << tcu::TestLog::EndMessage;
50948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return false;
51148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
51248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result_uint64_written = true;
51448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
51548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
51648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
51748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result_uint64_written = false;
51848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
51948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
52048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.getQueryObjectuiv(qo_id, GL_QUERY_RESULT, offset_uint);
52148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
52248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error_code = gl.getError();
52348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (error_code != GL_NO_ERROR)
52448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
52548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			test_context.getLog() << tcu::TestLog::Message << "glGetQueryObjectuiv() call failed with error "
52648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  "["
52748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  << error_code << "]" << tcu::TestLog::EndMessage;
52848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
52948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
53048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
53148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
53248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* If the getters wrote the result values to the BO, we need to retrieve the data
53348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 * from the BO storage */
53448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_iteration == iteration_index_with_qo_bo)
53548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
53648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Map the BO to process space */
53748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const unsigned char* bo_data_ptr = (const unsigned char*)gl.mapBuffer(GL_QUERY_BUFFER, GL_READ_ONLY);
53848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
53948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			error_code = gl.getError();
54048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
54148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (error_code != GL_NO_ERROR || bo_data_ptr == NULL)
54248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
54348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				test_context.getLog() << tcu::TestLog::Message << "QO BO mapping failed with error "
54448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																  "["
54548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  << error_code << "] and data ptr returned:"
54648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													   "["
54748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  << bo_data_ptr << "]" << tcu::TestLog::EndMessage;
54848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
54948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return false;
55048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
55148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
55248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Retrieve the query result data */
55348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result_int	= *(glw::GLint*)(bo_data_ptr + (int)(deIntptr)offset_int);
55448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result_int64  = *(glw::GLint64*)(bo_data_ptr + (int)(deIntptr)offset_int64);
55548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result_uint   = *(glw::GLuint*)(bo_data_ptr + (int)(deIntptr)offset_uint);
55648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result_uint64 = *(glw::GLuint64*)(bo_data_ptr + (int)(deIntptr)offset_uint64);
55748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
55848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Unmap the BO */
55948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.unmapBuffer(GL_QUERY_BUFFER);
56048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
56148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			error_code = gl.getError();
56248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (error_code != GL_NO_ERROR)
56348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
56448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				test_context.getLog() << tcu::TestLog::Message << "QO BO unmapping failed with error "
56548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																  "["
56648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  << error_code << "]" << tcu::TestLog::EndMessage;
56748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
56848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return false;
56948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
57048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		} /* if (QO BO iteration) */
57148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
57248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Store the retrieved data in user-provided location */
57348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_iteration == iteration_index_with_qo_bo)
57448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
57548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_result->result_qo_int	= result_int;
57648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_result->result_qo_int64  = result_int64;
57748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_result->result_qo_uint   = result_uint;
57848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_result->result_qo_uint64 = result_uint64;
57948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
58048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
58148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
58248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_result->result_int	= result_int;
58348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_result->result_int64  = result_int64;
58448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_result->result_uint   = result_uint;
58548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_result->result_uint64 = result_uint64;
58648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
58748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_result->int64_written  = result_int64_written;
58948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_result->uint64_written = result_uint64_written;
59048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* for (both iterations) */
59148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
59248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
59348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
59448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves a GLenum value corresponding to internal _primitive_type
59548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  enum value.
59648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
59748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param primitive_type Internal primitive type to use for the getter call.
59848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
59948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Corresponding GL value that can be used for the draw calls, or
60048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          GL_NONE if the conversion failed.
60148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
60248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
60348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosglw::GLenum PipelineStatisticsQueryUtilities::getEnumForPrimitiveType(_primitive_type primitive_type)
60448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
60548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLenum result = GL_NONE;
60648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
60748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (primitive_type)
60848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
60948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_POINTS:
61048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = GL_POINTS;
61148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
61248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_LINE_LOOP:
61348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = GL_LINE_LOOP;
61448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
61548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_LINE_STRIP:
61648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = GL_LINE_STRIP;
61748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
61848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_LINES:
61948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = GL_LINES;
62048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
62148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_LINES_ADJACENCY:
62248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = GL_LINES_ADJACENCY;
62348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
62448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_PATCHES:
62548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = GL_PATCHES;
62648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
62748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_TRIANGLE_FAN:
62848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = GL_TRIANGLE_FAN;
62948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
63048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_TRIANGLE_STRIP:
63148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = GL_TRIANGLE_STRIP;
63248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
63348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_TRIANGLES:
63448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = GL_TRIANGLES;
63548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
63648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_TRIANGLES_ADJACENCY:
63748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = GL_TRIANGLES_ADJACENCY;
63848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
63948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
64048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
64148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
64248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Unrecognized primitive type");
64348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
64448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* switch (primitive_type) */
64548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
64648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
64748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
64848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
64948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves a human-readable name for a _geometry_shader_input value.
65048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
65148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param gs_input Internal _geometry_shader_input value to use for
65248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                  the conversion.
65348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
65448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Human-readable string or empty string, if the conversion failed.
65548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
65648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
65748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string PipelineStatisticsQueryUtilities::getGLSLStringForGSInput(_geometry_shader_input gs_input)
65848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
65948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string result;
66048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
66148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (gs_input)
66248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
66348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_POINTS:
66448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "points";
66548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
66648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_LINES:
66748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "lines";
66848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
66948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_LINES_ADJACENCY:
67048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "lines_adjacency";
67148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
67248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_TRIANGLES:
67348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "triangles";
67448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
67548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_TRIANGLES_ADJACENCY:
67648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "triangles_adjacency";
67748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
67848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
67948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
68048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
68148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Unrecognized geometry shader input enum");
68248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
68348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* switch (gs_input) */
68448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
68548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
68648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
68748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
68848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves a human-readable string for a _geometry_shader_output value.
68948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
69048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param  gs_output _geometry_shader_output value to use for the conversion.
69148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
69248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested value or empty string, if the value was not recognized.
69348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
69448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
69548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string PipelineStatisticsQueryUtilities::getGLSLStringForGSOutput(_geometry_shader_output gs_output)
69648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
69748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string result;
69848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
69948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (gs_output)
70048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
70148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_OUTPUT_POINTS:
70248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "points";
70348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
70448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_OUTPUT_LINE_STRIP:
70548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "line_strip";
70648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
70748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_OUTPUT_TRIANGLE_STRIP:
70848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "triangle_strip";
70948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
71048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
71148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
71248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
71348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Unrecognized geometry shader output enum");
71448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
71548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* switch (gs_output) */
71648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
71748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
71848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
71948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
72048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Number of vertices the geometry shader can access on the input, if the shader
72148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  uses @param gs_input input primitive type.
72248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
72348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param gs_input Geometry shader input to use for the query.
72448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
72548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested value or 0 if @param gs_input was not recognized.
72648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
72748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosunsigned int PipelineStatisticsQueryUtilities::getNumberOfVerticesForGSInput(_geometry_shader_input gs_input)
72848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
72948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int result = 0;
73048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
73148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (gs_input)
73248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
73348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_POINTS:
73448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 1;
73548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
73648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_LINES:
73748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 2;
73848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
73948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_LINES_ADJACENCY:
74048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 4;
74148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
74248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_TRIANGLES:
74348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 3;
74448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
74548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_TRIANGLES_ADJACENCY:
74648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 6;
74748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
74848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
74948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
75048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
75148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Unrecognized geometry shader input type");
75248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
75348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* switch (gs_input) */
75448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
75548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
75648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
75748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
75848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves a number of vertices that need to be emitted before the shader
75948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  can end the primitive, with the primitive being complete, assuming the
76048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  geometry shader outputs a primitive of type described by @param gs_output.
76148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
76248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param gs_output Primitive type to be outputted by the geometry shader.
76348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
76448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return As per description, or 0 if @param gs_output was not recognized.
76548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
76648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosunsigned int PipelineStatisticsQueryUtilities::getNumberOfVerticesForGSOutput(_geometry_shader_output gs_output)
76748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
76848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int n_result_vertices = 0;
76948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
77048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (gs_output)
77148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
77248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_OUTPUT_LINE_STRIP:
77348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		n_result_vertices = 2;
77448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
77548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_OUTPUT_POINTS:
77648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		n_result_vertices = 1;
77748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
77848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_OUTPUT_TRIANGLE_STRIP:
77948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		n_result_vertices = 3;
78048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
78148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
78248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
78348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Unrecognized geometry shader output type");
78448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
78548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
78648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All done */
78748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return n_result_vertices;
78848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
78948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
79048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Returns the number of vertices a single primitive of type described by @param primitive_type
79148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  consists of.
79248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
79348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param primitive_type Primitive type to use for the query.
79448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
79548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Result value, or 0 if @param primive_type was not recognized.
79648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
79748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosunsigned int PipelineStatisticsQueryUtilities::getNumberOfVerticesForPrimitiveType(_primitive_type primitive_type)
79848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
79948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int result = 0;
80048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
80148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (primitive_type)
80248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
80348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_POINTS:
80448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 1;
80548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
80648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_LINE_LOOP:  /* fall-through */
80748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_LINE_STRIP: /* fall-through */
80848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_LINES:
80948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 2;
81048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
81148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_TRIANGLE_FAN:   /* fall-through */
81248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_TRIANGLE_STRIP: /* fall-through */
81348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_TRIANGLES:
81448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 3;
81548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
81648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_LINES_ADJACENCY:
81748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 4;
81848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
81948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_TRIANGLES_ADJACENCY:
82048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 6;
82148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
82248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
82348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
82448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Unrecognized primitive type");
82548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* switch (primitive_type) */
82648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
82748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
82848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
82948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
83048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Converts user-specified _geometry_shader_input value to a _primitive_type value.
83148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
83248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param gs_input Input value for the conversion.
83348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
83448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested value, or PRIMITIVE_TYPE_COUNT if the user-specified value
83548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          was unrecognized.
83648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
83748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosPipelineStatisticsQueryUtilities::_primitive_type PipelineStatisticsQueryUtilities::getPrimitiveTypeFromGSInput(
83848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_geometry_shader_input gs_input)
83948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
84048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_primitive_type result = PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_COUNT;
84148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
84248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (gs_input)
84348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
84448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_POINTS:
84548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_POINTS;
84648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
84748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_LINES:
84848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINES;
84948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
85048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_LINES_ADJACENCY:
85148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINES_ADJACENCY;
85248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
85348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_TRIANGLES:
85448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLES;
85548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
85648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GEOMETRY_SHADER_INPUT_TRIANGLES_ADJACENCY:
85748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLES_ADJACENCY;
85848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
85948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
86048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
86148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
86248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Unrecognized geometry shader input enum");
86348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
86448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* switch (gs_input) */
86548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
86648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
86748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
86848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
86948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Converts user-specified _draw_call_type value to a human-readable string.
87048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
87148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param draw_call_type Input value to use for the conversion.
87248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
87348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Human-readable string, or "[?]" (without the quotation marks) if
87448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          the input value was not recognized.
87548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
87648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string PipelineStatisticsQueryUtilities::getStringForDrawCallType(_draw_call_type draw_call_type)
87748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
87848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string result = "[?]";
87948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
88048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (draw_call_type)
88148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
88248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWARRAYS:
88348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "glDrawArrays()";
88448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
88548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWARRAYSINDIRECT:
88648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "glDrawArraysIndirect()";
88748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
88848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWARRAYSINSTANCED:
88948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "glDrawArraysInstanced()";
89048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
89148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWARRAYSINSTANCEDBASEINSTANCE:
89248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "glDrawArraysInstancedBaseInstance()";
89348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
89448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWELEMENTS:
89548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "glDrawElements()";
89648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
89748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWELEMENTSBASEVERTEX:
89848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "glDrawElementsBaseVertex()";
89948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
90048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWELEMENTSINDIRECT:
90148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "glDrawElementsIndirect()";
90248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
90348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCED:
90448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "glDrawElementsInstanced()";
90548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
90648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCEDBASEINSTANCE:
90748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "glDrawElementsInstancedBaseInstance()";
90848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
90948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCE:
91048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "glDrawElementsInstancedBaseVertexBaseInstance()";
91148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
91248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWRANGEELEMENTS:
91348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "glDrawRangeElements()";
91448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
91548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWRANGEELEMENTSBASEVERTEX:
91648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "glDrawRangeElementsBaseVertex()";
91748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
91848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
91948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		DE_ASSERT(0);
92048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
92148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
92248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
92348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
92448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
92548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
92648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Converts a GL enum value expressing a pipeline statistics query type
92748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  into a human-readable string.
92848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
92948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param value Input value to use for the conversion.
93048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
93148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Human-readable string or "[?]" (without the quotation marks)
93248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          if the input value was not recognized.
93348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
93448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string PipelineStatisticsQueryUtilities::getStringForEnum(glw::GLenum value)
93548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
93648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string result = "[?]";
93748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
93848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (value)
93948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
94048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_CLIPPING_INPUT_PRIMITIVES_ARB:
94148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_CLIPPING_INPUT_PRIMITIVES_ARB";
94248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
94348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_CLIPPING_OUTPUT_PRIMITIVES_ARB:
94448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_CLIPPING_OUTPUT_PRIMITIVES_ARB";
94548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
94648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_COMPUTE_SHADER_INVOCATIONS_ARB:
94748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_COMPUTE_SHADER_INVOCATIONS_ARB";
94848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
94948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_FRAGMENT_SHADER_INVOCATIONS_ARB:
95048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_FRAGMENT_SHADER_INVOCATIONS_ARB";
95148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
95248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_GEOMETRY_SHADER_INVOCATIONS:
95348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_GEOMETRY_SHADER_INVOCATIONS";
95448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
95548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB:
95648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB";
95748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
95848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_PRIMITIVES_SUBMITTED_ARB:
95948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_PRIMITIVES_SUBMITTED_ARB";
96048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
96148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TESS_CONTROL_SHADER_PATCHES_ARB:
96248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_TESS_CONTROL_SHADER_PATCHES_ARB";
96348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
96448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB:
96548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB";
96648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
96748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_VERTEX_SHADER_INVOCATIONS_ARB:
96848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_VERTEX_SHADER_INVOCATIONS_ARB";
96948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
97048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_VERTICES_SUBMITTED_ARB:
97148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_VERTICES_SUBMITTED_ARB";
97248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
97348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* switch (value) */
97448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
97548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
97648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
97748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
97848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Converts a _primitive_type value into a human-readable string.
97948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
98048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param primitive_type Input value to use for the conversion.
98148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
98248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested string or "[?]" (without the quotation marks)
98348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          if the input value was not recognized.
98448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
98548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string PipelineStatisticsQueryUtilities::getStringForPrimitiveType(_primitive_type primitive_type)
98648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
98748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string result = "[?]";
98848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
98948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (primitive_type)
99048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
99148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_POINTS:
99248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_POINTS";
99348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
99448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_LINE_LOOP:
99548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_LINE_LOOP";
99648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
99748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_LINE_STRIP:
99848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_LINE_STRIP";
99948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
100048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_LINES:
100148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_LINES";
100248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
100348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_LINES_ADJACENCY:
100448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_LINES_ADJACENCY";
100548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
100648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_PATCHES:
100748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_PATCHES";
100848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
100948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_TRIANGLE_FAN:
101048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_TRIANGLE_FAN";
101148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
101248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_TRIANGLE_STRIP:
101348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_TRIANGLE_STRIP";
101448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
101548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_TRIANGLES:
101648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_TRIANGLES";
101748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
101848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PRIMITIVE_TYPE_TRIANGLES_ADJACENCY:
101948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = "GL_TRIANGLES_ADJACENCY";
102048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
102148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
102248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		DE_ASSERT(0);
102348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
102448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
102548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
102648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
102748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
102848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
102948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells if it is safe to use a specific draw call type.
103048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
103148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param draw_call Draw call type to use for the query.
103248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
103348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if corresponding GL entry-point is available.
103448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
103548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryUtilities::isDrawCallSupported(_draw_call_type draw_call, const glw::Functions& gl)
103648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
103748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
103848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool result = false;
103948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
104048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (draw_call)
104148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
104248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWARRAYS:
104348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = (gl.drawArrays != DE_NULL);
104448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
104548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWARRAYSINDIRECT:
104648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = (gl.drawArraysIndirect != DE_NULL);
104748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
104848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWARRAYSINSTANCED:
104948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = (gl.drawArraysInstanced != DE_NULL);
105048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
105148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWARRAYSINSTANCEDBASEINSTANCE:
105248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = (gl.drawArraysInstancedBaseInstance != DE_NULL);
105348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
105448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWELEMENTS:
105548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = (gl.drawElements != DE_NULL);
105648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
105748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWELEMENTSBASEVERTEX:
105848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = (gl.drawElementsBaseVertex != DE_NULL);
105948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
106048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWELEMENTSINDIRECT:
106148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = (gl.drawElementsIndirect != DE_NULL);
106248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
106348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCED:
106448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = (gl.drawElementsInstanced != DE_NULL);
106548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
106648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCEDBASEINSTANCE:
106748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = (gl.drawElementsInstancedBaseInstance != DE_NULL);
106848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
106948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCE:
107048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = (gl.drawElementsInstancedBaseVertexBaseInstance != DE_NULL);
107148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
107248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWRANGEELEMENTS:
107348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = (gl.drawRangeElements != DE_NULL);
107448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
107548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case DRAW_CALL_TYPE_GLDRAWRANGEELEMENTSBASEVERTEX:
107648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = (gl.drawRangeElementsBaseVertex != DE_NULL);
107748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
107848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
107948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
108048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
108148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Unrecognized draw call type");
108248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
108348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* switch (draw_call) */
108448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
108548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
108648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
108748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
108848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells if user-specified draw call type is an instanced draw call.
108948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
109048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param draw_call Input value to use for the conversion.
109148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
109248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if @param draw_call corresponds to an instanced draw call,
109348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          false otherwise.
109448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
109548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryUtilities::isInstancedDrawCall(_draw_call_type draw_call)
109648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
109748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool result =
109848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		(draw_call == PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWARRAYSINDIRECT ||
109948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 draw_call == PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWARRAYSINSTANCED ||
110048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 draw_call == PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWARRAYSINSTANCEDBASEINSTANCE ||
110148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 draw_call == PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWELEMENTSINDIRECT ||
110248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 draw_call == PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCED ||
110348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 draw_call == PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCEDBASEINSTANCE ||
110448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 draw_call == PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCE);
110548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
110648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
110748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
110848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
110948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells if the running GL implementation supports user-specified pipeline
111048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  statistics query.
111148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
111248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param value          GL enum definining the pipeline statistics query type
111348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                        that should be used for the query.
111448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context_info   glu::ContextInfo instance that can be used by the method.
111548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param render_context glu::RenderContext instance that can be used by the method.
111648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
111748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if the query is supported, false otherwise. This method will return
111848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          true for unrecognized enums.
111948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
112048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryUtilities::isQuerySupported(glw::GLenum value, const glu::ContextInfo& context_info,
112148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														const glu::RenderContext& render_context)
112248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
112348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool result = true;
112448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
112548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (value)
112648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
112748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_GEOMETRY_SHADER_INVOCATIONS:
112848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB:
112948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
113048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!glu::contextSupports(render_context.getType(), glu::ApiType::core(3, 2)) &&
113148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			!context_info.isExtensionSupported("GL_ARB_geometry_shader4"))
113248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
113348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result = false;
113448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
113548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
113648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
113748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
113848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
113948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TESS_CONTROL_SHADER_PATCHES_ARB:
114048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB:
114148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
114248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!glu::contextSupports(render_context.getType(), glu::ApiType::compatibility(4, 0)) &&
114348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			!context_info.isExtensionSupported("GL_ARB_tessellation_shader"))
114448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
114548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result = false;
114648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
114748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
114848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
114948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
115048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
115148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_COMPUTE_SHADER_INVOCATIONS_ARB:
115248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
115348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!glu::contextSupports(render_context.getType(), glu::ApiType::core(4, 3)) &&
115448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			!context_info.isExtensionSupported("GL_ARB_compute_shader"))
115548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
115648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result = false;
115748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
115848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
115948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
116048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
116148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* switch (value) */
116248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
116348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
116448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
116548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
116648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Takes a filled _test_execution_result structure and performs the validation
116748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  of the embedded data.
116848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
116948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param run_result                   A filled _test_execution_result structure that
117048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                      should be used as input by the method.
117148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_expected_values            Number of possible expected values.
117248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param expected_values              Array of possible expected values.
117348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param should_check_qo_bo_values    true if the method should also verify the values
117448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                      retrieved from a query buffer object, false
117548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                      if it is OK to ignore them.
117648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param query_type                   Pipeline statistics query type that was used to
117748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                      capture the results stored in @param run_result .
117848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param draw_call_type_ptr           Type of the draw call that was used to capture the
117948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                      results stored in @param run_result .
118048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param primitive_type_ptr           Primitive type that was used for the draw call that
118148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                      was used to capture the results stored in @param
118248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                      run_result .
118348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param is_primitive_restart_enabled true if "Primitive Restart" rendering mode had been enabled
118448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                      when the draw call used to capture the results was made.
118548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param test_context                 tcu::TestContext instance that the method can use.
118648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param verification_type            Tells how the captured values should be compared against the
118748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                      reference value.
118848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
118948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if the result values were found valid, false otherwise.
119048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
119148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryUtilities::verifyResultValues(
119248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const _test_execution_result& run_result, unsigned int n_expected_values, const glw::GLuint64* expected_values,
119348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool should_check_qo_bo_values, const glw::GLenum query_type, const _draw_call_type* draw_call_type_ptr,
119448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const _primitive_type* primitive_type_ptr, bool is_primitive_restart_enabled, tcu::TestContext& test_context,
119548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_verification_type verification_type)
119648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
119748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool result = true;
119848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
119948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Make sure all values are set to one of the expected values */
120048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string draw_call_name;
120148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string primitive_name;
120248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
120348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_result_int_valid	   = false;
120448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_result_int64_valid	 = false;
120548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_result_uint_valid	  = false;
120648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_result_uint64_valid	= false;
120748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_result_qo_int_valid	= false;
120848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_result_qo_int64_valid  = false;
120948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_result_qo_uint_valid   = false;
121048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_result_qo_uint64_valid = false;
121148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
121248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (draw_call_type_ptr != DE_NULL)
121348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
121448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		draw_call_name = getStringForDrawCallType(*draw_call_type_ptr);
121548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
121648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
121748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
121848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		draw_call_name = "(does not apply)";
121948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
122048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
122148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (primitive_type_ptr != DE_NULL)
122248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
122348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		primitive_name = getStringForPrimitiveType(*primitive_type_ptr);
122448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
122548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
122648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
122748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		primitive_name = "(does not apply)";
122848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
122948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
123048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_expected_value = 0; n_expected_value < n_expected_values; ++n_expected_value)
123148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
123248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLuint64 expected_value = 0;
123348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
123448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_value = expected_values[n_expected_value];
123548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
123648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if ((verification_type == VERIFICATION_TYPE_EXACT_MATCH &&
123748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 (glw::GLuint64)run_result.result_int == expected_value) ||
123848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			(verification_type == VERIFICATION_TYPE_EQUAL_OR_GREATER &&
123948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 (glw::GLuint64)run_result.result_int >= expected_value))
124048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
124148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_result_int_valid = true;
124248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
124348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
124448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (run_result.int64_written && ((verification_type == VERIFICATION_TYPE_EXACT_MATCH &&
124548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										  run_result.result_int64 == (glw::GLint64)expected_value) ||
124648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										 (verification_type == VERIFICATION_TYPE_EQUAL_OR_GREATER &&
124748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										  run_result.result_int64 >= (glw::GLint64)expected_value)))
124848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
124948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_result_int64_valid = true;
125048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
125148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
125248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if ((verification_type == VERIFICATION_TYPE_EXACT_MATCH &&
125348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 (glw::GLuint64)run_result.result_uint == expected_value) ||
125448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			(verification_type == VERIFICATION_TYPE_EQUAL_OR_GREATER &&
125548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 (glw::GLuint64)run_result.result_uint >= expected_value))
125648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
125748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_result_uint_valid = true;
125848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
125948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
126048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (run_result.uint64_written &&
126148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			((verification_type == VERIFICATION_TYPE_EXACT_MATCH && run_result.result_uint64 == expected_value) ||
126248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 (verification_type == VERIFICATION_TYPE_EQUAL_OR_GREATER && run_result.result_uint64 >= expected_value)))
126348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
126448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_result_uint64_valid = true;
126548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
126648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
126748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (should_check_qo_bo_values)
126848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
126948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if ((verification_type == VERIFICATION_TYPE_EXACT_MATCH &&
127048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 (glw::GLuint64)run_result.result_qo_int == expected_value) ||
127148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				(verification_type == VERIFICATION_TYPE_EQUAL_OR_GREATER &&
127248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 (glw::GLuint64)run_result.result_qo_int >= expected_value))
127348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
127448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_result_qo_int_valid = true;
127548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
127648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
127748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (run_result.int64_written && ((verification_type == VERIFICATION_TYPE_EXACT_MATCH &&
127848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											  run_result.result_qo_int64 == (glw::GLint64)expected_value) ||
127948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											 (verification_type == VERIFICATION_TYPE_EQUAL_OR_GREATER &&
128048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											  run_result.result_qo_int64 >= (glw::GLint64)expected_value)))
128148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
128248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_result_qo_int64_valid = true;
128348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
128448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
128548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if ((verification_type == VERIFICATION_TYPE_EXACT_MATCH &&
128648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 (glw::GLuint64)run_result.result_qo_uint == expected_value) ||
128748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				(verification_type == VERIFICATION_TYPE_EQUAL_OR_GREATER &&
128848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 (glw::GLuint64)run_result.result_qo_uint >= expected_value))
128948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
129048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_result_qo_uint_valid = true;
129148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
129248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
129348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (run_result.uint64_written && ((verification_type == VERIFICATION_TYPE_EXACT_MATCH &&
129448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											   run_result.result_qo_uint64 == expected_value) ||
129548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											  (verification_type == VERIFICATION_TYPE_EQUAL_OR_GREATER &&
129648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											   run_result.result_qo_uint64 >= expected_value)))
129748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
129848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_result_qo_uint64_valid = true;
129948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
130048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		} /* if (should_check_qo_bo_values) */
130148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}	 /* for (both expected values) */
130248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
130348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!is_result_int_valid)
130448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
130548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		std::string log = PipelineStatisticsQueryUtilities::getVerifyResultValuesErrorString<glw::GLint>(
130648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			run_result.result_int, "non-QO BO int32", n_expected_values, expected_values, query_type, draw_call_name,
130748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			primitive_name, is_primitive_restart_enabled);
130848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
130948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_context.getLog() << tcu::TestLog::Message << log.c_str() << tcu::TestLog::EndMessage;
131048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
131148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = false;
131248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
131348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
131448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (run_result.int64_written && !is_result_int64_valid)
131548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
131648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		std::string log = PipelineStatisticsQueryUtilities::getVerifyResultValuesErrorString<glw::GLint64>(
131748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			run_result.result_int64, "non-QO BO int64", n_expected_values, expected_values, query_type, draw_call_name,
131848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			primitive_name, is_primitive_restart_enabled);
131948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
132048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_context.getLog() << tcu::TestLog::Message << log.c_str() << tcu::TestLog::EndMessage;
132148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
132248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = false;
132348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
132448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
132548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!is_result_uint_valid)
132648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
132748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		std::string log = PipelineStatisticsQueryUtilities::getVerifyResultValuesErrorString<glw::GLuint>(
132848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			run_result.result_uint, "non-QO BO uint32", n_expected_values, expected_values, query_type, draw_call_name,
132948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			primitive_name, is_primitive_restart_enabled);
133048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
133148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_context.getLog() << tcu::TestLog::Message << log.c_str() << tcu::TestLog::EndMessage;
133248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
133348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = false;
133448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
133548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
133648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (run_result.uint64_written && !is_result_uint64_valid)
133748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
133848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		std::string log = PipelineStatisticsQueryUtilities::getVerifyResultValuesErrorString<glw::GLuint64>(
133948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			run_result.result_uint, "non-QO BO uint64", n_expected_values, expected_values, query_type, draw_call_name,
134048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			primitive_name, is_primitive_restart_enabled);
134148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
134248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_context.getLog() << tcu::TestLog::Message << log.c_str() << tcu::TestLog::EndMessage;
134348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
134448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = false;
134548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
134648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
134748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (should_check_qo_bo_values)
134848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
134948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!is_result_qo_int_valid)
135048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
135148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			std::string log = PipelineStatisticsQueryUtilities::getVerifyResultValuesErrorString<glw::GLint>(
135248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				run_result.result_qo_int, "QO BO int32", n_expected_values, expected_values, query_type, draw_call_name,
135348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				primitive_name, is_primitive_restart_enabled);
135448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
135548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			test_context.getLog() << tcu::TestLog::Message << log.c_str() << tcu::TestLog::EndMessage;
135648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
135748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result = false;
135848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
135948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
136048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (run_result.int64_written && !is_result_qo_int64_valid)
136148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
136248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			std::string log = PipelineStatisticsQueryUtilities::getVerifyResultValuesErrorString<glw::GLint64>(
136348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				run_result.result_qo_int64, "QO BO int64", n_expected_values, expected_values, query_type,
136448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				draw_call_name, primitive_name, is_primitive_restart_enabled);
136548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
136648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			test_context.getLog() << tcu::TestLog::Message << log.c_str() << tcu::TestLog::EndMessage;
136748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
136848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result = false;
136948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
137048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
137148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!is_result_qo_uint_valid)
137248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
137348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			std::string log = PipelineStatisticsQueryUtilities::getVerifyResultValuesErrorString<glw::GLuint>(
137448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				run_result.result_qo_uint, "QO BO uint32", n_expected_values, expected_values, query_type,
137548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				draw_call_name, primitive_name, is_primitive_restart_enabled);
137648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
137748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			test_context.getLog() << tcu::TestLog::Message << log.c_str() << tcu::TestLog::EndMessage;
137848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
137948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result = false;
138048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
138148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
138248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (run_result.uint64_written && !is_result_qo_uint64_valid)
138348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
138448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			std::string log = PipelineStatisticsQueryUtilities::getVerifyResultValuesErrorString<glw::GLuint64>(
138548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				run_result.result_qo_uint64, "QO BO uint64", n_expected_values, expected_values, query_type,
138648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				draw_call_name, primitive_name, is_primitive_restart_enabled);
138748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
138848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			test_context.getLog() << tcu::TestLog::Message << log.c_str() << tcu::TestLog::EndMessage;
138948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
139048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result = false;
139148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
139248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
139348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
139448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
139548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
139648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
139748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor.
139848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
139948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context     Rendering context
140048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param name        Test name
140148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param description Test description
140248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
140348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosPipelineStatisticsQueryTestAPICoverage1::PipelineStatisticsQueryTestAPICoverage1(deqp::Context& context)
140448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(context, "api_coverage_invalid_glbeginquery_calls",
140548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   "Verifies that an attempt to assign a different query object type "
140648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   "to an object thas has already been assigned a type, results in "
140748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   "an error.")
140848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_qo_id(0)
140948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
141048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally */
141148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
141248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
141348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Deinitializes all GL objects that were created during test execution. */
141448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestAPICoverage1::deinit()
141548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
141648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
141748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
141848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_qo_id != 0)
141948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
142048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteQueries(1, &m_qo_id);
142148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
142248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_qo_id = 0;
142348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
142448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
142548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
142648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Executes test iteration.
142748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
142848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
142948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
143048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult PipelineStatisticsQueryTestAPICoverage1::iterate()
143148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
143248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glu::ContextInfo& context_info   = m_context.getContextInfo();
143348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool					has_passed	 = true;
143448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glu::RenderContext&		render_context = m_context.getRenderContext();
14355e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	glu::ContextType		contextType	= m_context.getRenderContext().getType();
143648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
143748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Only continue if GL_ARB_pipeline_statistics_query extension is supported */
14385e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	if (!glu::contextSupports(contextType, glu::ApiType::core(4, 6)) &&
14395e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski		!context_info.isExtensionSupported("GL_ARB_pipeline_statistics_query"))
144048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
144148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw tcu::NotSupportedError("GL_ARB_pipeline_statistics_query extension is not supported");
144248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
144348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
144448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Verify that a query object which has been assigned a pipeline statistics query target A,
144548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * cannot be assigned another type B (assuming A != B) */
144648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = render_context.getFunctions();
144748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
144848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_current_item = 0; n_current_item < PipelineStatisticsQueryUtilities::n_query_targets;
144948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 ++n_current_item)
145048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
145148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLenum current_pq = PipelineStatisticsQueryUtilities::query_targets[n_current_item];
145248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
145348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Make sure the query is supported */
145448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!PipelineStatisticsQueryUtilities::isQuerySupported(current_pq, context_info, render_context))
145548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
145648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
145748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
145848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
145948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Generate a new query object */
146048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.genQueries(1, &m_qo_id);
146148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glGenQueries() call failed.");
146248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
146348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Assign a type to the query object */
146448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.beginQuery(current_pq, m_qo_id);
146548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glBeginQuery() call failed.");
146648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
146748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.endQuery(current_pq);
146848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glEndQuery() call failed.");
146948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
147048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (unsigned int n_different_item = 0; n_different_item < PipelineStatisticsQueryUtilities::n_query_targets;
147148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 ++n_different_item)
147248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
147348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glw::GLenum different_pq = PipelineStatisticsQueryUtilities::query_targets[n_different_item];
147448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
147548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (current_pq == different_pq)
147648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
147748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Skip valid iterations */
147848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
147948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
148048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
148148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Make sure the other query type is supported */
148248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!PipelineStatisticsQueryUtilities::isQuerySupported(different_pq, context_info, render_context))
148348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
148448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
148548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
148648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
148748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Try using a different type for the same object */
148848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glw::GLenum error_code = GL_NO_ERROR;
148948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
149048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.beginQuery(different_pq, m_qo_id);
149148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
149248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Has GL_INVALID_OPERATION error been generated? */
149348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			error_code = gl.getError();
149448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
149548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (error_code != GL_INVALID_OPERATION)
149648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
149748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_testCtx.getLog() << tcu::TestLog::Message << "Unexpected error code "
149848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															   "["
149948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   << error_code << "]"
150048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													" generated when using glBeginQuery() for a query object of type "
150148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													"["
150248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   << PipelineStatisticsQueryUtilities::getStringForEnum(current_pq)
150348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   << "]"
150448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  ", when used for a query type "
150548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  "["
150648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   << PipelineStatisticsQueryUtilities::getStringForEnum(different_pq) << "]"
150748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   << tcu::TestLog::EndMessage;
150848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
150948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				has_passed = false;
151048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
151148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
151248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (error_code == GL_NO_ERROR)
151348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
151448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Clean up before we continue */
151548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.endQuery(different_pq);
151648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GLU_EXPECT_NO_ERROR(gl.getError(),
151748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									"glEndQuery() should not have failed for a successful glBeginQuery() call");
151848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
151948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		} /* for (all query object types) */
152048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
152148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* We need to switch to a new pipeline statistics query, so
152248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 * delete the query object */
152348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteQueries(1, &m_qo_id);
152448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteQueries() call failed.");
152548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* for (all pipeline statistics query object types) */
152648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
152748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (has_passed)
152848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
152948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test case passed */
153048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
153148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
153248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
153348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
153448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
153548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
153648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
153748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return STOP;
153848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
153948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
154048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor.
154148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
154248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context     Rendering context
154348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param name        Test name
154448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param description Test description
154548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
154648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosPipelineStatisticsQueryTestAPICoverage2::PipelineStatisticsQueryTestAPICoverage2(deqp::Context& context)
154748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(context, "api_coverage_unsupported_calls",
154848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   "Verifies that an attempt of using unsupported pipeline statistics queries"
154948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   " results in a GL_INVALID_ENUM error.")
155048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_qo_id(0)
155148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
155248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally */
155348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
155448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
155548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Deinitializes all GL objects that were created during test execution. */
155648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestAPICoverage2::deinit()
155748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
155848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
155948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
156048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_qo_id != 0)
156148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
156248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteQueries(1, &m_qo_id);
156348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
156448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_qo_id = 0;
156548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
156648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
156748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
156848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Executes test iteration.
156948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
157048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
157148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
157248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult PipelineStatisticsQueryTestAPICoverage2::iterate()
157348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
157448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glu::ContextInfo& context_info   = m_context.getContextInfo();
157548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLenum				error_code	 = GL_NO_ERROR;
157648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool					has_passed	 = true;
157748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glu::RenderContext&		render_context = m_context.getRenderContext();
157848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&   gl			   = render_context.getFunctions();
15795e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	glu::ContextType		contextType	= m_context.getRenderContext().getType();
158048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
158148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Only continue if GL_ARB_pipeline_statistics_query extension is supported */
15825e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	if (!glu::contextSupports(contextType, glu::ApiType::core(4, 6)) &&
15835e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski		!m_context.getContextInfo().isExtensionSupported("GL_ARB_pipeline_statistics_query"))
158448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
158548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw tcu::NotSupportedError("GL_ARB_pipeline_statistics_query extension is not supported");
158648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
158748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
158848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Generate a query object we will use for the tests */
158948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genQueries(1, &m_qo_id);
159048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenQueries() call failed.");
159148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
159248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::GLenum query_types[] = { GL_GEOMETRY_SHADER_INVOCATIONS, GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB,
159348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										GL_TESS_CONTROL_SHADER_PATCHES_ARB, GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB,
159448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										GL_COMPUTE_SHADER_INVOCATIONS_ARB };
159548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int n_query_types = sizeof(query_types) / sizeof(query_types[0]);
159648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
159748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_query_type = 0; n_query_type < n_query_types; ++n_query_type)
159848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
159948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLenum query_type = query_types[n_query_type];
160048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
160148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!PipelineStatisticsQueryUtilities::isQuerySupported(query_type, context_info, render_context))
160248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
160348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.beginQuery(query_type, m_qo_id);
160448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
160548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			error_code = gl.getError();
160648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (error_code != GL_INVALID_ENUM)
160748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
160848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_testCtx.getLog() << tcu::TestLog::Message
160948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   << "glBeginQuery() call did not generate a GL_INVALID_ENUM error "
161048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  "for an unsupported query type "
161148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  "["
161248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   << PipelineStatisticsQueryUtilities::getStringForEnum(query_type) << "]"
161348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   << tcu::TestLog::EndMessage;
161448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
161548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				has_passed = false;
161648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
161748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
161848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* If the query succeeded, stop it before we continue */
161948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (error_code == GL_NO_ERROR)
162048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
162148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.endQuery(query_type);
162248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
162348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GLU_EXPECT_NO_ERROR(gl.getError(), "glEndQuery() call failed.");
162448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
162548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		} /* if (query is not supported) */
162648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}	 /* for (all query types) */
162748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
162848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (has_passed)
162948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
163048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test case passed */
163148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
163248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
163348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
163448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
163548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
163648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
163748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
163848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return STOP;
163948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
164048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
164148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor.
164248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
164348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context     Rendering context
164448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param name        Test name
164548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param description Test description
164648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
164748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosPipelineStatisticsQueryTestFunctionalBase::PipelineStatisticsQueryTestFunctionalBase(deqp::Context& context,
164848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																					 const char*	name,
164948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																					 const char*	description)
165048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(context, name, description)
165148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_bo_qo_id(0)
165248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_fbo_id(0)
165348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_po_id(0)
165448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_qo_id(0)
165548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_to_id(0)
165648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_vao_id(0)
165748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_vbo_id(0)
165848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_to_height(64)
165948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_to_width(64)
166079df5799eb0b77e3f1a335f92a0a961b5db0461cJames Helferty	, m_current_draw_call_type(PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_COUNT)
166179df5799eb0b77e3f1a335f92a0a961b5db0461cJames Helferty	, m_current_primitive_type(PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_COUNT)
166248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_indirect_draw_call_baseinstance_argument(0)
166348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_indirect_draw_call_basevertex_argument(0)
166448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_indirect_draw_call_count_argument(0)
166548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_indirect_draw_call_first_argument(0)
166648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_indirect_draw_call_firstindex_argument(0)
166748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_indirect_draw_call_primcount_argument(0)
166848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
166948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally */
167048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
167148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
167248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Creates a program object that can be used for dispatch/draw calls, using
167348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  user-specified shader bodies. The method can either create a compute program,
167448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  or a regular rendering program.
167548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
167648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  ID of the initialized program object is stored in m_po_id.
167748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
167848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param cs_body Compute shader body. If not NULL, all other arguments must
167948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                 be NULL.
168048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param fs_body Fragment shader body. If not NULL, @param cs_body must be NULL.
168148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param gs_body Geometry shader body. If not NULL, @param cs_body must be NULL.
168248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param tc_body Tess control shader body. If not NULL, @param cs_body must be NULL.
168348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param te_body Tess evaluation shader body. If not NULL, @param cs_body must be NULL.
168448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param vs_body Vertex shader body. If not NULL, @param cs_body must be NULL.
168548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
168648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * */
168748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctionalBase::buildProgram(const char* cs_body, const char* fs_body,
168848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															 const char* gs_body, const char* tc_body,
168948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															 const char* te_body, const char* vs_body)
169048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
169148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl	= m_context.getRenderContext().getFunctions();
169248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint			  cs_id = 0;
169348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint			  fs_id = 0;
169448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint			  gs_id = 0;
169548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint			  tc_id = 0;
169648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint			  te_id = 0;
169748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint			  vs_id = 0;
169848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
169948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Sanity checks */
170048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT((cs_body != DE_NULL && (fs_body == DE_NULL && gs_body == DE_NULL && tc_body == DE_NULL &&
170148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  te_body == DE_NULL && vs_body == DE_NULL)) ||
170248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			  (cs_body == DE_NULL && (fs_body != DE_NULL || gs_body != DE_NULL || tc_body != DE_NULL ||
170348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  te_body != DE_NULL || vs_body != DE_NULL)));
170448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
170548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Any existing program object already initialzied? Purge it before we continue */
170648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_po_id != 0)
170748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
170848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteProgram(m_po_id);
170948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteProgram() call failed.");
171048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
171148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po_id = 0;
171248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
171348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
171448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Generate all shader objects we'll need to use for the program */
171548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (cs_body != DE_NULL)
171648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
171748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		cs_id = gl.createShader(GL_COMPUTE_SHADER);
171848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
171948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
172048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (fs_body != DE_NULL)
172148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
172248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		fs_id = gl.createShader(GL_FRAGMENT_SHADER);
172348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
172448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
172548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (gs_body != DE_NULL)
172648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
172748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gs_id = gl.createShader(GL_GEOMETRY_SHADER);
172848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
172948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
173048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (tc_body != DE_NULL)
173148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
173248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tc_id = gl.createShader(GL_TESS_CONTROL_SHADER);
173348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
173448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
173548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (te_body != DE_NULL)
173648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
173748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		te_id = gl.createShader(GL_TESS_EVALUATION_SHADER);
173848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
173948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
174048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (vs_body != DE_NULL)
174148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
174248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vs_id = gl.createShader(GL_VERTEX_SHADER);
174348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
174448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
174548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader() call(s) failed.");
174648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
174748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Create a program object */
174848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_po_id = gl.createProgram();
174948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
175048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateProgram() call failed.");
175148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
175248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set source code of the shaders we've created */
175348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (cs_id != 0)
175448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
175548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.shaderSource(cs_id, 1,			/* count */
175648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						&cs_body, DE_NULL); /* length */
175748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
175848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
175948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (fs_id != 0)
176048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
176148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.shaderSource(fs_id, 1,			/* count */
176248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						&fs_body, DE_NULL); /* length */
176348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
176448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
176548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (gs_id != 0)
176648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
176748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.shaderSource(gs_id, 1,			/* count */
176848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						&gs_body, DE_NULL); /* length */
176948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
177048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
177148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (tc_id != 0)
177248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
177348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.shaderSource(tc_id, 1,			/* count */
177448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						&tc_body, DE_NULL); /* length */
177548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
177648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
177748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (te_id != 0)
177848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
177948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.shaderSource(te_id, 1,			/* count */
178048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						&te_body, DE_NULL); /* length */
178148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
178248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
178348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (vs_id != 0)
178448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
178548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.shaderSource(vs_id, 1,			/* count */
178648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						&vs_body, DE_NULL); /* length */
178748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
178848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
178948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource() call(s) failed.");
179048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
179148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Compile the shaders */
179248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::GLuint  so_ids[] = { cs_id, fs_id, gs_id, tc_id, te_id, vs_id };
179348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int n_so_ids = sizeof(so_ids) / sizeof(so_ids[0]);
179448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
179548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_so_id = 0; n_so_id < n_so_ids; ++n_so_id)
179648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
179748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLint  compile_status = GL_FALSE;
179848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLuint so_id		   = so_ids[n_so_id];
179948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
180048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (so_id != 0)
180148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
180248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.compileShader(so_id);
180348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader() call failed.");
180448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
180548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.getShaderiv(so_id, GL_COMPILE_STATUS, &compile_status);
180648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv() call failed.");
180748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
180848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (compile_status == GL_FALSE)
180948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
181048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				TCU_FAIL("Shader compilation failed.");
181148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
181248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
181348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.attachShader(m_po_id, so_id);
181448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader() call failed.");
181548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		} /* if (so_id != 0) */
181648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}	 /* for (all shader objects) */
181748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
181848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Link the program object */
181948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint link_status = GL_FALSE;
182048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
182148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.linkProgram(m_po_id);
182248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram() call failed.");
182348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
182448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.getProgramiv(m_po_id, GL_LINK_STATUS, &link_status);
182548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv() call failed.");
182648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
182748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (link_status == GL_FALSE)
182848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
182948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Program linking failed.");
183048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
183148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
183248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Release the shader objects - we no longer need them */
183348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (cs_id != 0)
183448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
183548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteShader(cs_id);
183648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
183748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
183848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (fs_id != 0)
183948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
184048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteShader(fs_id);
184148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
184248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
184348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (gs_id != 0)
184448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
184548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteShader(gs_id);
184648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
184748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
184848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (tc_id != 0)
184948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
185048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteShader(tc_id);
185148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
185248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
185348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (te_id != 0)
185448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
185548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteShader(te_id);
185648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
185748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
185848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (vs_id != 0)
185948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
186048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteShader(vs_id);
186148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
186248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
186348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteShader() call(s) failed.");
186448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
186548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
186648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Deinitializes all GL objects that were created during test execution.
186748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  Also calls the inheriting object's deinitObjects() method.
186848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
186948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctionalBase::deinit()
187048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
187148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
187248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
187348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_bo_qo_id != 0)
187448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
187548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_bo_qo_id);
187648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
187748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_bo_qo_id = 0;
187848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
187948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
188048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_fbo_id != 0)
188148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
188248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteFramebuffers(1, &m_fbo_id);
188348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
188448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_fbo_id = 0;
188548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
188648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
188748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_po_id != 0)
188848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
188948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteProgram(m_po_id);
189048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
189148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po_id = 0;
189248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
189348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
189448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_qo_id != 0)
189548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
189648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteQueries(1, &m_qo_id);
189748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
189848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_qo_id = 0;
189948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
190048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
190148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_to_id != 0)
190248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
190348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteTextures(1, &m_to_id);
190448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
190548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_to_id = 0;
190648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
190748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
190848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_vao_id != 0)
190948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
191048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteVertexArrays(1, &m_vao_id);
191148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
191248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_vao_id = 0;
191348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
191448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
191548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_vbo_id != 0)
191648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
191748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_vbo_id);
191848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
191948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_vbo_id = 0;
192048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
192148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
192248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	deinitObjects();
192348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
192448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
192548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Dummy method that should be overloaded by inheriting methods.
192648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
192748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  The method can be thought as of a placeholder for code that deinitializes
192848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  test-specific GL objects.
192948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
193048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctionalBase::deinitObjects()
193148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
193248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally - this method should be overloaded by deriving
193348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * classes.
193448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 */
193548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
193648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
193748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Initializes a framebuffer object that can be used by inheriting tests
193848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  for holding rendered data.
193948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
194048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctionalBase::initFBO()
194148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
194248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
194348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
194448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up a framebuffer object */
194548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genFramebuffers(1, &m_fbo_id);
194648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers() call failed.");
194748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
194848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo_id);
194948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer() call failed.");
195048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
195148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up a texture object we will later use as a color attachment for the FBO */
195248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genTextures(1, &m_to_id);
195348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() call failed.");
195448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
195548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(GL_TEXTURE_2D, m_to_id);
195648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() call failed.");
195748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
195848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.texStorage2D(GL_TEXTURE_2D, 1, /* levels */
195948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					GL_RGBA8, m_to_width, m_to_height);
196048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2D() call failed.");
196148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
196248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up the TO as a color attachment */
196348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.framebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_to_id, 0); /* level */
196448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTexture2D() call failed.");
196548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
196648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.viewport(0, 0, m_to_width, m_to_height);
196748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport() call failed.");
196848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
196948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
197048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** A dummy method, which can be thought of as a placeholder to initialize
197148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  test-specific GL objects.
197248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
197348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctionalBase::initObjects()
197448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
197548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally - this method should be overloaded by deriving
197648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * classes.
197748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 */
197848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
197948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
198048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Initializes a vertex array object which is going to be used for the draw calls.
198148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  The initialized VAO's ID is going to be stored under m_vao_id. Zeroth vertex
198248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  array attribute will be configured to use @param n_components_per_vertex components
198348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  and will use vertex buffer object defined by ID stored in m_vbo_id, whose data
198448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  are expected to start at an offset defined by m_vbo_vertex_data_offset.
198548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
198648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_components_per_vertex As per description.
198748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
198848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctionalBase::initVAO(unsigned int n_components_per_vertex)
198948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
199048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
199148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
199248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Release an VAO that's already been created */
199348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_vao_id != 0)
199448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
199548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteVertexArrays(1, &m_vao_id);
199648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
199748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_vao_id = 0;
199848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
199948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
200048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Generate a new one */
200148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genVertexArrays(1, &m_vao_id);
200248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays() call failed.");
200348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
200448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindVertexArray(m_vao_id);
200548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray() call failed.");
200648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
200748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set it up */
200848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.vertexAttribPointer(0,											/* index */
200948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   n_components_per_vertex, GL_FLOAT, GL_FALSE, /* normalized */
201048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   0,											/* stride */
201148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   (glw::GLvoid*)(deUintptr)m_vbo_vertex_data_offset);
201248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer() call failed.");
201348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
201448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.enableVertexAttribArray(0); /* index */
201548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray() call failed.");
201648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
201748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vbo_id);
201848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer() call failed.");
201948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
202048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
202148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Initializes a vertex buffer object and stores its ID under m_vbo_id.
202248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  It is assumed index data is expressed in GL_UNSIGNED_INT.
202348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
202448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  The following fields will be modified by the method:
202548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
202648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  m_vbo_n_indices:                          Will hold the number of indices stored in index
202748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                            data buffer.
202848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  m_vbo_vertex_data_offset:                 Will hold the offset, from which the vertex
202948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                            data will be stored in VBO.
203048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  m_vbo_index_data_offset:                  Will hold the offset, from which the index
203148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                            data will be stored in VBO.
203248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  m_vbo_indirect_arrays_argument_offset:    Will hold the offset, from which
203348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                            glDrawArraysIndirect() arguments will be
203448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                            stored in VBO.
203548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  m_vbo_indirect_elements_argument_offset:  Will hold the offset, from which
203648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                            glDrawElementsIndirect() arguments will be
203748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                            stored in VBO.
203848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  m_indirect_draw_call_firstindex_argument: Will be updated to point to the location, from
203948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                            which index data starts.
204048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
204148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param raw_vertex_data                        Pointer to a buffer that holds vertex data
204248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                                which should be used when constructing the VBO.
204348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                                Must not be NULL.
204448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param raw_vertex_data_size                   Number of bytes available for reading under
204548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                                @param raw_vertex_data.
204648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param raw_index_data                         Pointer to a buffer that holds index data
204748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                                which should be used when constructing the VBO.
204848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                                Must not be NULL.
204948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param raw_index_data_size                    Number of bytes available for reading under
205048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                                @param raw_index_data .
205148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param indirect_draw_bo_count_argument        Argument to be used for indirect draw calls'
205248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                                "count" argument.
205348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param indirect_draw_bo_primcount_argument    Argument to be used for indirect draw calls'
205448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                                "primcount" argument.
205548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param indirect_draw_bo_baseinstance_argument Argument to be used for indirect draw calls'
205648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                                "baseinstance" argument.
205748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param indirect_draw_bo_first_argument        Argument to be used for indirect draw calls'
205848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                                "first" argument.
205948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param indirect_draw_bo_basevertex_argument   Argument to be used for indirect draw calls'
206048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                                "basevertex" argument.
206148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
206248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
206348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctionalBase::initVBO(
206448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const float* raw_vertex_data, unsigned int raw_vertex_data_size, const unsigned int* raw_index_data,
206548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int raw_index_data_size, unsigned int indirect_draw_bo_count_argument,
206648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int indirect_draw_bo_primcount_argument, unsigned int indirect_draw_bo_baseinstance_argument,
206748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int indirect_draw_bo_first_argument, unsigned int indirect_draw_bo_basevertex_argument)
206848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
206948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
207048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
207148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* If we already have initialized a VBO, delete it before we continue */
207248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_vbo_id != 0)
207348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
207448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_vbo_id);
207548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
207648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_vbo_id = 0;
207748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
207848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
207948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Our BO storage is formed as below:
208048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 *
208148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * [raw vertex data]
208248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * [raw index data]
208348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * [indirect glDrawArrays() call arguments]
208448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * [indirect glDrawElements() call arguments]
208548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 *
208648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * We store the relevant offsets in member fields, so that they can be used by actual test
208748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * implementation.
208848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 */
208948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int indirect_arrays_draw_call_arguments_size   = sizeof(unsigned int) * 4; /* as per spec */
209048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int indirect_elements_draw_call_arguments_size = sizeof(unsigned int) * 5; /* as per spec */
209148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
209248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_vbo_n_indices						  = sizeof(raw_index_data_size) / sizeof(unsigned int);
209348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_vbo_vertex_data_offset			  = 0;
209448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_vbo_index_data_offset				  = raw_vertex_data_size;
209548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_vbo_indirect_arrays_argument_offset = m_vbo_index_data_offset + raw_index_data_size;
209648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_vbo_indirect_elements_argument_offset =
209748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_vbo_indirect_arrays_argument_offset + indirect_arrays_draw_call_arguments_size;
209848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
209948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up 'firstindex' argument so that it points at correct index data location */
210048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT((m_vbo_index_data_offset % sizeof(unsigned int)) == 0);
210148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
210248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_firstindex_argument =
210348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		static_cast<unsigned int>(m_vbo_index_data_offset / sizeof(unsigned int));
210448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
210548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Form indirect draw call argument buffers */
210648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int arrays_draw_call_arguments[] = { indirect_draw_bo_count_argument, indirect_draw_bo_primcount_argument,
210748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												  indirect_draw_bo_first_argument,
210848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												  indirect_draw_bo_baseinstance_argument };
210948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int elements_draw_call_arguments[] = {
211048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		indirect_draw_bo_count_argument, indirect_draw_bo_primcount_argument, m_indirect_draw_call_firstindex_argument,
211148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		indirect_draw_bo_basevertex_argument, indirect_draw_bo_baseinstance_argument
211248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
211348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
211448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up BO storage */
211548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int bo_data_size =
211648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_vbo_indirect_elements_argument_offset + indirect_elements_draw_call_arguments_size;
211748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
211848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genBuffers(1, &m_vbo_id);
211948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers() call failed.");
212048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
212148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindBuffer(GL_ARRAY_BUFFER, m_vbo_id);
212248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindBuffer(GL_DRAW_INDIRECT_BUFFER, m_vbo_id);
212348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vbo_id);
212448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer() call(s) failed.");
212548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
212648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bufferData(GL_ARRAY_BUFFER, bo_data_size, DE_NULL, /* data */
212748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				  GL_STATIC_DRAW);
212848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() call failed.");
212948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
213048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bufferSubData(GL_ARRAY_BUFFER, m_vbo_vertex_data_offset, raw_vertex_data_size, raw_vertex_data);
213148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bufferSubData(GL_ARRAY_BUFFER, m_vbo_index_data_offset, raw_index_data_size, raw_index_data);
213248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bufferSubData(GL_ARRAY_BUFFER, m_vbo_indirect_arrays_argument_offset, sizeof(arrays_draw_call_arguments),
213348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 arrays_draw_call_arguments);
213448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bufferSubData(GL_ARRAY_BUFFER, m_vbo_indirect_elements_argument_offset, sizeof(elements_draw_call_arguments),
213548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 elements_draw_call_arguments);
213648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferSubData() call failed.");
213748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
213848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
213948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Performs the actual test.
214048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
214148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Always STOP.
214248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
214348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult PipelineStatisticsQueryTestFunctionalBase::iterate()
214448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
214548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool has_passed = true;
21465e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	glu::ContextType contextType = m_context.getRenderContext().getType();
214748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
214848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Carry on only if GL_ARB_pipeline_statistics_query extension is supported */
21495e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	if (!glu::contextSupports(contextType, glu::ApiType::core(4, 6)) &&
21505e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski		!m_context.getContextInfo().isExtensionSupported("GL_ARB_pipeline_statistics_query"))
215148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
215248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw tcu::NotSupportedError("GL_ARB_pipeline_statistics_query extension is not supported");
215348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
215448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
215548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Initialize QO BO storage if GL_ARB_query_buffer_object is supported */
215648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_context.getContextInfo().isExtensionSupported("GL_ARB_query_buffer_object"))
215748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
215848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		initQOBO();
215948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
216048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		DE_ASSERT(m_bo_qo_id != 0);
216148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
216248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
216348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Initialize other test-specific objects */
216448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	initObjects();
216548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
216648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Iterate through all pipeline statistics query object types */
216748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
216848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
216948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_query_target = 0; n_query_target < PipelineStatisticsQueryUtilities::n_query_targets;
217048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 ++n_query_target)
217148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
217248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLenum current_query_target = PipelineStatisticsQueryUtilities::query_targets[n_query_target];
217348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
217448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (shouldExecuteForQueryTarget(current_query_target))
217548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
217648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Initialize the query object */
217748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.genQueries(1, &m_qo_id);
217848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glGenQueries() call failed.");
217948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
218048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Execute the test for the particular query target. */
218148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			has_passed &= executeTest(current_query_target);
218248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
218348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Delete the query object */
218448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.deleteQueries(1, &m_qo_id);
218548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteQueries() call failed.");
218648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
218748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_qo_id = 0;
218848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
218948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* for (all query targets) */
219048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
219148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (has_passed)
219248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
219348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
219448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
219548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
219648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
219748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
219848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
219948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
220048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return STOP;
220148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
220248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
220348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Initializes a query buffer object. */
220448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctionalBase::initQOBO()
220548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
220648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions gl = m_context.getRenderContext().getFunctions();
220748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
220848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up the buffer object we will use for storage of query object results */
220948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned char bo_data[PipelineStatisticsQueryUtilities::qo_bo_size];
221048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
221148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	memset(bo_data, 0xFF, sizeof(bo_data));
221248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
221348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genBuffers(1, &m_bo_qo_id);
221448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers() call failed.");
221548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
221648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindBuffer(GL_ARRAY_BUFFER, m_bo_qo_id);
221748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer() call failed.");
221848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
221948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bufferData(GL_ARRAY_BUFFER, PipelineStatisticsQueryUtilities::qo_bo_size, bo_data, GL_STATIC_DRAW);
222048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() call failed.");
222148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
222248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
222348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Executes a draw call, whose type is specified under pThis->m_current_draw_call_type.
222448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
222548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pThis Pointer to a PipelineStatisticsQueryTestFunctionalBase instance, which
222648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               should be used to extract the draw call type.
222748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
222848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Always true.
222948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
223048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctionalBase::queryCallbackDrawCallHandler(void* pThis)
223148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
223248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctionalBase* pInstance = (PipelineStatisticsQueryTestFunctionalBase*)pThis;
223348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					   gl		 = pInstance->m_context.getRenderContext().getFunctions();
223448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
223548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Issue the draw call */
223648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLenum primitive_type =
223748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		PipelineStatisticsQueryUtilities::getEnumForPrimitiveType(pInstance->m_current_primitive_type);
223848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
223948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (pInstance->m_current_draw_call_type)
224048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
224148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWARRAYS:
224248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
224348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.drawArrays(primitive_type, pInstance->m_indirect_draw_call_first_argument,
224448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  pInstance->m_indirect_draw_call_count_argument);
224548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
224648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() call failed.");
224748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
224848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
224948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
225048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
225148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWARRAYSINDIRECT:
225248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
225348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.drawArraysIndirect(primitive_type,
225448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  (const glw::GLvoid*)(deUintptr)pInstance->m_vbo_indirect_arrays_argument_offset);
225548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
225648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArraysIndirect() call failed.");
225748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
225848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
225948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
226048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
226148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWARRAYSINSTANCED:
226248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
226348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.drawArraysInstanced(primitive_type, pInstance->m_indirect_draw_call_first_argument,
226448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   pInstance->m_indirect_draw_call_count_argument,
226548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   pInstance->m_indirect_draw_call_primcount_argument);
226648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
226748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArraysInstanced() call failed.");
226848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
226948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
227048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
227148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
227248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWARRAYSINSTANCEDBASEINSTANCE:
227348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
227448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.drawArraysInstancedBaseInstance(primitive_type, pInstance->m_indirect_draw_call_first_argument,
227548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   pInstance->m_indirect_draw_call_count_argument,
227648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   pInstance->m_indirect_draw_call_primcount_argument,
227748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   pInstance->m_indirect_draw_call_baseinstance_argument);
227848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
227948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
228048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
228148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
228248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWELEMENTS:
228348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
228448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.drawElements(primitive_type, pInstance->m_indirect_draw_call_count_argument, GL_UNSIGNED_INT,
228548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						(glw::GLvoid*)(deUintptr)pInstance->m_vbo_index_data_offset);
228648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
228748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawElements() call failed.");
228848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
228948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
229048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
229148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
229248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWELEMENTSBASEVERTEX:
229348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
229448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.drawElementsBaseVertex(primitive_type, pInstance->m_indirect_draw_call_count_argument, GL_UNSIGNED_INT,
229548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  (glw::GLvoid*)(deUintptr)pInstance->m_vbo_index_data_offset,
229648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  pInstance->m_indirect_draw_call_basevertex_argument);
229748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
229848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawElementsBaseVertex() call failed.");
229948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
230048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
230148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
230248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
230348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWELEMENTSINDIRECT:
230448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
230548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.drawElementsIndirect(primitive_type, GL_UNSIGNED_INT,
230648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								(glw::GLvoid*)(deUintptr)pInstance->m_vbo_indirect_elements_argument_offset);
230748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
230848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawElementsIndirect() call failed.");
230948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
231048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
231148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
231248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
231348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCED:
231448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
231548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.drawElementsInstanced(primitive_type, pInstance->m_indirect_draw_call_count_argument, GL_UNSIGNED_INT,
231648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 (glw::GLvoid*)(deUintptr)pInstance->m_vbo_index_data_offset,
231748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 pInstance->m_indirect_draw_call_primcount_argument);
231848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
231948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawElementsInstanced() call failed.");
232048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
232148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
232248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
232348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
232448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCEDBASEINSTANCE:
232548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
232648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.drawElementsInstancedBaseInstance(
232748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			primitive_type, pInstance->m_indirect_draw_call_count_argument, GL_UNSIGNED_INT,
232848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			(glw::GLvoid*)(deUintptr)pInstance->m_vbo_index_data_offset,
232948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			pInstance->m_indirect_draw_call_primcount_argument, pInstance->m_indirect_draw_call_baseinstance_argument);
233048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
233148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawElementsInstancedBaseInstance() call failed.");
233248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
233348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
233448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
233548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
233648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCE:
233748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
233848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.drawElementsInstancedBaseVertexBaseInstance(
233948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			primitive_type, pInstance->m_indirect_draw_call_count_argument, GL_UNSIGNED_INT,
234048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			(glw::GLvoid*)(deUintptr)pInstance->m_vbo_index_data_offset,
234148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			pInstance->m_indirect_draw_call_primcount_argument, pInstance->m_indirect_draw_call_basevertex_argument,
234248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			pInstance->m_indirect_draw_call_baseinstance_argument);
234348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
234448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawElementsInstancedBaseVertexBaseInstance() call failed.");
234548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
234648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
234748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
234848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
234948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWRANGEELEMENTS:
235048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
235148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.drawRangeElements(primitive_type, 0, /* start */
235248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							 pInstance->m_vbo_n_indices, pInstance->m_indirect_draw_call_count_argument,
235348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							 GL_UNSIGNED_INT, (glw::GLvoid*)(deUintptr)pInstance->m_vbo_index_data_offset);
235448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
235548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawRangeElements() call failed.");
235648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
235748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
235848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
235948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
236048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWRANGEELEMENTSBASEVERTEX:
236148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
236248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.drawRangeElementsBaseVertex(primitive_type, 0,								   /* start */
236348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   pInstance->m_indirect_draw_call_count_argument - 1, /* end */
236448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   pInstance->m_indirect_draw_call_count_argument, GL_UNSIGNED_INT,
236548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   (glw::GLvoid*)(deUintptr)pInstance->m_vbo_index_data_offset,
236648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   pInstance->m_indirect_draw_call_basevertex_argument);
236748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
236848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawRangeElementsBaseVertex() call failed.");
236948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
237048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
237148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
237248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
237348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
237448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
237548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Unrecognized draw call type");
237648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
237748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* switch (m_current_draw_call_type) */
237848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
237948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
238048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
238148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
238248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether the test instance should be executed for user-specified query target.
238348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  Base class implementation returns true for all values of @param query_target.
238448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
238548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param query_target Query target to be used for the call.
238648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
238748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Always true.
238848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
238948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctionalBase::shouldExecuteForQueryTarget(glw::GLenum query_target)
239048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
239148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	(void)query_target;
239248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
239348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
239448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
239548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor.
239648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
239748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context Rendering context.
239848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
239948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosPipelineStatisticsQueryTestFunctional1::PipelineStatisticsQueryTestFunctional1(deqp::Context& context)
240048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: PipelineStatisticsQueryTestFunctionalBase(context, "functional_default_qo_values",
240148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"Verifies that all pipeline statistics query objects "
240248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"use a default value of 0.")
240348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
240448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally */
240548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
240648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
240748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Executes a test iteration for user-specified query target.
240848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
240948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param current_query_target Pipeline statistics query target to execute the iteration
241048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                              for.
241148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
241248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if the test passed for the iteration, false otherwise.
241348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
241448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional1::executeTest(glw::GLenum current_query_target)
241548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
241648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool													 result = true;
241748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryUtilities::_test_execution_result run_result;
241848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
241948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!PipelineStatisticsQueryUtilities::executeQuery(
242048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			current_query_target, m_qo_id, m_bo_qo_id, DE_NULL, /* pfn_draw */
242148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			DE_NULL,											/* draw_user_arg */
242248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getRenderContext(), m_testCtx, m_context.getContextInfo(), &run_result))
242348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
242448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.getLog() << tcu::TestLog::Message << "Could not retrieve test run results for query target "
242548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													   "["
242648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << PipelineStatisticsQueryUtilities::getStringForEnum(current_query_target) << "]"
242748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << tcu::TestLog::EndMessage;
242848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
242948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = false;
243048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
243148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
243248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
243348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const glw::GLuint64 expected_value = 0;
243448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
243548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result &= PipelineStatisticsQueryUtilities::verifyResultValues(
243648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			run_result, 1, &expected_value, m_qo_id != 0, /* should_check_qo_bo_values */
2437e268f0b8bf774d6eff28fcc63d22b6f6055333f4Gustaw Smolarczyk			current_query_target, DE_NULL, DE_NULL,
243848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			false, /* is_primitive_restart_enabled */
243948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx, PipelineStatisticsQueryUtilities::VERIFICATION_TYPE_EXACT_MATCH);
244048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* if (run results were obtained successfully) */
244148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
244248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
244348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
244448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
244548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor.
244648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
244748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context Rendering context
244848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
244948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosPipelineStatisticsQueryTestFunctional2::PipelineStatisticsQueryTestFunctional2(deqp::Context& context)
245048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: PipelineStatisticsQueryTestFunctionalBase(context, "functional_non_rendering_commands_do_not_affect_queries",
245148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"Verifies that non-rendering commands do not affect query"
245248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												" values.")
245348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_bo_id(0)
245448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_fbo_draw_id(0)
245548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_fbo_read_id(0)
245648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_to_draw_fbo_id(0)
245748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_to_read_fbo_id(0)
245848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_to_height(16)
245948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_to_width(16)
246048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
246148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally */
246248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
246348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
246448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Deinitializes all GL objects that were created during test execution. */
246548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional2::deinitObjects()
246648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
246748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
246848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
246948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_bo_id != 0)
247048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
247148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_bo_id);
247248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
247348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_bo_id = 0;
247448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
247548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
247648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_fbo_draw_id != 0)
247748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
247848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteFramebuffers(1, &m_fbo_draw_id);
247948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
248048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_fbo_draw_id = 0;
248148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
248248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
248348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_fbo_read_id != 0)
248448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
248548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteFramebuffers(1, &m_fbo_read_id);
248648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
248748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_fbo_read_id = 0;
248848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
248948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
249048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_to_draw_fbo_id != 0)
249148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
249248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteTextures(1, &m_to_draw_fbo_id);
249348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
249448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_to_draw_fbo_id = 0;
249548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
249648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
249748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_to_read_fbo_id != 0)
249848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
249948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteTextures(1, &m_to_read_fbo_id);
250048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
250148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_to_read_fbo_id = 0;
250248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
250348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
250448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
250548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Callback handler which calls glBlitFramebuffer() API function and makes sure it
250648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  was executed successfully.
250748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
250848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pThis Pointer to a PipelineStatisticsQueryTestFunctional2 instance. Must not
250948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               be NULL.
251048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
251148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Always true.
251248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
251348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional2::executeBlitFramebufferTest(void* pThis)
251448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
251548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctional2* data_ptr = (PipelineStatisticsQueryTestFunctional2*)pThis;
251648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					gl		 = data_ptr->m_context.getRenderContext().getFunctions();
251748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
251848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Framebuffer objects are bound to their FB targets at this point */
251948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.blitFramebuffer(0,						   /* srcX0 */
252048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					   0,						   /* srcY0 */
252148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					   data_ptr->m_to_width,	   /* srcX1 */
252248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					   data_ptr->m_to_height,	  /* srcY1 */
252348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					   0,						   /* dstX0 */
252448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					   0,						   /* dstY0 */
252548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					   data_ptr->m_to_width << 1,  /* dstX1 */
252648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					   data_ptr->m_to_height << 1, /* dstY1 */
252748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					   GL_COLOR_BUFFER_BIT,		   /* mask */
252848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					   GL_LINEAR);				   /* filter */
252948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
253048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBlitFramebuffer() call failed.");
253148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
253248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
253348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
253448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
253548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Callback handler which calls glBufferSubData() API function and makes sure it
253648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  was executed successfully.
253748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
253848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pThis Pointer to a PipelineStatisticsQueryTestFunctional2 instance. Must not
253948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               be NULL.
254048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
254148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Always true.
254248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
254348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional2::executeBufferSubDataTest(void* pThis)
254448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
254548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctional2* data_ptr	   = (PipelineStatisticsQueryTestFunctional2*)pThis;
254648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					gl			   = data_ptr->m_context.getRenderContext().getFunctions();
254748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int						test_data_size = (PipelineStatisticsQueryTestFunctional2::bo_size / 2);
254848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned char							test_bo_data[test_data_size];
254948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
255048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	memset(test_bo_data, 0xFF, test_data_size);
255148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
255248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindBuffer(GL_ARRAY_BUFFER, data_ptr->m_bo_id);
255348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer() call failed.");
255448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
255548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bufferSubData(GL_ARRAY_BUFFER, 0, /* offset */
255648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 test_data_size, test_bo_data);
255748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferSubData() call failed.");
255848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
255948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
256048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
256148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
256248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Callback handler which calls glClearBufferfv() API function and makes sure it
256348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  was executed successfully.
256448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
256548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pThis Pointer to a PipelineStatisticsQueryTestFunctional2 instance. Must not
256648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               be NULL.
256748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
256848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Always true.
256948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
257048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional2::executeClearBufferfvColorBufferTest(void* pThis)
257148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
257248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::GLfloat						clear_color[4] = { 0, 0.1f, 0.2f, 0.3f };
257348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctional2* data_ptr	   = (PipelineStatisticsQueryTestFunctional2*)pThis;
257448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					gl			   = data_ptr->m_context.getRenderContext().getFunctions();
257548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
257648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.clearBufferfv(GL_COLOR, 0, /* drawbuffer */
257748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 clear_color);
257848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glClearBufferfv() call failed.");
257948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
258048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
258148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
258248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
258348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Callback handler which calls glClearBufferfv() API function and makes sure it
258448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  was executed successfully.
258548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
258648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pThis Pointer to a PipelineStatisticsQueryTestFunctional2 instance. Must not
258748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               be NULL.
258848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
258948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Always true.
259048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
259148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional2::executeClearBufferfvDepthBufferTest(void* pThis)
259248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
259348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::GLfloat						clear_depth = 0.1f;
259448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctional2* data_ptr	= (PipelineStatisticsQueryTestFunctional2*)pThis;
259548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					gl			= data_ptr->m_context.getRenderContext().getFunctions();
259648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
259748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.clearBufferfv(GL_DEPTH, 0, /* drawbuffer */
259848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 &clear_depth);
259948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glClearBufferfv() call failed.");
260048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
260148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
260248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
260348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
260448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Callback handler which calls glClearBufferiv() API function and makes sure it
260548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  was executed successfully.
260648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
260748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pThis Pointer to a PipelineStatisticsQueryTestFunctional2 instance. Must not
260848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               be NULL.
260948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
261048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Always true.
261148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
261248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional2::executeClearBufferivStencilBufferTest(void* pThis)
261348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
261448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::GLint						clear_stencil = 123;
261548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctional2* data_ptr	  = (PipelineStatisticsQueryTestFunctional2*)pThis;
261648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					gl			  = data_ptr->m_context.getRenderContext().getFunctions();
261748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
261848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.clearBufferiv(GL_STENCIL, 0, /* drawbuffer */
261948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 &clear_stencil);
262048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glClearBufferfv() call failed.");
262148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
262248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
262348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
262448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
262548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Callback handler which calls glClearBufferSubData() API function and makes sure it
262648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  was executed successfully.
262748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
262848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pThis Pointer to a PipelineStatisticsQueryTestFunctional2 instance. Must not
262948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               be NULL.
263048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
263148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if glClearBufferSubData() is available, false otherwise.
263248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
263348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional2::executeClearBufferSubDataTest(void* pThis)
263448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
263548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctional2* data_ptr = (PipelineStatisticsQueryTestFunctional2*)pThis;
263648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					gl		 = data_ptr->m_context.getRenderContext().getFunctions();
263748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool									result   = true;
263848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
263948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!glu::contextSupports(data_ptr->m_context.getRenderContext().getType(), glu::ApiType::core(4, 3)) &&
264048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.clearBufferSubData == NULL)
264148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
264248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* API is unavailable */
264348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false;
264448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
264548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
264648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Execute the API call */
264748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned char value = 0xFF;
264848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
264948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.clearBufferSubData(GL_ARRAY_BUFFER, GL_R8, 0, /* offset */
265048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  data_ptr->bo_size, GL_RED, GL_UNSIGNED_BYTE, &value);
265148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glClearBufferSubData() call failed.");
265248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
265348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All done */
265448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
265548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
265648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
265748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Callback handler which calls glClear() API function configured to clear color
265848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  buffer and makes sure it was executed successfully.
265948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
266048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pThis Pointer to a PipelineStatisticsQueryTestFunctional2 instance. Must not
266148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               be NULL.
266248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
266348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Always true.
266448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
266548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional2::executeClearColorBufferTest(void* pThis)
266648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
266748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctional2* data_ptr = (PipelineStatisticsQueryTestFunctional2*)pThis;
266848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					gl		 = data_ptr->m_context.getRenderContext().getFunctions();
266948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
267048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.clear(GL_COLOR_BUFFER_BIT);
267148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glClear() call failed.");
267248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
267348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
267448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
267548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
267648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Callback handler which calls glClear() API function configured to clear depth
267748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  buffer and makes sure it was executed successfully.
267848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
267948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pThis Pointer to a PipelineStatisticsQueryTestFunctional2 instance. Must not
268048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               be NULL.
268148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
268248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Always true.
268348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
268448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional2::executeClearDepthBufferTest(void* pThis)
268548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
268648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctional2* data_ptr = (PipelineStatisticsQueryTestFunctional2*)pThis;
268748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					gl		 = data_ptr->m_context.getRenderContext().getFunctions();
268848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
268948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.clear(GL_DEPTH_BUFFER_BIT);
269048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glClear() call failed.");
269148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
269248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
269348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
269448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
269548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Callback handler which calls glClear() API function configured to clear stencil
269648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  buffer and makes sure it was executed successfully.
269748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
269848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pThis Pointer to a PipelineStatisticsQueryTestFunctional2 instance. Must not
269948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               be NULL.
270048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
270148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Always true.
270248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
270348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional2::executeClearStencilBufferTest(void* pThis)
270448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
270548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctional2* data_ptr = (PipelineStatisticsQueryTestFunctional2*)pThis;
270648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					gl		 = data_ptr->m_context.getRenderContext().getFunctions();
270748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
270848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.clear(GL_STENCIL_BUFFER_BIT);
270948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glClear() call failed.");
271048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
271148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
271248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
271348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
271448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Callback handler which calls glClearTexSubImage() API function (if available).
271548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
271648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pThis Pointer to a PipelineStatisticsQueryTestFunctional2 instance. Must not
271748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               be NULL.
271848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
271948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if the function is supported by the running GL implementation, false
272048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               otherwise.
272148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
272248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional2::executeClearTexSubImageTest(void* pThis)
272348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
272448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctional2* data_ptr = (PipelineStatisticsQueryTestFunctional2*)pThis;
272548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					gl		 = data_ptr->m_context.getRenderContext().getFunctions();
272648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool									result   = true;
272748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
272848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!glu::contextSupports(data_ptr->m_context.getRenderContext().getType(), glu::ApiType::core(4, 4)) &&
272948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.clearTexSubImage == NULL)
273048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
273148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* API is unavailable */
273248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false;
273348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
273448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
273548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Execute the API call */
273648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned char test_value = 0xFF;
273748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
273848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.clearTexSubImage(data_ptr->m_to_draw_fbo_id, 0,							/* level */
273948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0,														/* xoffset */
274048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0,														/* yoffset */
274148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0,														/* zoffset */
274248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						data_ptr->m_to_width / 2, data_ptr->m_to_height / 2, 1, /* depth */
274348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						GL_RED, GL_UNSIGNED_BYTE, &test_value);
274448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glClearTexSubImage() call failed.");
274548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
274648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All done */
274748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
274848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
274948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
275048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Callback handler which calls glCopyImageSubData() API function (if available).
275148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
275248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pThis Pointer to a PipelineStatisticsQueryTestFunctional2 instance. Must not
275348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               be NULL.
275448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
275548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if the function is supported by the running GL implementation, false
275648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               otherwise.
275748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
275848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional2::executeCopyImageSubDataTest(void* pThis)
275948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
276048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctional2* data_ptr = (PipelineStatisticsQueryTestFunctional2*)pThis;
276148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					gl		 = data_ptr->m_context.getRenderContext().getFunctions();
276248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool									result   = true;
276348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
276448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!glu::contextSupports(data_ptr->m_context.getRenderContext().getType(), glu::ApiType::core(4, 3)) &&
276548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.copyImageSubData == NULL)
276648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
276748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* API is unavailable */
276848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false;
276948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
277048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
277148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Execute the API call */
277248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.copyImageSubData(data_ptr->m_to_draw_fbo_id, GL_TEXTURE_2D, 0,			 /* srcLevel */
277348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0,														 /* srcX */
277448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0,														 /* srcY */
277548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0,														 /* srcZ */
277648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						data_ptr->m_to_read_fbo_id, GL_TEXTURE_2D, 0,			 /* dstLevel */
277748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0,														 /* dstX */
277848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0,														 /* dstY */
277948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0,														 /* dstZ */
278048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						data_ptr->m_to_width / 2, data_ptr->m_to_height / 2, 1); /* src_depth */
278148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glCopyImageSubData() call failed.");
278248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
278348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All done */
278448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
278548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
278648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
278748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Callback handler which calls glTexSubImage2D().
278848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
278948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pThis Pointer to a PipelineStatisticsQueryTestFunctional2 instance. Must not
279048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *               be NULL.
279148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
279248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true Always true.
279348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
279448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional2::executeTexSubImageTest(void* pThis)
279548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
279648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctional2* data_ptr	   = (PipelineStatisticsQueryTestFunctional2*)pThis;
279748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					gl			   = data_ptr->m_context.getRenderContext().getFunctions();
279848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int						test_data_size = PipelineStatisticsQueryTestFunctional2::bo_size / 2;
279948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned char							test_data[test_data_size];
280048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
280148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	memset(test_data, 0xFF, test_data_size);
280248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
280348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.texSubImage2D(GL_TEXTURE_2D, 0, /* level */
280448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 0,				   /* xoffset */
280548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 0,				   /* yoffset */
280648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 data_ptr->m_to_width / 2, data_ptr->m_to_height / 2, GL_RED, GL_UNSIGNED_BYTE, test_data);
280748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexSubImage2D() call failed.");
280848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
280948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
281048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
281148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
281248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Executes a test iteration for user-specified query target.
281348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
281448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param current_query_target Pipeline statistics query target to execute the iteration
281548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                              for.
281648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
281748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if the test passed for the iteration, false otherwise.
281848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
281948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional2::executeTest(glw::GLenum current_query_target)
282048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
282148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool															result = true;
282248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryUtilities::_test_execution_result		run_result;
282348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const PipelineStatisticsQueryUtilities::PFNQUERYDRAWHANDLERPROC query_draw_handlers[] = {
282448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		executeBlitFramebufferTest,
282548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		executeBufferSubDataTest,
282648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		executeClearBufferfvColorBufferTest,
282748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		executeClearBufferfvDepthBufferTest,
282848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		executeClearBufferivStencilBufferTest,
282948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		executeClearBufferSubDataTest,
283048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		executeClearColorBufferTest,
283148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		executeClearDepthBufferTest,
283248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		executeClearStencilBufferTest,
283348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		executeClearTexSubImageTest,
283448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		executeCopyImageSubDataTest,
283548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		executeTexSubImageTest,
283648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
283748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int n_query_draw_handlers = sizeof(query_draw_handlers) / sizeof(query_draw_handlers[0]);
283848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
283948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n = 0; n < n_query_draw_handlers; ++n)
284048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
284148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const PipelineStatisticsQueryUtilities::PFNQUERYDRAWHANDLERPROC& draw_handler_pfn = query_draw_handlers[n];
284248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
284348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Query executors can return false if a given test cannot be executed, given
284448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 * work environment constraint (eg. insufficient GL version). In case of an error,
284548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 * they will throw an exception.
284648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
284748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (draw_handler_pfn(this))
284848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
284948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!PipelineStatisticsQueryUtilities::executeQuery(
285048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					current_query_target, m_qo_id, m_bo_qo_id, DE_NULL, /* pfn_draw */
285148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					DE_NULL,											/* draw_user_arg */
285248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_context.getRenderContext(), m_testCtx, m_context.getContextInfo(), &run_result))
285348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
285448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_testCtx.getLog() << tcu::TestLog::Message << "Query execution failed for query target "
285548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															   "["
285648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   << PipelineStatisticsQueryUtilities::getStringForEnum(current_query_target) << "]"
285748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   << tcu::TestLog::EndMessage;
285848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
285948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				result = false;
286048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
286148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			else
286248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
286348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				const glw::GLuint64 expected_value = 0;
286448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				bool				has_passed	 = true;
286548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
286648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				has_passed = PipelineStatisticsQueryUtilities::verifyResultValues(
286748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					run_result, 1, &expected_value, m_qo_id != 0,  /* should_check_qo_bo_values */
286848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					current_query_target, DE_NULL, DE_NULL, false, /* is_primitive_restart_enabled */
286948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_testCtx, PipelineStatisticsQueryUtilities::VERIFICATION_TYPE_EXACT_MATCH);
287048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
287148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (!has_passed)
287248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
287348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_testCtx.getLog() << tcu::TestLog::Message << "Test failed for iteration index [" << n << "]."
287448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   << tcu::TestLog::EndMessage;
287548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
287648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					result = false;
287748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
287848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			} /* if (run results were obtained successfully) */
287948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}	 /* if (draw handler executed successfully) */
288048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
288148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
288248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
288348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
288448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
288548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Initializes all GL objects used by the test */
288648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional2::initObjects()
288748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
288848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
288948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
289048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up a buffer object we will use for one of the tests */
289148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genBuffers(1, &m_bo_id);
289248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers() call failed.");
289348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
289448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindBuffer(GL_ARRAY_BUFFER, m_bo_id);
289548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer() call(s) failed.");
289648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
289748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bufferData(GL_ARRAY_BUFFER, bo_size, DE_NULL, /* data */
289848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				  GL_STATIC_DRAW);
289948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() call failed.");
290048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
290148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up texture objects we will  use as color attachments for test FBOs */
290248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genTextures(1, &m_to_draw_fbo_id);
290348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genTextures(1, &m_to_read_fbo_id);
290448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() call(s) failed");
290548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
290648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(GL_TEXTURE_2D, m_to_draw_fbo_id);
290748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() call failed.");
290848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
290948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.texStorage2D(GL_TEXTURE_2D, 1, /* levels */
291048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					GL_RGBA8, m_to_width, m_to_height);
291148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2D() call failed.");
291248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
291348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(GL_TEXTURE_2D, m_to_read_fbo_id);
291448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() call failed.");
291548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
291648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.texStorage2D(GL_TEXTURE_2D, 1, /* levels */
291748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					GL_RGBA8, m_to_width, m_to_height);
291848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2D() call failed.");
291948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
292048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up framebuffer objects */
292148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genFramebuffers(1, &m_fbo_draw_id);
292248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genFramebuffers(1, &m_fbo_read_id);
292348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers() call(s) failed.");
292448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
292548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo_draw_id);
292648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo_read_id);
292748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer() call(s) failed.");
292848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
292948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.framebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_to_draw_fbo_id, 0); /* level */
293048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.framebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_to_read_fbo_id, 0); /* level */
293148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTexture2D() call(s) failed.");
293248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
293348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
293448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor.
293548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
293648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context Rendering context
293748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
293848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosPipelineStatisticsQueryTestFunctional3::PipelineStatisticsQueryTestFunctional3(deqp::Context& context)
293948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: PipelineStatisticsQueryTestFunctionalBase(
294048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  context, "functional_primitives_vertices_submitted_and_clipping_input_output_primitives",
294148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  "Verifies that GL_PRIMITIVES_SUBMITTED_ARB, GL_VERTICES_SUBMITTED_ARB, "
294248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  "GL_CLIPPING_INPUT_PRIMITIVES_ARB, and GL_CLIPPING_OUTPUT_PRIMITIVES_ARB "
294348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  "queries work correctly.")
294448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_is_primitive_restart_enabled(false)
294548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
294648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally */
294748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
294848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
294948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Deinitializes all GL objects that were created during test execution. */
295048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional3::deinitObjects()
295148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
295248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
295348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
295448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_po_id != 0)
295548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
295648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteProgram(m_po_id);
295748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
295848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po_id = 0;
295948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
296048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
296148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Disable "primitive restart" functionality */
296248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.disable(GL_PRIMITIVE_RESTART);
296348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glDisable() call failed.");
296448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
296548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
296648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Executes a test iteration for user-specified query target.
296748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
296848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param current_query_target Pipeline statistics query target to execute the iteration
296948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                              for.
297048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
297148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if the test passed for the iteration, false otherwise.
297248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
297348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional3::executeTest(glw::GLenum current_query_target)
297448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
297548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&									 gl		= m_context.getRenderContext().getFunctions();
297648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool													 result = true;
297748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryUtilities::_test_execution_result run_result;
297848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
297948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Sanity check: This method should only be called for GL_VERTICES_SUBMITTED_ARB,
298048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * GL_PRIMITIVES_SUBMITTED_ARB, GL_CLIPPING_INPUT_PRIMITIVES_ARB and
298148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * GL_CLIPPING_OUTPUT_PRIMITIVES_ARB queries */
298248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(current_query_target == GL_VERTICES_SUBMITTED_ARB ||
298348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			  current_query_target == GL_PRIMITIVES_SUBMITTED_ARB ||
298448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			  current_query_target == GL_CLIPPING_INPUT_PRIMITIVES_ARB ||
298548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			  current_query_target == GL_CLIPPING_OUTPUT_PRIMITIVES_ARB);
298648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
298748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up VBO. We don't really care much about the visual outcome,
298848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * so any data will do.
298948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 */
299048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int n_vertex_components = 2;
299148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const float		   vertex_data[]	   = { -0.1f, 0.2f, 0.3f,  0.1f,  0.2f,  -0.7f, 0.5f,  -0.5f,
299248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  0.0f,  0.0f, -0.6f, -0.9f, -0.3f, 0.3f,  -0.5f, -0.5f };
299348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int index_data[] = {
299448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		0, 6, 2, 1, 3, 5, 4,
299548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
299648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int n_indices = sizeof(index_data) / sizeof(index_data[0]);
299748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
299848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_baseinstance_argument = 1;
299948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_basevertex_argument   = 0;
300048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_count_argument		   = n_indices;
300148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_first_argument		   = 0;
300248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_primcount_argument	= 3;
300348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
300448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	initVBO(vertex_data, sizeof(vertex_data), index_data, sizeof(index_data), m_indirect_draw_call_count_argument,
300548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_indirect_draw_call_primcount_argument, m_indirect_draw_call_baseinstance_argument,
300648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_indirect_draw_call_first_argument, m_indirect_draw_call_basevertex_argument);
300748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
300848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	initVAO(n_vertex_components);
300948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
301048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Verify that the query works correctly both when primitive restart functionality
301148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * is disabled and enabled */
301248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const bool		   pr_statuses[] = { false, true };
301348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int n_pr_statuses = sizeof(pr_statuses) / sizeof(pr_statuses[0]);
301448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
301548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_pr_status = 0; n_pr_status < n_pr_statuses; ++n_pr_status)
301648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
301748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_is_primitive_restart_enabled = pr_statuses[n_pr_status];
301848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
301948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Primitive restart should never be enabled for GL_CLIPPING_INPUT_PRIMITIVES_ARB query. */
302048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if ((current_query_target == GL_CLIPPING_INPUT_PRIMITIVES_ARB ||
302148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 current_query_target == GL_CLIPPING_OUTPUT_PRIMITIVES_ARB) &&
302248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_is_primitive_restart_enabled)
302348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
302448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
302548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
302648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
302748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Configure 'primitive restart' functionality */
302848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!m_is_primitive_restart_enabled)
302948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
303048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.disable(GL_PRIMITIVE_RESTART);
303148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glDisable() call failed.");
303248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
303348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
303448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
303548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.primitiveRestartIndex(0);
303648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glPrimitiveRestartIndex() call failed.");
303748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
303848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.enable(GL_PRIMITIVE_RESTART);
303948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable() call failed.");
304048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
304148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
304248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Iterate through all primitive types */
304348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (unsigned int n_primitive_type = 0;
304448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 n_primitive_type < PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_COUNT; ++n_primitive_type)
304548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
304648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_current_primitive_type = (PipelineStatisticsQueryUtilities::_primitive_type)n_primitive_type;
304748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
304848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Exclude patches from the test */
304948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (m_current_primitive_type == PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_PATCHES)
305048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
305148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
305248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
305348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
305448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Iterate through all draw call types while the query is enabled (skip DrawArrays calls if primitive restart is enabled) */
305548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (unsigned int n_draw_call_type =
305648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 (m_is_primitive_restart_enabled ? PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_GLDRAWELEMENTS :
305748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													   0);
305848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 n_draw_call_type < PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_COUNT; ++n_draw_call_type)
305948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
306048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_current_draw_call_type = (PipelineStatisticsQueryUtilities::_draw_call_type)n_draw_call_type;
306148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
306248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Only continue if the draw call is supported by the context */
306348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (!PipelineStatisticsQueryUtilities::isDrawCallSupported(m_current_draw_call_type, gl))
306448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
306548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					continue;
306648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
306748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
306848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (!PipelineStatisticsQueryUtilities::executeQuery(
306948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						current_query_target, m_qo_id, m_bo_qo_id, queryCallbackDrawCallHandler,
307048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						(PipelineStatisticsQueryTestFunctionalBase*)this, m_context.getRenderContext(), m_testCtx,
307148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						m_context.getContextInfo(), &run_result))
307248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
307348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_testCtx.getLog() << tcu::TestLog::Message
307448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   << "Could not retrieve test run results for query target "
307548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										  "["
307648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   << PipelineStatisticsQueryUtilities::getStringForEnum(current_query_target)
307748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   << "]" << tcu::TestLog::EndMessage;
307848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
307948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					result = false;
308048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
308148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				else
308248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
308348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					glw::GLuint64										 expected_values[4] = { 0 };
308448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					unsigned int										 n_expected_values  = 0;
308548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					PipelineStatisticsQueryUtilities::_verification_type verification_type =
308648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						PipelineStatisticsQueryUtilities::VERIFICATION_TYPE_EXACT_MATCH;
308748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
308848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					if (current_query_target == GL_CLIPPING_OUTPUT_PRIMITIVES_ARB)
308948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
309048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						verification_type = PipelineStatisticsQueryUtilities::VERIFICATION_TYPE_EQUAL_OR_GREATER;
309148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
309248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
309348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					if (current_query_target == GL_VERTICES_SUBMITTED_ARB)
309448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
309548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						getExpectedVerticesSubmittedQueryResult(m_current_primitive_type, &n_expected_values,
309648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																expected_values);
309748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
309848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					else
309948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
310048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						getExpectedPrimitivesSubmittedQueryResult(m_current_primitive_type, &n_expected_values,
310148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																  expected_values);
310248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
310348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
310448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					result &= PipelineStatisticsQueryUtilities::verifyResultValues(
310548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						run_result, n_expected_values, expected_values, m_qo_id != 0, /* should_check_qo_bo_values */
310648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						current_query_target, &m_current_draw_call_type, &m_current_primitive_type,
310748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						m_is_primitive_restart_enabled, m_testCtx, verification_type);
310848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
310948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				} /* if (run results were obtained successfully) */
311048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}	 /* for (all draw call types) */
311148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}		  /* for (all primitive types) */
311248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}			  /* for (both when primitive restart is disabled and enabled) */
311348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
311448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
311548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
311648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
311748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Returns the expected result value(s) for a GL_PRIMITIVES_SUBMITTED_ARB query. There
311848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  can be either one or two result values, depending on how the implementation handles
311948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  incomplete primitives.
312048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
312148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param current_primitive_type Primitive type used for the draw call, for which
312248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                the query would be executed
312348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param out_result1_written    Deref will be set to true, if the first result value
312448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                was written to @param out_result1. Otherwise, it will
312548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                be set to false.
312648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param out_result1            Deref will be set to the first of the acceptable
312748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                result values, if @param out_result1_written was set
312848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                to true.
312948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param out_result2_written    Deref will be set to true, if the second result value
313048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                was written to @param out_result2. Otherwise, it will
313148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                be set to false.
313248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param out_result2            Deref will be set to the second of the acceptable
313348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                result values, if @param out_result2_written was set
313448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                to true.
313548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
313648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
313748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional3::getExpectedPrimitivesSubmittedQueryResult(
313848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryUtilities::_primitive_type current_primitive_type, unsigned int* out_results_written,
313948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint64 out_results[4])
314048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
314148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int n_input_vertices = m_indirect_draw_call_count_argument;
314248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
314348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	*out_results_written = 0;
314448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
314548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Sanity checks */
314648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(current_primitive_type != PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_PATCHES);
314748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
314848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Carry on */
314948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_is_primitive_restart_enabled)
315048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
315148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Primitive restart functionality in our test removes a single index.
315248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 *
315348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 * Note: This also applies to arrayed draw calls, since we're testing
315448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 *       GL_PRIMITIVE_RESTART rendering mode, and we're using a primitive
315548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 *       restart index of 0.
315648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 **/
315748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		n_input_vertices--;
315848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
315948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
316048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (current_primitive_type)
316148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
316248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_POINTS:
316348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
316448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_results[(*out_results_written)++] = n_input_vertices;
316548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
316648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
316748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
316848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
316948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINE_LOOP:
317048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
317148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_input_vertices > 2)
317248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
317348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[(*out_results_written)++] = n_input_vertices;
317448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
317548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else if (n_input_vertices > 1)
317648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
317748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[(*out_results_written)++] = 1;
317848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
317948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
318048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
318148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[(*out_results_written)++] = 0;
318248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
318348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
318448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
318548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* PRIMITIVE_TYPE_LINE_LOOP */
318648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
318748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLE_FAN:
318848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
318948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_input_vertices > 2)
319048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
319148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[(*out_results_written)++] = n_input_vertices - 2;
319248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
319348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
319448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
319548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[(*out_results_written)++] = 0;
319648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
319748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (n_input_vertices >= 1)
319848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
319948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* If the submitted triangle fan is incomplete, also include the case
320048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 * where the incomplete triangle fan's vertices are counted as a primitive.
320148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 */
320248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				out_results[(*out_results_written)++] = 1;
320348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
320448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
320548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
320648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
320748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
320848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
320948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINE_STRIP:
321048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
321148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_input_vertices > 1)
321248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
321348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[(*out_results_written)++] = n_input_vertices - 1;
321448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
321548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
321648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
321748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[(*out_results_written)++] = 0;
321848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
321948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (n_input_vertices > 0)
322048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
322148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* If the submitted line strip is incomplete, also include the case
322248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 * where the incomplete line's vertices are counted as a primitive.
322348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 */
322448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				out_results[(*out_results_written)++] = 1;
322548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
322648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
322748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
322848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
322948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
323048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
323148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLE_STRIP:
323248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
323348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_input_vertices > 2)
323448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
323548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[(*out_results_written)++] = n_input_vertices - 2;
323648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
323748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
323848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
323948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[(*out_results_written)++] = 0;
324048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
324148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (n_input_vertices >= 1)
324248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
324348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* If the submitted triangle strip is incomplete, also include the case
324448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 * where the incomplete triangle's vertices are counted as a primitive.
324548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 */
324648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				out_results[(*out_results_written)++] = 1;
324748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
324848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
324948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
325048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
325148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
325248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
325348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINES:
325448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
325548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_results[(*out_results_written)++] = n_input_vertices / 2;
325648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
325748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* If the submitted line is incomplete, also include the case where
325848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 * the incomplete line's vertices are counted as a primitive.
325948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
326048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_input_vertices > 0 && (n_input_vertices % 2) != 0)
326148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
326248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[(*out_results_written)++] = n_input_vertices / 2 + 1;
326348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
326448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
326548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
326648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
326748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
326848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINES_ADJACENCY:
326948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
327048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_results[(*out_results_written)++] = n_input_vertices / 4;
327148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
327248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* If the submitted line is incomplete, also include the case where
327348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 * the incomplete line's vertices are counted as a primitive.
327448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
327548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_input_vertices > 0 && (n_input_vertices % 4) != 0)
327648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
327748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[(*out_results_written)++] = n_input_vertices / 4 + 1;
327848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
327948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
328048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
328148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
328248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
328348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLES:
328448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
328548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_results[(*out_results_written)++] = n_input_vertices / 3;
328648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
328748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* If the submitted triangle is incomplete, also include the case
328848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 * when the incomplete triangle's vertices are counted as a primitive.
328948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
329048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_input_vertices > 0 && (n_input_vertices % 3) != 0)
329148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
329248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[(*out_results_written)++] = n_input_vertices / 3 + 1;
329348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
329448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
329548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
329648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
329748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
329848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLES_ADJACENCY:
329948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
330048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_results[(*out_results_written)++] = n_input_vertices / 6;
330148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
330248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* If the submitted triangle is incomplete, also include the case
330348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 * when the incomplete triangle's vertices are counted as a primitive.
330448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
330548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_input_vertices > 0 && (n_input_vertices % 6) != 0)
330648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
330748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[(*out_results_written)++] = n_input_vertices / 6 + 1;
330848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
330948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
331048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
331148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
331248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
331348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
331448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
331548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Unrecognized primitive type");
331648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
331748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* switch (current_primitive_type) */
331848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
331948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (PipelineStatisticsQueryUtilities::isInstancedDrawCall(m_current_draw_call_type))
332048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
332148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (unsigned int i = 0; i < *out_results_written; ++i)
332248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
332348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[i] *= m_indirect_draw_call_primcount_argument;
332448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
332548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* if (instanced draw call type) */
332648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
332748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
332848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Returns the expected result value(s) for a GL_VERTICES_SUBMITTED_ARB query. There
332948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  can be either one or two result values, depending on how the implementation handles
333048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  incomplete primitives.
333148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
333248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param current_primitive_type Primitive type used for the draw call, for which
333348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                the query would be executed
333448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param out_result1_written    Deref will be set to true, if the first result value
333548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                was written to @param out_result1. Otherwise, it will
333648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                be set to false.
333748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param out_result1            Deref will be set to the first of the acceptable
333848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                result values, if @param out_result1_written was set
333948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                to true.
334048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param out_result2_written    Deref will be set to true, if the second result value
334148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                was written to @param out_result2. Otherwise, it will
334248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                be set to false.
334348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param out_result2            Deref will be set to the second of the acceptable
334448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                result values, if @param out_result2_written was set
334548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                                to true.
334648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
334748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
334848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional3::getExpectedVerticesSubmittedQueryResult(
334948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryUtilities::_primitive_type current_primitive_type, unsigned int* out_results_written,
335048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint64 out_results[4])
335148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
335248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int n_input_vertices = m_indirect_draw_call_count_argument;
335348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
335448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	*out_results_written = 0;
335548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
335648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Sanity checks */
335748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(current_primitive_type != PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_PATCHES);
335848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
335948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Carry on */
336048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_is_primitive_restart_enabled)
336148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
336248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Primitive restart functionality in our test removes a single index.
336348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 *
336448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 * Note: This also applies to arrayed draw calls, since we're testing
336548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 *       GL_PRIMITIVE_RESTART rendering mode, and we're using a primitive
336648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 *       restart index of 0.
336748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 **/
336848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		n_input_vertices--;
336948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
337048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
337148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (current_primitive_type)
337248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
337348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_POINTS:
3374da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINE_STRIP:
3375da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLE_FAN:
3376da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLE_STRIP:
337748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
337848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_results[(*out_results_written)++] = n_input_vertices;
337948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
338048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
338148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
338248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
338348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINE_LOOP:
338448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
3385da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		out_results[(*out_results_written)++] = n_input_vertices;
338648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3387da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		/* Allow line loops to count the first vertex twice as that vertex
3388da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		 * is part of both the first and the last primitives.
3389da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		 */
3390da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		out_results[(*out_results_written)++] = n_input_vertices + 1;
339148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
339248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
339348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
339448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINES:
339548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
3396da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		out_results[(*out_results_written)++] = n_input_vertices;
339748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
339848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* If the submitted line is incomplete, also include the case where
3399da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		 * the incomplete line's vertices are not counted.
340048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
340148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_input_vertices > 0 && (n_input_vertices % 2) != 0)
340248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
3403da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle			out_results[(*out_results_written)++] = n_input_vertices - 1;
340448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
340548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
340648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
340748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
340848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
340948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINES_ADJACENCY:
341048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
3411da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		/* Allow implementations to both include or exclude the adjacency
3412da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		 * vertices.
3413da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		 */
3414da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		out_results[(*out_results_written)++] = n_input_vertices;
3415da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		out_results[(*out_results_written)++] = n_input_vertices / 2;
341648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
341748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* If the submitted line is incomplete, also include the case where
3418da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		 * the incomplete line's vertices are not counted.
341948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
342048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_input_vertices > 0 && (n_input_vertices % 4) != 0)
342148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
3422da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle			out_results[(*out_results_written)++] = n_input_vertices - (n_input_vertices % 4);
3423da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle			out_results[(*out_results_written)++] = (n_input_vertices - (n_input_vertices % 4)) / 2;
342448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
342548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
342648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
342748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
342848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
342948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLES:
343048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
3431da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		out_results[(*out_results_written)++] = n_input_vertices;
343248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
343348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* If the submitted triangle is incomplete, also include the case
3434da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		 * when the incomplete triangle's vertices are not counted.
343548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
343648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_input_vertices > 0 && (n_input_vertices % 3) != 0)
343748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
3438da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle			out_results[(*out_results_written)++] = n_input_vertices - (n_input_vertices % 3);
343948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
344048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
344148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
344248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
344348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
344448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLES_ADJACENCY:
344548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
3446da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		/* Allow implementations to both include or exclude the adjacency
3447da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		 * vertices.
3448da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		 */
3449da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		out_results[(*out_results_written)++] = n_input_vertices;
3450da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		out_results[(*out_results_written)++] = n_input_vertices / 2;
345148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
345248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* If the submitted triangle is incomplete, also include the case
3453da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle		 * when the incomplete triangle's vertices are not counted.
345448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
345548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (n_input_vertices > 0 && (n_input_vertices % 6) != 0)
345648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
3457da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle			out_results[(*out_results_written)++] = n_input_vertices - (n_input_vertices % 6);
3458da995d4021c8222069635870e8ea98c12d7b1792Nicolai Hähnle			out_results[(*out_results_written)++] = (n_input_vertices - (n_input_vertices % 6)) / 2;
345948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
346048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
346148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
346248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
346348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
346448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
346548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
346648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Unrecognized primitive type");
346748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
346848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* switch (current_primitive_type) */
346948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
347048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (PipelineStatisticsQueryUtilities::isInstancedDrawCall(m_current_draw_call_type))
347148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
347248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (unsigned int i = 0; i < *out_results_written; ++i)
347348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
347448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_results[i] *= m_indirect_draw_call_primcount_argument;
347548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
347648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* if (instanced draw call type) */
347748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
347848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
347948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Initializes GL objects used by the test */
348048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional3::initObjects()
348148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
348248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
348348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
348448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	buildProgram(DE_NULL,												   /* cs_body */
348548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 PipelineStatisticsQueryUtilities::dummy_fs_code, DE_NULL, /* gs_body */
348648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 DE_NULL,												   /* tc_body */
348748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 DE_NULL,												   /* te_body */
348848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 PipelineStatisticsQueryUtilities::dummy_vs_code);
348948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
349048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.useProgram(m_po_id);
349148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() call failed.");
349248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
349348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
349448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether the test instance should be executed for user-specified query target.
349548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
349648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param query_target Query target to be used for the call.
349748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
349848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true  if @param query_target is either GL_VERTICES_SUBMITTED_ARB,
349948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                GL_PRIMITIVES_SUBMITTED_ARB, GL_CLIPPING_INPUT_PRIMITIVES_ARB, or
350048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                GL_CLIPPING_OUTPUT_PRIMITIVES_ARB.
350148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          false otherwise.
350248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
350348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional3::shouldExecuteForQueryTarget(glw::GLenum query_target)
350448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
350548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (query_target == GL_VERTICES_SUBMITTED_ARB || query_target == GL_PRIMITIVES_SUBMITTED_ARB ||
350648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			query_target == GL_CLIPPING_INPUT_PRIMITIVES_ARB || query_target == GL_CLIPPING_OUTPUT_PRIMITIVES_ARB);
350748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
350848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
350948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor.
351048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
351148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context Rendering context
351248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
351348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosPipelineStatisticsQueryTestFunctional4::PipelineStatisticsQueryTestFunctional4(deqp::Context& context)
351448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: PipelineStatisticsQueryTestFunctionalBase(context, "functional_vertex_shader_invocations",
351548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"Verifies GL_VERTEX_SHADER_INVOCATIONS_ARB query works correctly")
351648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
351748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally */
351848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
351948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
352048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Deinitializes all GL objects that were created during test execution. */
352148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional4::deinitObjects()
352248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
352348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
352448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
352548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_po_id != 0)
352648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
352748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteProgram(m_po_id);
352848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
352948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po_id = 0;
353048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
353148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
353248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
353348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Executes a test iteration for user-specified query target.
353448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
353548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param current_query_target Pipeline statistics query target to execute the iteration
353648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                              for.
353748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
353848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if the test passed for the iteration, false otherwise.
353948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
354048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional4::executeTest(glw::GLenum current_query_target)
354148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
354248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&									 gl		= m_context.getRenderContext().getFunctions();
354348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool													 result = true;
354448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryUtilities::_test_execution_result run_result;
354548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
354648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Sanity check: This method should only be called for GL_VERTEX_SHADER_INVOCATIONS_ARB
354748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * query */
354848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(current_query_target == GL_VERTEX_SHADER_INVOCATIONS_ARB);
354948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
355048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up VBO. */
355148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int n_vertex_components = 2;
355248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const float		   vertex_data[]  = { -0.1f, 0.2f, 0.3f, 0.1f, 0.2f, -0.7f, 0.5f, -0.5f, 0.0f, 0.0f, 0.1f, 0.2f };
355348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int index_data[]   = { 4, 3, 2, 1, 0 };
355448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int n_data_indices = sizeof(index_data) / sizeof(index_data[0]);
355548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
355648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Issue the test for 1 to 5 indices */
355748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_indices = 1; n_indices < n_data_indices; ++n_indices)
355848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
355948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_indirect_draw_call_baseinstance_argument = 1;
356048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_indirect_draw_call_basevertex_argument   = 1;
356148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_indirect_draw_call_count_argument		   = n_indices;
356248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_indirect_draw_call_first_argument		   = 0;
356348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_indirect_draw_call_primcount_argument	= 4;
356448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
356548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		initVBO(vertex_data, sizeof(vertex_data), index_data, sizeof(index_data), m_indirect_draw_call_count_argument,
356648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_indirect_draw_call_primcount_argument, m_indirect_draw_call_baseinstance_argument,
356748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_indirect_draw_call_first_argument, m_indirect_draw_call_basevertex_argument);
356848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
356948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		initVAO(n_vertex_components);
357048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
357148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Iterate through all primitive types */
357248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (unsigned int n_primitive_type = 0;
357348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 n_primitive_type < PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_COUNT; ++n_primitive_type)
357448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
357548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_current_primitive_type = (PipelineStatisticsQueryUtilities::_primitive_type)n_primitive_type;
357648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
357748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Exclude patches from the test */
357848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (m_current_primitive_type == PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_PATCHES)
357948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
358048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
358148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
358248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
358348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Exclude the primitive types, for which the number of indices is insufficient to form
358448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 * a primitive.
358548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 */
358648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if ((m_current_primitive_type == PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINE_LOOP &&
358748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 n_indices < 2) ||
358848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				(m_current_primitive_type == PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINE_STRIP &&
358948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 n_indices < 2) ||
359048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				(m_current_primitive_type == PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINES && n_indices < 2) ||
359148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				(m_current_primitive_type == PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLE_FAN &&
359248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 n_indices < 3) ||
359348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				(m_current_primitive_type == PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLE_STRIP &&
359448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 n_indices < 3) ||
359548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				(m_current_primitive_type == PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLES &&
359648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 n_indices < 3))
359748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
359848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Skip the iteration */
359948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
360048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
360148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
360248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Exclude adjacency primitive types from the test, since we're not using geometry shader stage. */
360348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (m_current_primitive_type == PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_LINES_ADJACENCY ||
360448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_current_primitive_type == PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_TRIANGLES_ADJACENCY)
360548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
360648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
360748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
360848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
360948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Iterate through all draw call types */
361048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (unsigned int n_draw_call_type = 0;
361148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 n_draw_call_type < PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_COUNT; ++n_draw_call_type)
361248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
361348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_current_draw_call_type = (PipelineStatisticsQueryUtilities::_draw_call_type)n_draw_call_type;
361448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
361548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Only continue if the draw call is supported by the context */
361648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (!PipelineStatisticsQueryUtilities::isDrawCallSupported(m_current_draw_call_type, gl))
361748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
361848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					continue;
361948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
362048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
362148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Execute the query */
362248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (!PipelineStatisticsQueryUtilities::executeQuery(
362348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						current_query_target, m_qo_id, m_bo_qo_id, queryCallbackDrawCallHandler,
362448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						(PipelineStatisticsQueryTestFunctionalBase*)this, m_context.getRenderContext(), m_testCtx,
362548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						m_context.getContextInfo(), &run_result))
362648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
362748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_testCtx.getLog() << tcu::TestLog::Message
362848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   << "Could not retrieve test run results for query target "
362948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										  "["
363048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   << PipelineStatisticsQueryUtilities::getStringForEnum(current_query_target)
363148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   << "]" << tcu::TestLog::EndMessage;
363248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
363348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					result = false;
363448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
363548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				else
363648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
363748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					static const glw::GLuint64 expected_value = 1;
363848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
363948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* Compare it against query result values */
364048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					result &= PipelineStatisticsQueryUtilities::verifyResultValues(
364148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						run_result, 1, &expected_value, m_qo_id != 0, /* should_check_qo_bo_values */
364248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						current_query_target, &m_current_draw_call_type, &m_current_primitive_type,
364348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						false, /* is_primitive_restart_enabled */
364448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						m_testCtx, PipelineStatisticsQueryUtilities::VERIFICATION_TYPE_EQUAL_OR_GREATER);
364548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
364648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				} /* if (run results were obtained successfully) */
364748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}	 /* for (all draw call types) */
364848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}		  /* for (all primitive types) */
364948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}			  /* for (1 to 5 indices) */
365048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
365148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
365248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
365348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
365448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Initializes all GL objects used by the test */
365548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional4::initObjects()
365648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
365748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
365848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
365948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	buildProgram(DE_NULL, /* cs_body */
366048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 DE_NULL, /* fs_body */
366148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 DE_NULL, /* gs_body */
366248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 DE_NULL, /* tc_body */
366348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 DE_NULL, /* te_body */
366448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 PipelineStatisticsQueryUtilities::dummy_vs_code);
366548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
366648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.useProgram(m_po_id);
366748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() call failed.");
366848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
366948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
367048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether the test instance should be executed for user-specified query target.
367148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
367248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param query_target Query target to be used for the call.
367348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
367448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true  if @param query_target is GL_VERTEX_SHADER_INVOCATIONS_ARB.
367548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          false otherwise.
367648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
367748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional4::shouldExecuteForQueryTarget(glw::GLenum query_target)
367848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
367948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (query_target == GL_VERTEX_SHADER_INVOCATIONS_ARB);
368048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
368148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
368248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor.
368348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
368448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context Rendering context
368548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
368648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosPipelineStatisticsQueryTestFunctional5::PipelineStatisticsQueryTestFunctional5(deqp::Context& context)
368748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: PipelineStatisticsQueryTestFunctionalBase(context, "functional_tess_queries",
368848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"Verifies that GL_TESS_CONTROL_SHADER_PATCHES_ARB and "
368948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB queries "
369048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"work correctly.")
369148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
369248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally */
369348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
369448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
369548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Deinitializes all GL objects that were created during test execution. */
369648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional5::deinitObjects()
369748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
369848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
369948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
370048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_po_id != 0)
370148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
370248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteProgram(m_po_id);
370348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
370448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po_id = 0;
370548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
370648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
370748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
370848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Executes a test iteration for user-specified query target.
370948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
371048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param current_query_target Pipeline statistics query target to execute the iteration
371148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                              for.
371248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
371348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if the test passed for the iteration, false otherwise.
371448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
371548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional5::executeTest(glw::GLenum current_query_target)
371648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
371748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&									 gl		= m_context.getRenderContext().getFunctions();
371848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool													 result = true;
371948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryUtilities::_test_execution_result run_result;
372048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
372148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Sanity check: This method should only be called for GL_TESS_CONTROL_SHADER_PATCHES_ARB and
372248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB queries. */
372348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(current_query_target == GL_TESS_CONTROL_SHADER_PATCHES_ARB ||
372448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			  current_query_target == GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB);
372548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
372648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up VBO. */
372748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int n_vertex_components = 2;
372848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const float		   vertex_data[]	   = {
372948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		-0.1f, 0.2f, 0.2f, -0.7f, 0.5f, -0.5f,
373048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
373148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int index_data[] = { 2, 1, 0 };
373248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
373348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_baseinstance_argument = 1;
373448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_basevertex_argument   = 1;
373548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_count_argument		   = 3; /* default GL_PATCH_VERTICES value */
373648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_first_argument		   = 0;
373748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_primcount_argument	= 4;
373848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
373948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	initVBO(vertex_data, sizeof(vertex_data), index_data, sizeof(index_data), m_indirect_draw_call_count_argument,
374048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_indirect_draw_call_primcount_argument, m_indirect_draw_call_baseinstance_argument,
374148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_indirect_draw_call_first_argument, m_indirect_draw_call_basevertex_argument);
374248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
374348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	initVAO(n_vertex_components);
374448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
374548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up the primitive type */
374648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_current_primitive_type = PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_PATCHES;
374748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
374848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Iterate through all draw call types */
374948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_draw_call_type = 0; n_draw_call_type < PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_COUNT;
375048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 ++n_draw_call_type)
375148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
375248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_current_draw_call_type = (PipelineStatisticsQueryUtilities::_draw_call_type)n_draw_call_type;
375348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
375448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Only continue if the draw call is supported by the context */
375548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!PipelineStatisticsQueryUtilities::isDrawCallSupported(m_current_draw_call_type, gl))
375648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
375748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
375848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
375948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
376048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Execute the query */
376148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!PipelineStatisticsQueryUtilities::executeQuery(
376248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				current_query_target, m_qo_id, m_bo_qo_id, queryCallbackDrawCallHandler,
376348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				(PipelineStatisticsQueryTestFunctionalBase*)this, m_context.getRenderContext(), m_testCtx,
376448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_context.getContextInfo(), &run_result))
376548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
376648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.getLog() << tcu::TestLog::Message << "Could not retrieve test run results for query target "
376748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														   "["
376848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   << PipelineStatisticsQueryUtilities::getStringForEnum(current_query_target) << "]"
376948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   << tcu::TestLog::EndMessage;
377048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
377148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result = false;
377248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
377348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
377448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
377548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			static const glw::GLuint64 expected_value = 1; /* as per test spec */
377648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
377748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Compare it against query result values */
377848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result &= PipelineStatisticsQueryUtilities::verifyResultValues(
377948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				run_result, 1, &expected_value, m_qo_id != 0, /* should_check_qo_bo_values */
378048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				current_query_target, &m_current_draw_call_type, &m_current_primitive_type,
378148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				false, /* is_primitive_restart_enabled */
378248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_testCtx, PipelineStatisticsQueryUtilities::VERIFICATION_TYPE_EQUAL_OR_GREATER);
378348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
378448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		} /* if (run results were obtained successfully) */
378548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}	 /* for (all draw call types) */
378648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
378748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
378848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
378948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
379048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Initializes all GL objects used by the test */
379148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional5::initObjects()
379248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
379348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
379448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
379548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* This test should not execute if we're not running at least a GL4.0 context */
379648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 0)))
379748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
379848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw tcu::NotSupportedError("OpenGL 4.0+ is required to run this test.");
379948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
380048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
380148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	buildProgram(DE_NULL,												   /* cs_body */
380248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 PipelineStatisticsQueryUtilities::dummy_fs_code, DE_NULL, /* gs_body */
380348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 PipelineStatisticsQueryUtilities::dummy_tc_code, PipelineStatisticsQueryUtilities::dummy_te_code,
380448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 PipelineStatisticsQueryUtilities::dummy_vs_code);
380548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
380648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.useProgram(m_po_id);
380748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() call failed.");
380848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
380948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
381048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether the test instance should be executed for user-specified query target.
381148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
381248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param query_target Query target to be used for the call.
381348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
381448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true  if @param query_target is either GL_TESS_CONTROL_SHADER_PATCHES_ARB,
381548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                or GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB.
381648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          false otherwise.
381748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
381848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional5::shouldExecuteForQueryTarget(glw::GLenum query_target)
381948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
382048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (query_target == GL_TESS_CONTROL_SHADER_PATCHES_ARB ||
382148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			query_target == GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB);
382248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
382348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
382448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor.
382548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
382648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context Rendering context
382748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
382848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosPipelineStatisticsQueryTestFunctional6::PipelineStatisticsQueryTestFunctional6(deqp::Context& context)
382948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: PipelineStatisticsQueryTestFunctionalBase(context, "functional_geometry_shader_queries",
383048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"Verifies that GL_GEOMETRY_SHADER_INVOCATIONS and "
383148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB queries "
383248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"work correctly.")
383348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_n_primitives_emitted_by_gs(3)
383448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_n_streams_emitted_by_gs(3)
383548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
383648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally */
383748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
383848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
383948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Deinitializes all GL objects that were created during test execution. */
384048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional6::deinitObjects()
384148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
384248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
384348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
384448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_po_id != 0)
384548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
384648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteProgram(m_po_id);
384748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
384848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po_id = 0;
384948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
385048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
385148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
385248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Executes a test iteration for user-specified query target.
385348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
385448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param current_query_target Pipeline statistics query target to execute the iteration
385548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                              for.
385648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
385748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if the test passed for the iteration, false otherwise.
385848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
385948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional6::executeTest(glw::GLenum current_query_target)
386048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
386148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&									 gl		= m_context.getRenderContext().getFunctions();
386248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool													 result = true;
386348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryUtilities::_test_execution_result run_result;
386448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
386548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Sanity check: This method should only be called for GL_GEOMETRY_SHADER_INVOCATIONS and
386648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB queries. */
386748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(current_query_target == GL_GEOMETRY_SHADER_INVOCATIONS ||
386848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			  current_query_target == GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB);
386948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
387048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up VBO. */
387148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int n_vertex_components = 2;
387248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const float		   vertex_data[]	   = {
387348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		-0.1f, 0.2f, 0.2f, -0.7f, 0.5f, -0.5f, 0.1f, -0.2f, -0.2f, 0.7f, -0.5f, 0.5f,
387448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
387548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int index_data[]			   = { 2, 1, 0 };
387648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_baseinstance_argument = 1;
387748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_basevertex_argument   = 1;
387848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_count_argument =
387948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		3; /* note: we will update the argument per iteration, so just use anything for now */
388048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_first_argument		= 0;
388148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_primcount_argument = 4;
388248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
388348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	initVBO(vertex_data, sizeof(vertex_data), index_data, sizeof(index_data), m_indirect_draw_call_count_argument,
388448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_indirect_draw_call_primcount_argument, m_indirect_draw_call_baseinstance_argument,
388548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_indirect_draw_call_first_argument, m_indirect_draw_call_basevertex_argument);
388648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
388748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	initVAO(n_vertex_components);
388848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
388948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Iterate over all input primitives supported by geometry shaders */
389048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (int gs_input_it = static_cast<int>(PipelineStatisticsQueryUtilities::GEOMETRY_SHADER_INPUT_FIRST);
389148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 gs_input_it != static_cast<int>(PipelineStatisticsQueryUtilities::GEOMETRY_SHADER_INPUT_COUNT); ++gs_input_it)
389248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
389348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		PipelineStatisticsQueryUtilities::_geometry_shader_input gs_input =
389448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			static_cast<PipelineStatisticsQueryUtilities::_geometry_shader_input>(gs_input_it);
389548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Set up the 'count' argument and update the VBO contents */
389648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_indirect_draw_call_count_argument = PipelineStatisticsQueryUtilities::getNumberOfVerticesForGSInput(gs_input);
389748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
389848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Update the VBO contents */
389948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bufferSubData(
390048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GL_ARRAY_BUFFER,
390148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_vbo_indirect_arrays_argument_offset, /* the very first argument is 'count' which we need to update */
390248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			sizeof(m_indirect_draw_call_count_argument), &m_indirect_draw_call_count_argument);
390348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bufferSubData(
390448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GL_ARRAY_BUFFER,
390548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_vbo_indirect_elements_argument_offset, /* the very first argument is 'count' which we need to update */
390648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			sizeof(m_indirect_draw_call_count_argument), &m_indirect_draw_call_count_argument);
390748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferSubData() call(s) failed.");
390848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
390948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (int gs_output_it = static_cast<int>(PipelineStatisticsQueryUtilities::GEOMETRY_SHADER_OUTPUT_FIRST);
391048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 gs_output_it != static_cast<int>(PipelineStatisticsQueryUtilities::GEOMETRY_SHADER_OUTPUT_COUNT);
391148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 ++gs_output_it)
391248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
391348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			PipelineStatisticsQueryUtilities::_geometry_shader_output gs_output =
391448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				static_cast<PipelineStatisticsQueryUtilities::_geometry_shader_output>(gs_output_it);
391548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* For GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB query, we need to test both single-stream and
391648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 * multi-stream geometry shaders.
391748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 *
391848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 * For GL_GEOMETRY_SHADER_INVOCATIONS, we only need a single iteration.
391948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 **/
392048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const unsigned int n_internal_iterations =
392148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				(current_query_target == GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB) ? 2 : 1;
392248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
392348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (unsigned int n_internal_iteration = 0; n_internal_iteration < n_internal_iterations;
392448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 ++n_internal_iteration)
392548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
392648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Build the test program. */
392748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				std::string gs_body;
392848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
392948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (n_internal_iteration == 1)
393048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
393148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* This path will only be entered for GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB query.
393248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 *
393348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 * OpenGL does not support multiple vertex streams for output primitive types other than
393448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 * points.
393548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 */
393648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					if (gs_output != PipelineStatisticsQueryUtilities::GEOMETRY_SHADER_OUTPUT_POINTS)
393748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
393848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						continue;
393948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
394048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
394148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* Build a multi-streamed geometry shader */
394248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					gs_body = PipelineStatisticsQueryUtilities::buildGeometryShaderBody(
394348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						gs_input, gs_output, m_n_primitives_emitted_by_gs, m_n_streams_emitted_by_gs);
394448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
394548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				else
394648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
394748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					gs_body = PipelineStatisticsQueryUtilities::buildGeometryShaderBody(
394848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						gs_input, gs_output, m_n_primitives_emitted_by_gs, 1); /* n_streams */
394948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
395048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
395148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				buildProgram(DE_NULL,																	/* cs_body */
395248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							 PipelineStatisticsQueryUtilities::dummy_fs_code, gs_body.c_str(), DE_NULL, /* tc_body */
395348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							 DE_NULL,																	/* te_body */
395448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							 PipelineStatisticsQueryUtilities::dummy_vs_code);
395548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
395648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.useProgram(m_po_id);
395748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() call failed.");
395848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
395948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Set up the primitive type */
396048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_current_primitive_type = PipelineStatisticsQueryUtilities::getPrimitiveTypeFromGSInput(gs_input);
396148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
396248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Iterate through all draw call types */
396348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				for (unsigned int n_draw_call_type = 0;
396448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 n_draw_call_type < PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_COUNT; ++n_draw_call_type)
396548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
396648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_current_draw_call_type = (PipelineStatisticsQueryUtilities::_draw_call_type)n_draw_call_type;
396748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
396848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* Only continue if the draw call is supported by the context */
396948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					if (!PipelineStatisticsQueryUtilities::isDrawCallSupported(m_current_draw_call_type, gl))
397048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
397148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						continue;
397248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
397348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
397448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* Execute the query */
397548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					if (!PipelineStatisticsQueryUtilities::executeQuery(
397648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							current_query_target, m_qo_id, m_bo_qo_id, queryCallbackDrawCallHandler,
397748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							(PipelineStatisticsQueryTestFunctionalBase*)this, m_context.getRenderContext(), m_testCtx,
397848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							m_context.getContextInfo(), &run_result))
397948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
398048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						m_testCtx.getLog()
398148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							<< tcu::TestLog::Message << "Could not retrieve test run results for query target "
398248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														"["
398348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							<< PipelineStatisticsQueryUtilities::getStringForEnum(current_query_target) << "]"
398448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							<< tcu::TestLog::EndMessage;
398548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
398648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						result = false;
398748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
398848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					else
398948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
399048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						unsigned int										 n_expected_values  = 0;
399148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						glw::GLuint64										 expected_values[2] = { 0 };
399248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						PipelineStatisticsQueryUtilities::_verification_type verification_type =
399348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							PipelineStatisticsQueryUtilities::VERIFICATION_TYPE_UNDEFINED;
399448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
399548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						if (current_query_target == GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB)
399648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						{
399748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							n_expected_values  = 2;
399848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							expected_values[0] = m_n_primitives_emitted_by_gs;
399948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							expected_values[1] = m_n_primitives_emitted_by_gs;
400048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							verification_type  = PipelineStatisticsQueryUtilities::VERIFICATION_TYPE_EXACT_MATCH;
400148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
400248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							if (n_internal_iteration == 1)
400348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							{
400448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								/* Multi-stream geometry shader case. Count in non-default vertex streams */
400548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								for (unsigned int n_stream = 1; n_stream < m_n_streams_emitted_by_gs; ++n_stream)
400648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								{
400748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									expected_values[1] += (m_n_primitives_emitted_by_gs + n_stream);
400848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								} /* for (non-default streams) */
400948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							}
401048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
401148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							if (PipelineStatisticsQueryUtilities::isInstancedDrawCall(m_current_draw_call_type))
401248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							{
401348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								expected_values[0] *= m_indirect_draw_call_primcount_argument;
401448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								expected_values[1] *= m_indirect_draw_call_primcount_argument;
401548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							}
401648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						}
401748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						else
401848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						{
401948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							n_expected_values  = 1;
402048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							expected_values[0] = 1; /* as per test spec */
402148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							verification_type  = PipelineStatisticsQueryUtilities::VERIFICATION_TYPE_EQUAL_OR_GREATER;
402248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						}
402348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
402448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						/* Compare it against query result values */
402548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						result &= PipelineStatisticsQueryUtilities::verifyResultValues(
402648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							run_result, n_expected_values, expected_values,
402748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							m_qo_id != 0, /* should_check_qo_bo_values */
402848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							current_query_target, &m_current_draw_call_type, &m_current_primitive_type,
402948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							false, /* is_primitive_restart_enabled */
403048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							m_testCtx, verification_type);
403148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
403248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					} /* if (run results were obtained successfully) */
403348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}	 /* for (all draw call types) */
403448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}		  /* for (all internal iterations) */
403548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}			  /* for (all geometry shader output primitive types) */
403648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}				  /* for (all geometry shader input primitive types) */
403748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
403848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
403948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
404048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Initializes all GL objects used by the test */
404148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional6::initObjects()
404248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
404348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* This test should not execute if we're not running at least a GL3.2 context */
404448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(3, 2)))
404548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
404648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw tcu::NotSupportedError("OpenGL 3.2+ is required to run this test.");
404748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
404848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
404948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
405048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether the test instance should be executed for user-specified query target.
405148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
405248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param query_target Query target to be used for the call.
405348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
405448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true  if @param query_target is either GL_GEOMETRY_SHADER_INVOCATIONS, or
405548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB.
405648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          false otherwise.
405748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
405848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional6::shouldExecuteForQueryTarget(glw::GLenum query_target)
405948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
406048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (query_target == GL_GEOMETRY_SHADER_INVOCATIONS ||
406148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			query_target == GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB);
406248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
406348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
406448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor.
406548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
406648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context Rendering context
406748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
406848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosPipelineStatisticsQueryTestFunctional7::PipelineStatisticsQueryTestFunctional7(deqp::Context& context)
406948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: PipelineStatisticsQueryTestFunctionalBase(context, "functional_fragment_shader_invocations",
407048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"Verifies GL_FRAGMENT_SHADER_INVOCATIONS_ARB queries "
407148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"work correctly.")
407248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
407348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally */
407448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
407548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
407648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Deinitializes all GL objects that were created during test execution. */
407748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional7::deinitObjects()
407848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
407948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
408048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
408148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_po_id != 0)
408248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
408348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteProgram(m_po_id);
408448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
408548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po_id = 0;
408648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
408748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
408848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
408948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Executes a test iteration for user-specified query target.
409048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
409148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param current_query_target Pipeline statistics query target to execute the iteration
409248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                              for.
409348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
409448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if the test passed for the iteration, false otherwise.
409548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
409648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional7::executeTest(glw::GLenum current_query_target)
409748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
409848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&									 gl		= m_context.getRenderContext().getFunctions();
409948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool													 result = true;
410048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryUtilities::_test_execution_result run_result;
410148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
410248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Sanity check: This method should only be called for GL_FRAGMENT_SHADER_INVOCATIONS_ARB query */
410348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(current_query_target == GL_FRAGMENT_SHADER_INVOCATIONS_ARB);
410448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
410548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set up VBO. */
410648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int n_vertex_components = 2;
410748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const float		   vertex_data[]	   = { 0.0f,  0.75f, -0.75f, -0.75f, 0.75f, -0.75f, 0.3f, 0.7f,
410848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  -0.4f, 0.2f,  0.6f,   -0.3f,  -0.3f, -0.7f,  0.0f, 0.0f };
410948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int index_data[] = { 0, 2, 1, 3, 4, 5, 6, 7 };
411048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
411148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_baseinstance_argument = 1;
411248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_basevertex_argument   = 1;
411348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_count_argument =
411448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		3; /* this value will be updated in the actual loop, so use anything for now */
411548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_first_argument		= 0;
411648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_indirect_draw_call_primcount_argument = 4;
411748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
411848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	initFBO();
411948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	initVBO(vertex_data, sizeof(vertex_data), index_data, sizeof(index_data), m_indirect_draw_call_count_argument,
412048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_indirect_draw_call_primcount_argument, m_indirect_draw_call_baseinstance_argument,
412148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_indirect_draw_call_first_argument, m_indirect_draw_call_basevertex_argument);
412248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
412348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	initVAO(n_vertex_components);
412448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
412548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Iterate over all primitive types */
412648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (int current_primitive_type_it = static_cast<int>(PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_FIRST);
412748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 current_primitive_type_it < static_cast<int>(PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_COUNT);
412848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 ++current_primitive_type_it)
412948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
413048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		PipelineStatisticsQueryUtilities::_primitive_type current_primitive_type =
413148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			static_cast<PipelineStatisticsQueryUtilities::_primitive_type>(current_primitive_type_it);
413248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Exclude 'patches' primitive type */
413348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (current_primitive_type == PipelineStatisticsQueryUtilities::PRIMITIVE_TYPE_PATCHES)
413448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
413548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
413648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
413748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
413848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_current_primitive_type = current_primitive_type;
413948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
414048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Update 'count' argument so that we only use as many vertices as needed for current
414148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 * primitive type.
414248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
414348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		unsigned int count_argument_value =
414448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			PipelineStatisticsQueryUtilities::getNumberOfVerticesForPrimitiveType(m_current_primitive_type);
414548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
414648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_indirect_draw_call_count_argument = count_argument_value;
414748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
414848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bufferSubData(GL_ARRAY_BUFFER, m_vbo_indirect_arrays_argument_offset, sizeof(unsigned int),
414948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						 &m_indirect_draw_call_count_argument);
415048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bufferSubData(GL_ARRAY_BUFFER, m_vbo_indirect_elements_argument_offset, sizeof(unsigned int),
415148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						 &m_indirect_draw_call_count_argument);
415248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
415348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferSubData() call(s) failed.");
415448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
415548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Iterate through all draw call types */
415648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (unsigned int n_draw_call_type = 0;
415748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 n_draw_call_type < PipelineStatisticsQueryUtilities::DRAW_CALL_TYPE_COUNT; ++n_draw_call_type)
415848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
415948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_current_draw_call_type = (PipelineStatisticsQueryUtilities::_draw_call_type)n_draw_call_type;
416048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
416148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Only continue if the draw call is supported by the context */
416248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!PipelineStatisticsQueryUtilities::isDrawCallSupported(m_current_draw_call_type, gl))
416348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
416448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
416548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
416648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
416748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Clear the buffers before we proceed */
416848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
416948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glClear() call failed.");
417048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
417148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Execute the query */
417248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!PipelineStatisticsQueryUtilities::executeQuery(
417348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					current_query_target, m_qo_id, m_bo_qo_id, queryCallbackDrawCallHandler,
417448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					(PipelineStatisticsQueryTestFunctionalBase*)this, m_context.getRenderContext(), m_testCtx,
417548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_context.getContextInfo(), &run_result))
417648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
417748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_testCtx.getLog() << tcu::TestLog::Message << "Could not retrieve test run results for query target "
417848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															   "["
417948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   << PipelineStatisticsQueryUtilities::getStringForEnum(current_query_target) << "]"
418048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   << tcu::TestLog::EndMessage;
418148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
418248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				result = false;
418348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
418448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			else
418548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
418648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				static const glw::GLuint64 expected_value = 1; /* as per test spec */
418748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
418848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Compare it against query result values */
418948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				result &= PipelineStatisticsQueryUtilities::verifyResultValues(
419048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					run_result, 1, &expected_value, m_qo_id != 0, /* should_check_qo_bo_values */
419148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					current_query_target, &m_current_draw_call_type, &m_current_primitive_type,
419248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					false, /* is_primitive_restart_enabled */
419348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_testCtx, PipelineStatisticsQueryUtilities::VERIFICATION_TYPE_EQUAL_OR_GREATER);
419448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
419548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			} /* if (run results were obtained successfully) */
419648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}	 /* for (all draw call types) */
419748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}		  /* for (all primitive types) */
419848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
419948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
420048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
420148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
420248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Initializes all GL objects used by the test */
420348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional7::initObjects()
420448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
420548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
420648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
420748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	buildProgram(DE_NULL,												   /* cs_body */
420848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 PipelineStatisticsQueryUtilities::dummy_fs_code, DE_NULL, /* gs_body */
420948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 DE_NULL,												   /* tc_body */
421048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 DE_NULL,												   /* te_body */
421148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 PipelineStatisticsQueryUtilities::dummy_vs_code);
421248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
421348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.useProgram(m_po_id);
421448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() call failed.");
421548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
421648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
421748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether the test instance should be executed for user-specified query target.
421848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
421948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param query_target Query target to be used for the call.
422048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
422148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true  if @param query_target is GL_FRAGMENT_SHADER_INVOCATIONS_ARB.
422248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          false otherwise.
422348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
422448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional7::shouldExecuteForQueryTarget(glw::GLenum query_target)
422548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
422648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (query_target == GL_FRAGMENT_SHADER_INVOCATIONS_ARB);
422748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
422848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
422948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor.
423048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
423148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context Rendering context
423248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
423348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosPipelineStatisticsQueryTestFunctional8::PipelineStatisticsQueryTestFunctional8(deqp::Context& context)
423448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: PipelineStatisticsQueryTestFunctionalBase(context, "functional_compute_shader_invocations",
423548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"Verifies that GL_COMPUTE_SHADER_INVOCATIONS_ARB queries "
423648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"work correctly.")
423748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_bo_dispatch_compute_indirect_args_offset(0)
423848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_bo_id(0)
423948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_current_iteration(0)
424048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
424148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally */
424248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
424348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
424448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Deinitializes all GL objects that were created during test execution. */
424548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional8::deinitObjects()
424648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
424748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
424848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
424948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_bo_id != 0)
425048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
425148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_bo_id);
425248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
425348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_bo_id = 0;
425448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
425548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
425648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
425748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Executes a test iteration for user-specified query target.
425848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
425948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param current_query_target Pipeline statistics query target to execute the iteration
426048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                              for.
426148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
426248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true if the test passed for the iteration, false otherwise.
426348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
426448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional8::executeTest(glw::GLenum current_query_target)
426548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
426648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool													 result = true;
426748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryUtilities::_test_execution_result run_result;
426848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
426948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Sanity check: This method should only be called for
427048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * GL_COMPUTE_SHADER_INVOCATIONS_ARB queries. */
427148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(current_query_target == GL_COMPUTE_SHADER_INVOCATIONS_ARB);
427248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
427348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* This test needs to be run in two iterations:
427448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 *
427548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * 1. glDispatchCompute() should be called.
427648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * 2. glDispatchComputeIndirect() should be called.
427748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 *
427848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 */
427948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (m_current_iteration = 0; m_current_iteration < 2; /* as per description */
428048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 ++m_current_iteration)
428148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
428248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Execute the query */
428348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!PipelineStatisticsQueryUtilities::executeQuery(
428448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				current_query_target, m_qo_id, m_bo_qo_id, queryCallbackDispatchCallHandler, this,
428548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_context.getRenderContext(), m_testCtx, m_context.getContextInfo(), &run_result))
428648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
428748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.getLog() << tcu::TestLog::Message << "Could not retrieve test run results for query target "
428848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														   "["
428948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   << PipelineStatisticsQueryUtilities::getStringForEnum(current_query_target) << "]"
429048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   << tcu::TestLog::EndMessage;
429148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
429248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result = false;
429348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
429448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
429548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
429648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			static const glw::GLuint64 expected_value = 1; /* as per test spec */
429748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
429848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Compare it against query result values */
429948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result &= PipelineStatisticsQueryUtilities::verifyResultValues(
430079df5799eb0b77e3f1a335f92a0a961b5db0461cJames Helferty				run_result, 1, &expected_value, m_qo_id != 0,  /* should_check_qo_bo_values */
430179df5799eb0b77e3f1a335f92a0a961b5db0461cJames Helferty				current_query_target, DE_NULL, DE_NULL, false, /* is_primitive_restart_enabled */
430248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_testCtx, PipelineStatisticsQueryUtilities::VERIFICATION_TYPE_EQUAL_OR_GREATER);
430348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		} /* if (run results were obtained successfully) */
430448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}	 /* for (both iterations) */
430548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
430648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
430748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
430848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
430948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Initializes all GL objects used by the test */
431048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTestFunctional8::initObjects()
431148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
431248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
431348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
431448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	buildProgram(PipelineStatisticsQueryUtilities::dummy_cs_code, DE_NULL, /* fs_body */
431548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 DE_NULL,												   /* gs_body */
431648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 DE_NULL,												   /* tc_body */
431748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 DE_NULL,												   /* te_body */
431848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				 DE_NULL);												   /* vs_body */
431948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
432048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.useProgram(m_po_id);
432148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() call failed.");
432248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
432348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Init BO to hold atomic counter data, as well as the indirect dispatch compute
432448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * draw call arguments */
432548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int	   atomic_counter_value = 0;
432648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int bo_size				= sizeof(unsigned int) * (1 /* counter value */ + 3 /* draw call args */);
432748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
432848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const unsigned int drawcall_args[] = {
432948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		1, /* num_groups_x */
433048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		1, /* num_groups_y */
433148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		1  /* num_groups_z */
433248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
433348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
433448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genBuffers(1, &m_bo_id);
433548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers() call failed.");
433648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
433748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindBuffer(GL_ARRAY_BUFFER, m_bo_id);
433848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindBuffer(GL_DISPATCH_INDIRECT_BUFFER, m_bo_id);
433948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer() call(s) failed.");
434048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
434148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, /* index */
434248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  m_bo_id);
434348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase() call failed.");
434448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
434548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bufferData(GL_ARRAY_BUFFER, bo_size, DE_NULL, GL_STATIC_DRAW);
434648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() call failed.");
434748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
434848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bufferSubData(GL_ARRAY_BUFFER, 0, /* offset */
434948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 sizeof(unsigned int), &atomic_counter_value);
435048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bufferSubData(GL_ARRAY_BUFFER, sizeof(unsigned int), /* offset */
435148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 sizeof(drawcall_args), drawcall_args);
435248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferSubData() call failed.");
435348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
435448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Store rthe offset, at which the draw call args start */
435548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_bo_dispatch_compute_indirect_args_offset = sizeof(unsigned int);
435648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
435748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
435848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Either issues a regular or indirect compute shader dispatch call, and then verifies
435948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  the call has executed without any error being generated. The regular dispatch call
436048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  will be executed if pInstance->m_current_iteration is equal to 0, otherwise the
436148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  method will use the indirect version.
436248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
436348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pInstance Pointer to a PipelineStatisticsQueryTestFunctional8 instance.
436448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
436548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional8::queryCallbackDispatchCallHandler(void* pInstance)
436648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
436748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLenum								error_code = GL_NO_ERROR;
436848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	PipelineStatisticsQueryTestFunctional8* pThis	  = (PipelineStatisticsQueryTestFunctional8*)pInstance;
436948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool									result	 = true;
437048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions&					gl		   = pThis->m_context.getRenderContext().getFunctions();
437148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
437248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (pThis->m_current_iteration == 0)
437348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
437448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.dispatchCompute(1,  /* num_groups_x */
437548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   1,  /* num_groups_y */
437648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   1); /* num_groups_z */
437748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
437848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
437948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
438048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.dispatchComputeIndirect(pThis->m_bo_dispatch_compute_indirect_args_offset);
438148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
438248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
438348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error_code = gl.getError();
438448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (error_code != GL_NO_ERROR)
438548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
438648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		pThis->m_testCtx.getLog() << tcu::TestLog::Message
438748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  << ((pThis->m_current_iteration == 0) ? "glDispatchCompute()" :
438848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																		  "glDispatchComputeIndirect()")
438948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  << " call failed with error code "
439048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									 "["
439148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  << error_code << "]." << tcu::TestLog::EndMessage;
439248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
439348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = false;
439448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
439548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
439648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
439748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
439848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
439948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether the test instance should be executed for user-specified query target.
440048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
440148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param query_target Query target to be used for the call.
440248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
440348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return true  if @param query_target is GL_COMPUT_SHADER_INVOCATIONS_ARB.
440448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          false otherwise.
440548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
440648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool PipelineStatisticsQueryTestFunctional8::shouldExecuteForQueryTarget(glw::GLenum query_target)
440748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
440848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (query_target == GL_COMPUTE_SHADER_INVOCATIONS_ARB);
440948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
441048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
441148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor.
441248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
441348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param context Rendering context.
441448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
441548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosPipelineStatisticsQueryTests::PipelineStatisticsQueryTests(deqp::Context& context)
441648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCaseGroup(context, "pipeline_statistics_query_tests_ARB",
441748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					"Contains conformance tests that verify GL implementation's support "
441848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					"for GL_ARB_pipeline_statistics_query extension.")
441948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
442048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally */
442148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
442248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
442348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Initializes the test group contents. */
442448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid PipelineStatisticsQueryTests::init()
442548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
442648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new PipelineStatisticsQueryTestAPICoverage1(m_context));
442748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new PipelineStatisticsQueryTestAPICoverage2(m_context));
442848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new PipelineStatisticsQueryTestFunctional1(m_context));
442948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new PipelineStatisticsQueryTestFunctional2(m_context));
443048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new PipelineStatisticsQueryTestFunctional3(m_context));
443148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new PipelineStatisticsQueryTestFunctional4(m_context));
443248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new PipelineStatisticsQueryTestFunctional5(m_context));
443348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new PipelineStatisticsQueryTestFunctional6(m_context));
443448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new PipelineStatisticsQueryTestFunctional7(m_context));
443548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new PipelineStatisticsQueryTestFunctional8(m_context));
443648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
443748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} /* glcts namespace */
4438