Home | History | Annotate | Download | only in texture_cube_map_array
      1 #ifndef _ESEXTCTEXTURECUBEMAPARRAYSAMPLING_HPP
      2 #define _ESEXTCTEXTURECUBEMAPARRAYSAMPLING_HPP
      3 /*-------------------------------------------------------------------------
      4  * OpenGL Conformance Test Suite
      5  * -----------------------------
      6  *
      7  * Copyright (c) 2014-2016 The Khronos Group Inc.
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  */ /*!
     22  * \file
     23  * \brief
     24  */ /*-------------------------------------------------------------------*/
     25 
     26 /*!
     27  * \file  esextcTextureCubeMapArraySampling.hpp
     28  * \brief Texture Cube Map Array Sampling (Test 1)
     29  */ /*-------------------------------------------------------------------*/
     30 
     31 #include "../esextcTestCaseBase.hpp"
     32 
     33 #include <string>
     34 
     35 namespace glcts
     36 {
     37 
     38 /** Implementation of (Test 1) for texture_cube_map_array extension. Test description follows:
     39  *
     40  *  Make sure sampling cube-map array textures works correctly.
     41  *
     42  *  Category: Functionality tests,
     43  *            Optional dependency on EXT_geometry_shader;
     44  *            Optional dependency on EXT_tessellation_shader;
     45  *            Optional dependency on OES_texture_stencil8;
     46  *
     47  *  Priority: Must-have.
     48  *
     49  *  Verify that both mutable and immutable cube-map array textures initialized
     50  *  with:
     51  *
     52  *  * a color-renderable internalformat (GL_RGBA8);
     53  *  * a depth-renderable internalformat (GL_DEPTH_COMPONENT32F);
     54  *  * GL_RGBA32I internalformat;
     55  *  * GL_RGBA32UI internalformat;
     56  *  * GL_STENCIL_INDEX8 internalformat;
     57  *  * GL_COMPRESSED_RGBA8_ETC2_EAC internalformat;
     58  *
     59  *  can be correctly sampled from:
     60  *
     61  *  * a compute shader.
     62  *  * a fragment shader;
     63  *  * a geometry shader;                (if supported)
     64  *  * a tessellation control shader;    (if supported)
     65  *  * a tessellation evaluation shader; (if supported)
     66  *  * a vertex shader.
     67  *
     68  *  For depth textures, the test should verify results reported by
     69  *  samplerCubeArray and samplerCubeArrayShadow samplers are valid.
     70  *
     71  *  Use the following texture sampling GLSL functions:
     72  *
     73  *  * texture();
     74  *  * textureLod()  (lod argument set to 0 and n_total_texture_mipmaps-1;
     75  *                   in the former case we expect base mip-map data to be
     76  *                   used, in the latter it should be the last mip-map that
     77  *                   is used as texel data source)
     78  *  * textureGrad() (dPdx, dPdy should be calculated as distance to "right"
     79  *                   and "top" "neighbours". Set of neighbours should
     80  *                   ensure sampling of base and last mipmap level);
     81  *  * textureGather();
     82  *
     83  *  The following samplers should be used: (whichever applies for texture
     84  *  considered)
     85  *
     86  *  * isamplerCubeArray;
     87  *  *  samplerCubeArray;
     88  *  *  samplerCubeArrayShadow;
     89  *  * usamplerCubeArray;
     90  *
     91  *  The following cube-map array texture resolutions should be used for the
     92  *  purpose of the test:
     93  *
     94  *  * not compressed formats
     95  *         [width x height x depth]
     96  *      1)   64   x   64   x  18;
     97  *      2)  117   x  117   x   6;
     98  *      3)  256   x  256   x   6;
     99  *      4)  173   x  173   x  12;
    100  *  * compressed formats
    101  *         [width x height x depth]
    102  *      1)    8   x    8   x  12
    103  *      2)   13   x   13   x  12;
    104  *
    105  *  In case of color data, for m-th mip-map level of n-th face at i-th layer,
    106  *  the mip-map should be filled with the following color:
    107  *
    108  *          ((m+1)/n_mipmaps, (n+1)/6, (i+1)/n_layers, 1.0 / 4.0)
    109  *
    110  *  For signed/unsigned integer data, remove the denominator from all channels.
    111  *
    112  *  For compressed formats, each component should be equal:
    113  *
    114  *          (m * n_layers * 6) + (i * 6) + n
    115  *
    116  *  In case of depth data, for m-th mip-map level of n-th face at i-th layer,
    117  *  the mip-map should be filled with the following depth:
    118  *
    119  *           (m+1 + n+1 + i+1) / (n_mipmaps + 6 + n_layers)
    120  *
    121  *  In case of stencil data, for m-th mip-map level of n-th face at i-th layer,
    122  *  the mip-map should be filled with the following stencil index value:
    123  *
    124  *        (m+1 + n+1 + i+1) / (n_mipmaps + 6 + n_layers) * 255
    125  *
    126  *  The test should use the maximum allowed amount of mip-maps, equal to:
    127  *
    128  *              (floor(log2(max(width, height))) + 1;
    129  *
    130  *  In each iteration, make sure that type of the uniform (as reported by
    131  *  glGetActiveUniform() and glGetProgramResourceiv() ) used for the test
    132  *  iteration is valid.
    133  **/
    134 class TextureCubeMapArraySamplingTest : public TestCaseBase
    135 {
    136 public:
    137 	/* Public methods */
    138 	TextureCubeMapArraySamplingTest(Context& context, const ExtParameters& extParams, const char* name,
    139 									const char* description);
    140 
    141 	virtual ~TextureCubeMapArraySamplingTest(void)
    142 	{
    143 	}
    144 
    145 	virtual IterateResult iterate(void);
    146 
    147 private:
    148 	/* Enums */
    149 	/** Identifies vertex attribute
    150 	 *
    151 	 **/
    152 	enum attributeId
    153 	{
    154 		Position,
    155 		TextureCoordinates,
    156 		TextureCoordinatesForGather,
    157 		Lod,
    158 		GradX,
    159 		GradY,
    160 		RefZ,
    161 	};
    162 
    163 	/** Identifies type of sampler
    164 	 *
    165 	 **/
    166 	enum samplerType
    167 	{
    168 		Float = 0,
    169 		Int,
    170 		UInt,
    171 		Depth,
    172 		Stencil
    173 	};
    174 
    175 	/** Identifies type of sampling function
    176 	 *
    177 	 **/
    178 	enum samplingFunction
    179 	{
    180 		Texture = 0,
    181 		TextureLod,
    182 		TextureGrad,
    183 		TextureGather,
    184 	};
    185 
    186 	/** Identifies shader stage
    187 	 *
    188 	 **/
    189 	enum shaderType
    190 	{
    191 		Compute = 0,
    192 		Fragment,
    193 		Geometry,
    194 		Tesselation_Control,
    195 		Tesselation_Evaluation,
    196 		Vertex
    197 	};
    198 
    199 	/* Structures */
    200 	/** Defines vertex attribute
    201 	 *
    202 	 **/
    203 	struct attributeDefinition
    204 	{
    205 		const glw::GLchar* name;
    206 		const glw::GLchar* type;
    207 		attributeId		   attribute_id;
    208 		int				   binding;
    209 	};
    210 
    211 	/** Provide set of "getComponents" routines
    212 	 *
    213 	 **/
    214 	struct componentProvider
    215 	{
    216 		void (*getColorFloatComponents)(glw::GLuint pixel_index, glw::GLint cube_face, glw::GLint layer_index,
    217 										glw::GLint n_layers, glw::GLint n_mipmap_levels, glw::GLfloat* out_components);
    218 
    219 		void (*getColorUByteComponents)(glw::GLuint pixel_index, glw::GLint cube_face, glw::GLint layer_index,
    220 										glw::GLint n_layers, glw::GLint n_mipmap_levels, glw::GLubyte* out_components);
    221 
    222 		void (*getColorUintComponents)(glw::GLuint pixel_index, glw::GLint cube_face, glw::GLint layer_index,
    223 									   glw::GLint n_layers, glw::GLint n_mipmap_levels, glw::GLuint* out_components);
    224 
    225 		void (*getColorIntComponents)(glw::GLuint pixel_index, glw::GLint cube_face, glw::GLint layer_index,
    226 									  glw::GLint n_layers, glw::GLint n_mipmap_levels, glw::GLint* out_components);
    227 
    228 		void (*getDepthComponents)(glw::GLuint pixel_index, glw::GLint cube_face, glw::GLint layer_index,
    229 								   glw::GLint n_layers, glw::GLint n_mipmap_levels, glw::GLfloat* out_components);
    230 
    231 		void (*getStencilComponents)(glw::GLuint pixel_index, glw::GLint cube_face, glw::GLint layer_index,
    232 									 glw::GLint n_layers, glw::GLint n_mipmap_levels, glw::GLuint* out_components);
    233 
    234 		void (*getCompressedComponents)(glw::GLuint pixel_index, glw::GLint cube_face, glw::GLint layer_index,
    235 										glw::GLint n_layers, glw::GLint n_mipmap_levels, glw::GLubyte* out_components);
    236 	};
    237 
    238 	/** Defines a GL "format"
    239 	 *
    240 	 **/
    241 	struct formatInfo
    242 	{
    243 		formatInfo(glw::GLenum internal_format, glw::GLenum format, glw::GLenum type, bool is_compressed);
    244 
    245 		glw::GLenum m_internal_format;
    246 		glw::GLenum m_format;
    247 		glw::GLenum m_type;
    248 		bool		m_is_compressed;
    249 	};
    250 
    251 	/** Defines type of sampler, source and destination GL formats
    252 	 *
    253 	 **/
    254 	struct formatDefinition
    255 	{
    256 		formatDefinition(glw::GLenum internal_format, glw::GLenum format, glw::GLenum type, bool is_compressed,
    257 						 samplerType sampler_type, const glw::GLchar* name);
    258 
    259 		formatDefinition(glw::GLenum src_internal_format, glw::GLenum src_format, glw::GLenum src_type,
    260 						 bool src_is_compressed, glw::GLenum dst_internal_format, glw::GLenum dst_format,
    261 						 glw::GLenum dst_type, samplerType sampler_type, const glw::GLchar* name);
    262 
    263 		formatInfo		   m_source;
    264 		formatInfo		   m_destination;
    265 		samplerType		   m_sampler_type;
    266 		const glw::GLchar* m_name;
    267 	};
    268 
    269 	/** Defines cube map texture resolution
    270 	 *
    271 	 **/
    272 	struct resolutionDefinition
    273 	{
    274 		resolutionDefinition(glw::GLuint width, glw::GLuint height, glw::GLuint depth);
    275 
    276 		glw::GLuint m_width;
    277 		glw::GLuint m_height;
    278 		glw::GLuint m_depth;
    279 	};
    280 
    281 	/** Defines sampling function
    282 	 *
    283 	 **/
    284 	struct samplingFunctionDefinition
    285 	{
    286 		samplingFunctionDefinition(samplingFunction function, const glw::GLchar* name);
    287 
    288 		samplingFunction   m_function;
    289 		const glw::GLchar* m_name;
    290 	};
    291 
    292 	/** Defines sampling shader stage and type of primitive used by draw call
    293 	 *
    294 	 **/
    295 	struct shaderConfiguration
    296 	{
    297 		shaderConfiguration(shaderType type, glw::GLenum primitive_type, const glw::GLchar* name);
    298 
    299 		shaderType		   m_type;
    300 		glw::GLenum		   m_primitive_type;
    301 		const glw::GLchar* m_name;
    302 	};
    303 
    304 	/* Typedefs */
    305 	typedef std::vector<formatDefinition>			formatsVectorType;
    306 	typedef std::vector<bool>						mutablitiesVectorType;
    307 	typedef std::vector<resolutionDefinition>		resolutionsVectorType;
    308 	typedef std::vector<samplingFunctionDefinition> samplingFunctionsVectorType;
    309 	typedef std::vector<shaderConfiguration>		shadersVectorType;
    310 
    311 	/* Classes */
    312 
    313 	/** Defines vertex buffer
    314 	 *
    315 	 **/
    316 	class bufferDefinition
    317 	{
    318 	public:
    319 		bufferDefinition();
    320 		~bufferDefinition();
    321 
    322 		void init(const glw::Functions& gl, glw::GLsizeiptr buffer_size, glw::GLvoid* buffer_data);
    323 
    324 		void bind(glw::GLenum target) const;
    325 		void bind(glw::GLenum target, glw::GLuint index) const;
    326 
    327 		static const glw::GLuint m_invalid_buffer_object_id;
    328 
    329 	private:
    330 		const glw::Functions* m_gl;
    331 		glw::GLuint			  m_buffer_object_id;
    332 	};
    333 
    334 	/** Defines a collection of vertex buffers for specific texture resolution
    335 	 *
    336 	 **/
    337 	class bufferCollection
    338 	{
    339 	public:
    340 		void init(const glw::Functions& gl, const formatDefinition& format, const resolutionDefinition& resolution);
    341 
    342 		bufferDefinition postion;
    343 		bufferDefinition texture_coordinate;
    344 		bufferDefinition texture_coordinate_for_gather;
    345 		bufferDefinition lod;
    346 		bufferDefinition grad_x;
    347 		bufferDefinition grad_y;
    348 		bufferDefinition refZ;
    349 	};
    350 
    351 	/** Wrapper for texture object id
    352 	 *
    353 	 **/
    354 	class textureDefinition
    355 	{
    356 	public:
    357 		textureDefinition();
    358 		~textureDefinition();
    359 
    360 		void init(const glw::Functions& gl);
    361 
    362 		void bind(glw::GLenum binding_point) const;
    363 
    364 		glw::GLuint getTextureId() const;
    365 
    366 		void setupImage(glw::GLuint image_unit, glw::GLenum internal_format);
    367 		void setupSampler(glw::GLuint texture_unit, const glw::GLchar* sampler_name, glw::GLuint program_id,
    368 						  bool is_shadow);
    369 
    370 		static const glw::GLuint m_invalid_uniform_location;
    371 		static const glw::GLuint m_invalid_texture_object_id;
    372 
    373 	private:
    374 		const glw::Functions* m_gl;
    375 		glw::GLuint			  m_texture_object_id;
    376 	};
    377 
    378 	/** Wrapper for shader object id
    379 	 *
    380 	 **/
    381 	class shaderDefinition
    382 	{
    383 	public:
    384 		shaderDefinition();
    385 		~shaderDefinition();
    386 
    387 		void init(const glw::Functions& gl, glw::GLenum shader_stage, const std::string& source,
    388 				  class TextureCubeMapArraySamplingTest* test);
    389 
    390 		bool compile();
    391 
    392 		void attach(glw::GLuint program_object_id) const;
    393 
    394 		glw::GLuint				 getShaderId() const;
    395 		static const glw::GLuint m_invalid_shader_object_id;
    396 
    397 		const std::string& getSource() const;
    398 
    399 	private:
    400 		const glw::Functions* m_gl;
    401 		glw::GLenum			  m_shader_stage;
    402 		std::string			  m_source;
    403 		glw::GLuint			  m_shader_object_id;
    404 	};
    405 
    406 	/** Defines a collection of shaders for specific sampling routine
    407 	 *
    408 	 **/
    409 	class shaderCollectionForSamplingRoutine
    410 	{
    411 	public:
    412 		shaderCollectionForSamplingRoutine() : m_sampling_function(Texture)
    413 		{
    414 		}
    415 
    416 		~shaderCollectionForSamplingRoutine()
    417 		{
    418 		}
    419 
    420 		void init(const glw::Functions& gl, const formatDefinition& format, const samplingFunction& sampling_function,
    421 				  TextureCubeMapArraySamplingTest& test);
    422 
    423 		shaderDefinition pass_through_vertex_shader;
    424 		shaderDefinition pass_through_tesselation_control_shader;
    425 
    426 		shaderDefinition sampling_compute_shader;
    427 		shaderDefinition sampling_fragment_shader;
    428 		shaderDefinition sampling_geometry_shader;
    429 		shaderDefinition sampling_tesselation_control_shader;
    430 		shaderDefinition sampling_tesselation_evaluation_shader;
    431 		shaderDefinition sampling_vertex_shader;
    432 
    433 		samplingFunction m_sampling_function;
    434 	};
    435 
    436 	/** Defines a complete set of shaders for one format and sampling routine
    437 	 *
    438 	 **/
    439 	struct shaderGroup
    440 	{
    441 		void init();
    442 
    443 		const shaderDefinition* pass_through_fragment_shader;
    444 		const shaderDefinition* pass_through_tesselation_control_shader;
    445 		const shaderDefinition* pass_through_tesselation_evaluation_shader;
    446 		const shaderDefinition* pass_through_vertex_shader;
    447 		const shaderDefinition* sampling_compute_shader;
    448 		const shaderDefinition* sampling_fragment_shader;
    449 		const shaderDefinition* sampling_geometry_shader;
    450 		const shaderDefinition* sampling_tesselation_control_shader;
    451 		const shaderDefinition* sampling_tesselation_evaluation_shader;
    452 		const shaderDefinition* sampling_vertex_shader;
    453 	};
    454 
    455 	/** Defines a collection of shaders for one format
    456 	 *
    457 	 **/
    458 	class shaderCollectionForTextureFormat
    459 	{
    460 	public:
    461 		shaderCollectionForTextureFormat()
    462 		{
    463 		}
    464 
    465 		~shaderCollectionForTextureFormat()
    466 		{
    467 		}
    468 
    469 		void init(const glw::Functions& gl, const formatDefinition& format,
    470 				  const samplingFunctionsVectorType& sampling_routines, TextureCubeMapArraySamplingTest& test);
    471 
    472 		void getShaderGroup(samplingFunction function, shaderGroup& shader_group) const;
    473 
    474 	private:
    475 		shaderDefinition pass_through_fragment_shader;
    476 		shaderDefinition pass_through_tesselation_control_shader;
    477 		shaderDefinition pass_through_tesselation_evaluation_shader;
    478 
    479 		typedef std::vector<shaderCollectionForSamplingRoutine> shaderCollectionForSamplingFunctionVectorType;
    480 		shaderCollectionForSamplingFunctionVectorType			per_sampling_routine;
    481 	};
    482 
    483 	/** Wrapper for program object id
    484 	 *
    485 	 **/
    486 	class programDefinition
    487 	{
    488 	public:
    489 		programDefinition();
    490 		~programDefinition();
    491 
    492 		void init(const glw::Functions& gl, const shaderGroup& shader_group, shaderType shader_type, bool isContextES);
    493 
    494 		bool link();
    495 
    496 		glw::GLuint				 getProgramId() const;
    497 		static const glw::GLuint m_invalid_program_object_id;
    498 
    499 		const shaderDefinition* getShader(shaderType shader_type) const;
    500 
    501 	private:
    502 		const shaderDefinition* compute_shader;
    503 		const shaderDefinition* geometry_shader;
    504 		const shaderDefinition* fragment_shader;
    505 		const shaderDefinition* tesselation_control_shader;
    506 		const shaderDefinition* tesselation_evaluation_shader;
    507 		const shaderDefinition* vertex_shader;
    508 
    509 		glw::GLuint m_program_object_id;
    510 
    511 	private:
    512 		const glw::Functions* m_gl;
    513 	};
    514 
    515 	/** Collection of programs for one sampling routine
    516 	 *
    517 	 **/
    518 	class programCollectionForFunction
    519 	{
    520 	public:
    521 		void init(const glw::Functions& gl, const shaderGroup& shader_group, TextureCubeMapArraySamplingTest& test,
    522 				  bool isContextES);
    523 
    524 		const programDefinition* getProgram(shaderType shader_type) const;
    525 
    526 	private:
    527 		programDefinition program_with_sampling_compute_shader;
    528 		programDefinition program_with_sampling_fragment_shader;
    529 		programDefinition program_with_sampling_geometry_shader;
    530 		programDefinition program_with_sampling_tesselation_control_shader;
    531 		programDefinition program_with_sampling_tesselation_evaluation_shader;
    532 		programDefinition program_with_sampling_vertex_shader;
    533 	};
    534 
    535 	/** Program collection for one format
    536 	 *
    537 	 **/
    538 	class programCollectionForFormat
    539 	{
    540 	public:
    541 		void init(const glw::Functions& gl, const shaderCollectionForTextureFormat& shader_collection,
    542 				  TextureCubeMapArraySamplingTest& test, bool isContextES);
    543 
    544 		const programCollectionForFunction* getPrograms(samplingFunction function) const;
    545 
    546 	private:
    547 		programCollectionForFunction m_programs_for_texture;
    548 		programCollectionForFunction m_programs_for_textureLod;
    549 		programCollectionForFunction m_programs_for_textureGrad;
    550 		programCollectionForFunction m_programs_for_textureGather;
    551 	};
    552 
    553 	/** Wrapper for vertex array object id
    554 	 *
    555 	 **/
    556 	class vertexArrayObjectDefinition
    557 	{
    558 	public:
    559 		vertexArrayObjectDefinition();
    560 		~vertexArrayObjectDefinition();
    561 
    562 		void init(const glw::Functions& gl, const formatDefinition& format, const samplingFunction& sampling_function,
    563 				  const bufferCollection& buffers, glw::GLuint program_id);
    564 
    565 	private:
    566 		void setupAttribute(const attributeDefinition& attribute, const bufferCollection& buffers,
    567 							glw::GLuint program_id);
    568 
    569 		static const glw::GLuint m_invalid_attribute_location;
    570 		static const glw::GLuint m_invalid_vertex_array_object_id;
    571 
    572 		const glw::Functions* m_gl;
    573 		glw::GLuint			  m_vertex_array_object_id;
    574 	};
    575 
    576 	/* Methods */
    577 	glw::GLuint checkUniformAndResourceApi(glw::GLuint program_id, const glw::GLchar* sampler_name,
    578 										   samplerType sampler_type);
    579 
    580 	void compile(shaderDefinition& info);
    581 
    582 	void dispatch(glw::GLuint program_id, glw::GLuint width, glw::GLuint height);
    583 
    584 	void draw(glw::GLuint program_id, glw::GLenum m_primitive_type, glw::GLuint n_vertices, glw::GLenum format);
    585 
    586 	static void getAttributes(samplerType sampler_type, const attributeDefinition*& out_attribute_definitions,
    587 							  glw::GLuint& out_n_attributes);
    588 
    589 	static void getAttributes(samplingFunction sampling_function, const attributeDefinition*& out_attribute_definitions,
    590 							  glw::GLuint& out_n_attributes);
    591 
    592 	void getColorType(samplerType sampler_type, const glw::GLchar*& out_color_type,
    593 					  const glw::GLchar*& out_interpolation_type, const glw::GLchar*& out_sampler_type,
    594 					  glw::GLuint& out_n_components, bool& out_is_shadow);
    595 
    596 	void getColorType(samplerType sampler_type, const glw::GLchar*& out_color_type,
    597 					  const glw::GLchar*& out_interpolation_type, const glw::GLchar*& out_sampler_type,
    598 					  const glw::GLchar*& out_image_type, const glw::GLchar*& out_image_format,
    599 					  glw::GLuint& out_n_components, bool& out_is_shadow);
    600 
    601 	void getPassThroughFragmentShaderCode(samplerType sampler_type, std::string& out_fragment_shader_code);
    602 
    603 	void getPassThroughTesselationControlShaderCode(const samplerType&		sampler_type,
    604 													const samplingFunction& sampling_function,
    605 													std::string&			out_tesselation_control_shader_code);
    606 
    607 	void getPassThroughTesselationEvaluationShaderCode(samplerType  sampler_type,
    608 													   std::string& out_tesselation_evaluation_shader_code);
    609 
    610 	void getPassThroughVertexShaderCode(const samplerType& sampler_type, const samplingFunction& sampling_function,
    611 										std::string& out_vertex_shader_code);
    612 
    613 	void getSamplingComputeShaderCode(const samplerType& sampler_type, const samplingFunction& sampling_function,
    614 									  std::string& out_vertex_shader_code);
    615 
    616 	void getSamplingFragmentShaderCode(const samplerType& sampler_type, const samplingFunction& sampling_function,
    617 									   std::string& out_fragment_shader_code);
    618 
    619 	void getSamplingFunctionCall(samplingFunction sampling_function, const glw::GLchar* color_type,
    620 								 glw::GLuint n_components, const glw::GLchar* attribute_name_prefix,
    621 								 const glw::GLchar* attribute_index, const glw::GLchar* color_variable_name,
    622 								 const glw::GLchar* color_variable_index, const glw::GLchar* sampler_name,
    623 								 std::string& out_code);
    624 
    625 	void getSamplingGeometryShaderCode(const samplerType& sampler_type, const samplingFunction& sampling_function,
    626 									   std::string& out_geometry_shader_code);
    627 
    628 	void getSamplingTesselationControlShaderCode(const samplerType&		 sampler_type,
    629 												 const samplingFunction& sampling_function,
    630 												 std::string&			 out_tesselation_control_shader_code);
    631 
    632 	void getSamplingTesselationEvaluationShaderCode(const samplerType&		sampler_type,
    633 													const samplingFunction& sampling_function,
    634 													std::string&			out_tesselation_evaluation_shader_code);
    635 
    636 	void getSamplingVertexShaderCode(const samplerType& sampler_type, const samplingFunction& sampling_function,
    637 									 std::string& out_vertex_shader_code);
    638 
    639 	void getShadowSamplingFunctionCall(samplingFunction sampling_function, const glw::GLchar* color_type,
    640 									   glw::GLuint n_components, const glw::GLchar* attribute_name_prefix,
    641 									   const glw::GLchar* attribute_index, const glw::GLchar* color_variable_name,
    642 									   const glw::GLchar* color_variable_index, const glw::GLchar* sampler_name,
    643 									   std::string& out_code);
    644 
    645 	static bool isSamplerSupportedByFunction(const samplerType sampler_type, const samplingFunction sampling_function);
    646 
    647 	void link(programDefinition& info);
    648 
    649 	void logCompilationLog(const shaderDefinition& info);
    650 
    651 	void logLinkingLog(const programDefinition& info);
    652 
    653 	void logProgram(const programDefinition& info);
    654 
    655 	void prepareCompresedTexture(const textureDefinition& texture, const formatDefinition& format,
    656 								 const resolutionDefinition& resolution, bool mutability);
    657 
    658 	void prepareTexture(const textureDefinition& texture, const formatDefinition& format,
    659 						const resolutionDefinition& resolution, bool mutability);
    660 
    661 	void setupSharedStorageBuffer(const attributeDefinition& attribute, const bufferCollection& buffers,
    662 								  glw::GLuint program_id);
    663 
    664 	void setupSharedStorageBuffers(const formatDefinition& format, const samplingFunction& sampling_function,
    665 								   const bufferCollection& buffers, glw::GLuint program_id);
    666 
    667 	void testFormats(formatsVectorType& formats, resolutionsVectorType& resolutions);
    668 
    669 	void testTexture(const formatDefinition& format, bool mutability, const resolutionDefinition& resolution,
    670 					 textureDefinition& texture, programCollectionForFormat& program_collection);
    671 
    672 	bool verifyResult(const formatDefinition& format, const resolutionDefinition& resolution,
    673 					  const samplingFunction sampling_function, unsigned char* data);
    674 
    675 	bool verifyResultHelper(const formatDefinition& format, const resolutionDefinition& resolution,
    676 							const componentProvider& component_provider, unsigned char* data);
    677 
    678 	/* Fields */
    679 	formatsVectorType			m_formats;
    680 	formatsVectorType			m_compressed_formats;
    681 	samplingFunctionsVectorType m_functions;
    682 	mutablitiesVectorType		m_mutabilities;
    683 	resolutionsVectorType		m_resolutions;
    684 	resolutionsVectorType		m_compressed_resolutions;
    685 	shadersVectorType			m_shaders;
    686 
    687 	glw::GLuint m_framebuffer_object_id;
    688 
    689 	/* Static variables */
    690 	static const glw::GLuint m_get_type_api_status_program_resource;
    691 	static const glw::GLuint m_get_type_api_status_uniform;
    692 
    693 	/* Fields */
    694 	glw::GLuint compiled_shaders;
    695 	glw::GLuint invalid_shaders;
    696 	glw::GLuint linked_programs;
    697 	glw::GLuint invalid_programs;
    698 	glw::GLuint tested_cases;
    699 	glw::GLuint failed_cases;
    700 	glw::GLuint invalid_type_cases;
    701 
    702 	/* Static variables */
    703 	static const glw::GLchar* const attribute_grad_x;
    704 	static const glw::GLchar* const attribute_grad_y;
    705 	static const glw::GLchar* const attribute_lod;
    706 	static const glw::GLchar* const attribute_refZ;
    707 	static const glw::GLchar* const attribute_texture_coordinate;
    708 	static const glw::GLchar* const compute_shader_body;
    709 	static const glw::GLchar* const compute_shader_layout_binding;
    710 	static const glw::GLchar* const compute_shader_buffer;
    711 	static const glw::GLchar* const compute_shader_color;
    712 	static const glw::GLchar* const compute_shader_image_store;
    713 	static const glw::GLchar* const compute_shader_layout;
    714 	static const glw::GLchar* const compute_shader_param;
    715 	static const glw::GLchar* const fragment_shader_input;
    716 	static const glw::GLchar* const fragment_shader_output;
    717 	static const glw::GLchar* const fragment_shader_pass_through_body_code;
    718 	static const glw::GLchar* const fragment_shader_sampling_body_code;
    719 	static const glw::GLchar* const geometry_shader_emit_vertex_code;
    720 	static const glw::GLchar* const geometry_shader_extension;
    721 	static const glw::GLchar* const geometry_shader_layout;
    722 	static const glw::GLchar* const geometry_shader_sampling_body_code;
    723 	static const glw::GLchar* const image_float;
    724 	static const glw::GLchar* const image_int;
    725 	static const glw::GLchar* const image_name;
    726 	static const glw::GLchar* const image_uint;
    727 	static const glw::GLchar* const interpolation_flat;
    728 	static const glw::GLchar* const sampler_depth;
    729 	static const glw::GLchar* const sampler_float;
    730 	static const glw::GLchar* const sampler_int;
    731 	static const glw::GLchar* const sampler_name;
    732 	static const glw::GLchar* const sampler_uint;
    733 	static const glw::GLchar* const shader_code_preamble;
    734 	static const glw::GLchar* const shader_precision;
    735 	static const glw::GLchar* const shader_input;
    736 	static const glw::GLchar* const shader_layout;
    737 	static const glw::GLchar* const shader_output;
    738 	static const glw::GLchar* const shader_uniform;
    739 	static const glw::GLchar* const shader_writeonly;
    740 	static const glw::GLchar* const tesselation_control_shader_layout;
    741 	static const glw::GLchar* const tesselation_control_shader_sampling_body_code;
    742 	static const glw::GLchar* const tesselation_control_shader_output;
    743 	static const glw::GLchar* const tesselation_evaluation_shader_input;
    744 	static const glw::GLchar* const tesselation_evaluation_shader_layout;
    745 	static const glw::GLchar* const tesselation_evaluation_shader_pass_through_body_code;
    746 	static const glw::GLchar* const tesselation_evaluation_shader_sampling_body_code;
    747 	static const glw::GLchar* const tesselation_shader_extension;
    748 	static const glw::GLchar* const texture_func;
    749 	static const glw::GLchar* const textureGather_func;
    750 	static const glw::GLchar* const textureGrad_func;
    751 	static const glw::GLchar* const textureLod_func;
    752 	static const glw::GLchar* const type_float;
    753 	static const glw::GLchar* const type_ivec4;
    754 	static const glw::GLchar* const type_uint;
    755 	static const glw::GLchar* const type_uvec4;
    756 	static const glw::GLchar* const type_vec3;
    757 	static const glw::GLchar* const type_vec4;
    758 	static const glw::GLchar* const vertex_shader_body_code;
    759 	static const glw::GLchar* const vertex_shader_input;
    760 	static const glw::GLchar* const vertex_shader_output;
    761 	static const glw::GLchar* const vertex_shader_position;
    762 };
    763 
    764 } /* glcts */
    765 
    766 #endif // _ESEXTCTEXTURECUBEMAPARRAYSAMPLING_HPP
    767