148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#ifndef _ESEXTCTESTCASEBASE_HPP
248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define _ESEXTCTESTCASEBASE_HPP
348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/*-------------------------------------------------------------------------
448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * OpenGL Conformance Test Suite
548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * -----------------------------
648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2014-2016 The Khronos Group Inc.
848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
1048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * you may not use this file except in compliance with the License.
1148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * You may obtain a copy of the License at
1248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
1448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Unless required by applicable law or agreed to in writing, software
1648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
1748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * See the License for the specific language governing permissions and
1948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * limitations under the License.
2048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
2184322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*!
2248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file
2348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief
2484322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/
2548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glcContext.hpp"
2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluShaderUtil.hpp"
2848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuDefs.hpp"
2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuTestCase.hpp"
3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glcExtTokens.hpp"
3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwDefs.hpp"
3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwFunctions.hpp"
3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <map>
3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <math.h>
3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <string.h>
3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* String definitions */
3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GEOMETRY_SHADER_EXTENSION_NOT_SUPPORTED "Geometry shader functionality not supported, skipping"
4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GEOMETRY_SHADER_POINT_SIZE_NOT_SUPPORTED "Geometry shader point size functionality not supported, skipping"
4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GPU_SHADER5_EXTENSION_NOT_SUPPORTED "GPU shader5 functionality not supported, skipping"
4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define TESSELLATION_SHADER_EXTENSION_NOT_SUPPORTED "Tessellation shader functionality not supported, skipping"
4348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define TEXTURE_BORDER_CLAMP_NOT_SUPPORTED "Texture border clamp functionality not supported, skipping"
4448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define TEXTURE_CUBE_MAP_ARRAY_EXTENSION_NOT_SUPPORTED "Texture cube map array functionality not supported, skipping"
4548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define SHADER_IMAGE_ATOMIC_EXTENSION_NOT_SUPPORTED "Shader image atomic functionality not supported, skipping"
4648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define TEXTURE_BUFFER_EXTENSION_NOT_SUPPORTED "Texture buffer functionality not supported, skipping"
4748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define DRAW_BUFFERS_INDEXED_NOT_SUPPORTED "Draw buffers indexed functionality not supported, skipping"
4887b4a35eb5440743883229ce2f40fa845417995cDaniel Koch#define VIEWPORT_ARRAY_NOT_SUPPORTED "Viewport array functionality not supported, skipping"
4948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
5048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace glcts
5148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
5248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Define allowed storage types */
5348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosenum STORAGE_TYPE
5448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
5548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	ST_MUTABLE,  /* Mutable Storage */
5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	ST_IMMUTABLE /* Immutable Storage */
5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Extension names */
6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosenum ExtensionName
6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONNAME_SHADER_IMAGE_ATOMIC,
6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONNAME_SHADER_IO_BLOCKS,
6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONNAME_GEOMETRY_SHADER,
6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONNAME_GEOMETRY_POINT_SIZE,
6648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONNAME_TESSELLATION_SHADER,
6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONNAME_TESSELLATION_POINT_SIZE,
6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONNAME_TEXTURE_BUFFER,
6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONNAME_TEXTURE_CUBE_MAP_ARRAY,
7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONNAME_GPU_SHADER5,
7187b4a35eb5440743883229ce2f40fa845417995cDaniel Koch	EXTENSIONNAME_VIEWPORT_ARRAY,
7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Extension type */
7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosenum ExtensionType
7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONTYPE_NONE, /* Not an extension (part of this version of OpenGL or OpenGL ES) */
7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONTYPE_EXT,  /* EXT multivendor extension */
7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONTYPE_OES   /* OES Khronos extension */
8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
8148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosenum ExtensionBehavior
8348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONBEHAVIOR_DISABLE, /* disable */
8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONBEHAVIOR_WARN,	/* warn */
8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONBEHAVIOR_ENABLE,  /* enable */
8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	EXTENSIONBEHAVIOR_REQUIRE  /* require */
8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing deqp::Context;
9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstruct ExtParameters
9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glu::GLSLVersion glslVersion;
9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	ExtensionType	extType;
9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	ExtParameters(glu::GLSLVersion _glslVersion, ExtensionType _extType) : glslVersion(_glslVersion), extType(_extType)
9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
9948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
10048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/**
10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Base class for tests implementations.
10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass TestCaseBase : public tcu::TestCase
10648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic:
10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Public methods */
10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Destructor */
11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual ~TestCaseBase(void)
11248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const float m_epsilon_float;
11648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprotected:
11848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	enum LOG_TYPE
11948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
12048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		LT_SHADER_OBJECT,  /* Shader object */
12148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		LT_PROGRAM_OBJECT, /* Program object */
12248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		LT_PIPELINE_OBJECT /* Program pipeline object */
12348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
12448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Protected type definitions */
12548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Protected methods */
12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Constructor */
12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	TestCaseBase(Context& context, const ExtParameters& extParam, const char* name, const char* description);
13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Methods that a derived test case should reimplement */
13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual void		  deinit(void);
13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual void		  init(void);
13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual IterateResult iterate(void);
13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Initializes extension function pointers */
13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	void initExtensions();
13848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Initializes GLSL specialization map */
14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	void initGLSLSpecializationMap();
14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
14248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Function that generates an extension directive */
14348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string getGLSLExtDirective(ExtensionType type, ExtensionName name, ExtensionBehavior behavior);
14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
14548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Sets the seed for the random generator */
14648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	void randomSeed(const glw::GLuint seed);
14748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
14848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Returns random unsigned integer from the range [0,max) */
14948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint randomFormula(const glw::GLuint max);
15048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Helper method for verification of pixel color */
15248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool comparePixel(const unsigned char* buffer, unsigned int x, unsigned int y, unsigned int width,
15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  unsigned int height, unsigned int pixel_size, unsigned char expected_red = 0,
15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  unsigned char expected_green = 0, unsigned char expected_blue = 0,
15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  unsigned char expected_alpha = 0) const;
15648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Helper method for checking if an extension is supported*/
15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool isExtensionSupported(const std::string& extName) const;
15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Program creation and validation helper methods */
16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string specializeShader(const unsigned int parts, const char* const* code) const;
16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	void shaderSourceSpecialized(glw::GLuint shader_id, glw::GLsizei shader_count,
16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 const glw::GLchar* const* shader_string);
16448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool buildProgram(glw::GLuint po_id, glw::GLuint sh1_shader_id, unsigned int n_sh1_body_parts,
16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh1_body_parts, bool* out_has_compilation_failed = NULL);
16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool buildProgram(glw::GLuint po_id, glw::GLuint sh1_shader_id, unsigned int n_sh1_body_parts,
16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh1_body_parts, glw::GLuint sh2_shader_id, unsigned int n_sh2_body_parts,
17048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh2_body_parts, bool* out_has_compilation_failed = NULL);
17148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool buildProgram(glw::GLuint po_id, glw::GLuint sh1_shader_id, unsigned int n_sh1_body_parts,
17348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh1_body_parts, glw::GLuint sh2_shader_id, unsigned int n_sh2_body_parts,
17448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh2_body_parts, glw::GLuint sh3_shader_id, unsigned int n_sh3_body_parts,
17548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh3_body_parts, bool* out_has_compilation_failed = NULL);
17648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool buildProgram(glw::GLuint po_id, glw::GLuint sh1_shader_id, unsigned int n_sh1_body_parts,
17848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh1_body_parts, glw::GLuint sh2_shader_id, unsigned int n_sh2_body_parts,
17948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh2_body_parts, glw::GLuint sh3_shader_id, unsigned int n_sh3_body_parts,
18048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh3_body_parts, glw::GLuint sh4_shader_id, unsigned int n_sh4_body_parts,
18148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh4_body_parts, bool* out_has_compilation_failed = NULL);
18248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
18348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool buildProgram(glw::GLuint po_id, glw::GLuint sh1_shader_id, unsigned int n_sh1_body_parts,
18448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh1_body_parts, glw::GLuint sh2_shader_id, unsigned int n_sh2_body_parts,
18548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh2_body_parts, glw::GLuint sh3_shader_id, unsigned int n_sh3_body_parts,
18648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh3_body_parts, glw::GLuint sh4_shader_id, unsigned int n_sh4_body_parts,
18748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh4_body_parts, glw::GLuint sh5_shader_id, unsigned int n_sh5_body_parts,
18848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  const char* const* sh5_body_parts, bool* out_has_compilation_failed = NULL);
18948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool doesProgramBuild(unsigned int n_fs_body_parts, const char* const* fs_body_parts, unsigned int n_gs_body_parts,
19148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  const char* const* gs_body_parts, unsigned int n_vs_body_parts,
19248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  const char* const* vs_body_parts);
19348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string getShaderSource(glw::GLuint shader_id);
19548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string getCompilationInfoLog(glw::GLuint shader_id);
19648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string getLinkingInfoLog(glw::GLuint po_id);
19748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string getPipelineInfoLog(glw::GLuint ppo_id);
19848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Helper method for setting up a fraembuffer with texture as color attachment */
20048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool setupFramebufferWithTextureAsAttachment(glw::GLuint framebuffer_object_id, glw::GLuint color_texture_id,
20148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												 glw::GLenum texture_format, glw::GLuint width,
20248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												 glw::GLuint height) const;
20348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	void checkFramebufferStatus(glw::GLenum framebuffer) const;
20548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Protected variables */
20748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	Context&		 m_context;
20848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glu::GLSLVersion m_glslVersion;
20948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	ExtensionType	m_extType;
21048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::map<std::string, std::string> m_specializationMap;
21148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
21248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_framebuffer_no_attachments_supported;
21348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_geometry_shader_extension_supported;
21448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_geometry_shader_point_size_supported;
21548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_gpu_shader5_supported;
21648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_program_interface_query_supported;
21748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_shader_image_load_store_supported;
21848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_shader_image_atomic_supported;
21948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_texture_storage_multisample_supported;
22048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_texture_storage_multisample_2d_array_supported;
22148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_tessellation_shader_supported;
22248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_tessellation_shader_point_size_supported;
22348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_texture_cube_map_array_supported;
22448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_texture_border_clamp_supported;
22548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool m_is_texture_buffer_supported;
22687b4a35eb5440743883229ce2f40fa845417995cDaniel Koch	bool m_is_viewport_array_supported;
22748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Predefined shader strings */
22948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const char* m_boilerplate_vs_code;
23048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
23148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* GL tokens that are diferent for functionalities
23248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * enabled by extensions and for functionalities that
23348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * are present in the core. */
23448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	deqp::GLExtTokens m_glExtTokens;
23548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
23648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprivate:
23748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Private functions */
23848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool buildProgramVA(glw::GLuint po_id, bool* out_has_compilation_failed, unsigned int sh_stages, ...);
23948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string getInfoLog(LOG_TYPE log_type, glw::GLuint id);
24048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Private variables */
24248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint seed_value;
24348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	friend class TessellationShaderUtils;
24548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
24648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Test Case Group that tracks GLSL version and extension type */
24848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass TestCaseGroupBase : public tcu::TestCaseGroup
24948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
25048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic:
25148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	TestCaseGroupBase(Context& context, const ExtParameters& extParam, const char* name, const char* description);
25248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
25348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual ~TestCaseGroupBase(void)
25448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
25548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
25648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
25748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	Context& getContext(void)
25848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
25948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return m_context;
26048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
26148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprotected:
26348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	Context&	  m_context;
26448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	ExtParameters m_extParams;
26548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
26648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosinline TestCaseGroupBase::TestCaseGroupBase(Context& context, const ExtParameters& extParams, const char* name,
26848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											const char* description)
26948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: tcu::TestCaseGroup(context.getTestContext(), name, description), m_context(context), m_extParams(extParams)
27048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
27148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
27248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
27348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} // namespace glcts
27448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
27548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif // _ESEXTCTESTCASEBASE_HPP
276