Home | History | Annotate | Download | only in gl
      1 #ifndef _GL3CTEXTURESIZEPROMOTION_HPP
      2 #define _GL3CTEXTURESIZEPROMOTION_HPP
      3 /*-------------------------------------------------------------------------
      4  * OpenGL Conformance Test Suite
      5  * -----------------------------
      6  *
      7  * Copyright (c) 2015-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  gl3cTextureSizePromotionTests.hpp
     28  * \brief Declares test classes for testing of texture internal format
     29  promotion mechanism.
     30  */ /*-------------------------------------------------------------------*/
     31 
     32 #include "glcTestCase.hpp"
     33 #include "glwDefs.hpp"
     34 #include "glwEnums.hpp"
     35 #include "tcuDefs.hpp"
     36 #include "tcuVector.hpp"
     37 
     38 namespace gl3cts
     39 {
     40 namespace TextureSizePromotion
     41 {
     42 /** Test group class for texture size promotion tests */
     43 class Tests : public deqp::TestCaseGroup
     44 {
     45 public:
     46 	/* Public member functions. */
     47 	Tests(deqp::Context& context); //!< Constructor.
     48 	virtual ~Tests()
     49 	{
     50 	} //!< Destructor
     51 
     52 	virtual void init(void); //!< Initialization member function.
     53 
     54 private:
     55 	/* Private member functions. */
     56 	Tests(const Tests&);			//!< Default copy constructor.
     57 	Tests& operator=(const Tests&); //!< Default assign constructor.
     58 };
     59 
     60 /** Functional Test Class
     61  *
     62  *  This test verifies that implementation correctly selects sizes and types
     63  *  when sized internal format is requested for a texture.
     64  *
     65  *  This test should be executed only if context is at least 3.1.
     66  *
     67  *  Steps:
     68  *   - prepare a source texture so that each channel is filled with specific value;
     69  *   - execute GetTexLevelPrameter to query all TEXTURE_*_SIZE and TEXTURE_*_TYPE
     70  *     <pname>s corresponding with internal format of source texture; It is
     71  *     expected that:
     72  *      * reported sizes will be at least as specified;
     73  *      * reported types will be exactly as specified;
     74  *   - for each channel [R, G, B, A]:
     75  *      * prepare a 2D single channeled texture with format matching sampled
     76  *        channel and set it up as output color in framebuffer;
     77  *      * prepare a program that will implement the following snippet in the
     78  *        fragment stage and output the value of result:
     79  *
     80  *            result = texelFetch(source).C;
     81  *
     82  *      * clear output texture;
     83  *      * draw a full-screen quad;
     84  *      * verify that the output texture is filled with correct value;
     85  *
     86  *  Value is correct when:
     87  *   - it matches value assigned to the specified channel;
     88  *   - it is one for missing alpha channel;
     89  *   - it is zero for missing channel;
     90  *   - it is one for ONE;
     91  *   - it is zero for ZERO.
     92  *
     93  *  Repeat the steps for all supported sized internal formats and targets.
     94  *
     95  *  Depth-stencil textures can be sampled only via RED channel. Test should set
     96  *  DEPTH_STENCIL_TEXTURE_MODE to select which channel will be accessed.
     97  *
     98  *  For multisampled targets maximum supported number of samples should be used
     99  *  and fetch should be done to last sample.
    100  *
    101  *  Support of multisampled targets by TexParameter* routines was introduced in
    102  *  extension GL_ARB_texture_storage_multisample, which is part of core
    103  *  specification since 4.3.
    104  *
    105  *  List of required texture formats was changed in 4.4. Therefore the list of
    106  *  "supported sized internal formats" depends on context version.
    107  */
    108 class FunctionalTest : public deqp::TestCase
    109 {
    110 public:
    111 	/* Public member functions. */
    112 	FunctionalTest(deqp::Context& context);			//!< Functional test constructor.
    113 	virtual tcu::TestNode::IterateResult iterate(); //!< Member function to iterate over test cases.
    114 
    115 private:
    116 	/* Private member variables. */
    117 	glw::GLuint m_vao;				   //!< Vertex Array Object name.
    118 	glw::GLuint m_source_texture;	  //!< Source Texture  Object name.
    119 	glw::GLuint m_destination_texture; //!< Destination Texture Object name.
    120 	glw::GLuint m_framebuffer;		   //!< Framebuffer Object name.
    121 	glw::GLuint m_program;			   //!< Program Object name.
    122 	glw::GLint  m_max_samples;		   //!< Maximum samples available for usage in multisampled targets.
    123 
    124 	/* Private type definitions. */
    125 
    126 	/** Texture Internal Format Description structure
    127 	 */
    128 	struct TextureInternalFormatDescriptor
    129 	{
    130 		glu::ContextType   required_by_context;  //!< Minimum context version by which format is required.
    131 		glw::GLenum		   internal_format;		 //!< Texture internal format.
    132 		const glw::GLchar* internal_format_name; //!< String representing texture internal format.
    133 		bool			   is_sRGB;				 //!< Is this format described in sRGB space.
    134 		bool			   is_color_renderable;  //!< Is this format color renderable.
    135 
    136 		glw::GLint min_red_size;	 //!< Minimum required red     component resolution (in bits).
    137 		glw::GLint min_green_size;   //!< Minimum required green   component resolution (in bits).
    138 		glw::GLint min_blue_size;	//!< Minimum required blue    component resolution (in bits).
    139 		glw::GLint min_alpha_size;   //!< Minimum required alpha   component resolution (in bits).
    140 		glw::GLint min_depth_size;   //!< Minimum required depth   component resolution (in bits).
    141 		glw::GLint min_stencil_size; //!< Minimum required stencil component resolution (in bits).
    142 
    143 		glw::GLenum expected_red_type;   //!< Expected type of red   component.
    144 		glw::GLenum expected_green_type; //!< Expected type of green component.
    145 		glw::GLenum expected_blue_type;  //!< Expected type of blue  component.
    146 		glw::GLenum expected_alpha_type; //!< Expected type of alpha component.
    147 		glw::GLenum expected_depth_type; //!< Expected type of depth component.
    148 	};
    149 
    150 	/** Color channels enumeration
    151 	 */
    152 	enum ColorChannelSelector
    153 	{
    154 		RED_COMPONENT,   //!< Red   component.
    155 		GREEN_COMPONENT, //!< Green component.
    156 		BLUE_COMPONENT,  //!< Blue  component.
    157 		ALPHA_COMPONENT, //!< Alpha component (must be last color channel).
    158 		COMPONENTS_COUNT //!< Number of components.
    159 	};
    160 
    161 	/* Private class' static constants. */
    162 	static const glw::GLfloat s_source_texture_data_f[]; //!< Source texture for floating point type internal formats.
    163 	static const glw::GLfloat
    164 		s_source_texture_data_n[]; //!< Source texture for unsigned normalized integer type internal formats.
    165 	static const glw::GLfloat
    166 							 s_source_texture_data_sn[]; //!< Source texture for signed normalized integer type internal formats.
    167 	static const glw::GLint  s_source_texture_data_i[];  //!< Source texture for signed integer type internal formats.
    168 	static const glw::GLuint s_source_texture_data_ui[]; //!< Source texture for unsigned integer type internal formats.
    169 	static const glw::GLuint s_source_texture_size;		 //!< Linear size of the source texture.
    170 	static const glw::GLfloat s_destination_texture_data_f
    171 		[]; //!< Destination texture data (to be sure that it was overwritten) for floating point and normalized types internal formats.
    172 	static const glw::GLint s_destination_texture_data_i
    173 		[]; //!< Destination texture data (to be sure that it was overwritten) signed integer type internal formats.
    174 	static const glw::GLuint s_destination_texture_data_ui
    175 		[]; //!< Destination texture data (to be sure that it was overwritten) unsigned integer type internal formats.
    176 
    177 	static const glw::GLenum  s_source_texture_targets[];		//!< Targets to be tested.
    178 	static const glw::GLchar* s_source_texture_targets_names[]; //!< Targets' names (strings) for logging purpose.
    179 	static const glw::GLuint  s_source_texture_targets_count;   //!< Number of targets to be tested.
    180 
    181 	static const glw::GLchar* s_color_channel_names[]; //!< Color channel names (like in enum) for logging purpose.
    182 
    183 	static const glw::GLchar*
    184 							  s_vertex_shader_code; //!< Vertex shader source code for drawing quad depending on vertex ID of triangle strip.
    185 	static const glw::GLchar* s_fragment_shader_template; //!< Fragment shader source code template.
    186 
    187 	static const TextureInternalFormatDescriptor
    188 							 s_formats[]; //!< List of internal formats (and their descriptions) to be tested by Functional Test.
    189 	static const glw::GLuint s_formats_size; //!< number of internal format to be tested.
    190 
    191 	/* Private member functions. */
    192 
    193 	/** Generate and bind an empty Vertex Array Object.
    194 	 */
    195 	void prepareVertexArrayObject();
    196 
    197 	/** Generate, bind and upload source texture.
    198 	 *
    199 	 *  @param [in] descriptor      Internal format description.
    200 	 *  @param [in] target          Texture target to be used.
    201 	 */
    202 	void prepareSourceTexture(TextureInternalFormatDescriptor descriptor, glw::GLenum target);
    203 
    204 	/** Generate, bind and clean destination texture.
    205 	 *
    206 	 *  @param [in] descriptor      Internal format description.
    207 	 *  @param [in] target          Texture target to be used.
    208 	 */
    209 	void prepareDestinationTextureAndFramebuffer(TextureInternalFormatDescriptor descriptor, glw::GLenum target);
    210 
    211 	/** Preprocess, compile and linke GLSL program.
    212 	 *
    213 	 *  @param [in] target          Texture target to be used.
    214 	 *  @param [in] descriptor      Internal format description.
    215 	 *  @param [in] channel         Color channel to be tested.
    216 	 *
    217 	 *  @return Program name on success, 0 on failure.
    218 	 */
    219 	glw::GLuint prepareProgram(glw::GLenum target, TextureInternalFormatDescriptor descriptor,
    220 							   ColorChannelSelector channel);
    221 
    222 	/** Use GLSL program with source and destination textures.
    223 	 *
    224 	 *  @param [in] target          Texture target to be used.
    225 	 */
    226 	void makeProgramAndSourceTextureActive(glw::GLenum target);
    227 
    228 	/** Check source texture queries.
    229 	 *
    230 	 *  @param [in] descriptor      Internal format description.
    231 	 *  @param [in] target          Texture target to be used.
    232 	 */
    233 	bool checkSourceTextureSizeAndType(TextureInternalFormatDescriptor descriptor, glw::GLenum target);
    234 
    235 	/** Draw quad using GL_TRIANGLE_STRIP.
    236 	 */
    237 	void drawQuad();
    238 
    239 	/** Check rendered destination texture to match expected values.
    240 	 *
    241 	 *  @param [in] descriptor      Internal format description.
    242 	 *  @param [in] channel         Used color channel.
    243 	 *  @param [in] target          Texture target to be used.
    244 	 *  @param [in] target_name     Texture target name for logging purposes.
    245 	 *
    246 	 *  @return True if fetched value matches expected value within the range of precission, false otherwise.
    247 	 */
    248 	bool checkDestinationTexture(TextureInternalFormatDescriptor descriptor, ColorChannelSelector channel,
    249 								 glw::GLenum target, const glw::GLchar* target_name);
    250 
    251 	/** Clean source texture object.
    252 	 */
    253 	void cleanSourceTexture();
    254 
    255 	/** Clean framebuffer object.
    256 	 */
    257 	void cleanFramebuffer();
    258 
    259 	/** Clean destination texture object.
    260 	 */
    261 	void cleanDestinationTexture();
    262 
    263 	/** Clean program object.
    264 	 */
    265 	void cleanProgram();
    266 
    267 	/** Clean vertex array object object.
    268 	 */
    269 	void cleanVertexArrayObject();
    270 
    271 	/** Choose internal format of destination texture for rendered source texture.
    272 	 *
    273 	 *  @param [in] descriptor      Internal format description.
    274 	 */
    275 	glw::GLenum getDestinationFormatForChannel(TextureInternalFormatDescriptor descriptor);
    276 
    277 	/** Is internal format a floating type.
    278 	 *
    279 	 *  @param [in] descriptor      Internal format description.
    280 	 *
    281 	 *  @return True if internal format is floating point type, false otherwise.
    282 	 */
    283 	bool isFloatType(TextureInternalFormatDescriptor descriptor);
    284 
    285 	/** Is internal format a fixed signed type.
    286 	 *
    287 	 *  @param [in] descriptor      Internal format description.
    288 	 *
    289 	 *  @return True if internal format is fixed signed type, false otherwise.
    290 	 */
    291 	bool isFixedSignedType(TextureInternalFormatDescriptor descriptor);
    292 
    293 	/** Is internal format a fixed unsigned type.
    294 	 *
    295 	 *  @param [in] descriptor      Internal format description.
    296 	 *
    297 	 *  @return True if internal format is fixed unsigned type, false otherwise.
    298 	 */
    299 	bool isFixedUnsignedType(TextureInternalFormatDescriptor descriptor);
    300 
    301 	/** Is internal format a signed integral type.
    302 	 *
    303 	 *  @param [in] descriptor      Internal format description.
    304 	 *
    305 	 *  @return True if internal format is integral signed type, false otherwise.
    306 	 */
    307 	bool isIntegerSignedType(TextureInternalFormatDescriptor descriptor);
    308 
    309 	/** Is internal format an unsigned integral type.
    310 	 *
    311 	 *  @param [in] descriptor      Internal format description.
    312 	 *
    313 	 *  @return True if internal format is integral unsigned type, false otherwise.
    314 	 */
    315 	bool isIntegerUnsignedType(TextureInternalFormatDescriptor descriptor);
    316 
    317 	/** Is internal format a depth type.
    318 	 *
    319 	 *  @param [in] descriptor      Internal format description.
    320 	 *
    321 	 *  @return True if internal format is depth type, false otherwise.
    322 	 */
    323 	bool isDepthType(TextureInternalFormatDescriptor descriptor);
    324 
    325 	/** Is internal format a stencil type.
    326 	 *
    327 	 *  @param [in] descriptor      Internal format description.
    328 	 *
    329 	 *  @return True if internal format is stencil type, false otherwise.
    330 	 */
    331 	bool isStencilType(TextureInternalFormatDescriptor descriptor);
    332 
    333 	/** Is channel of internal format a none type (does not appear in the texture internal format).
    334 	 *
    335 	 *  @param [in] descriptor      Internal format description.
    336 	 *  @param [in] channel         Color channel to be queried.
    337 	 *
    338 	 *  @return True if internal format is none type, false otherwise.
    339 	 */
    340 	bool isChannelTypeNone(TextureInternalFormatDescriptor descriptor, ColorChannelSelector channel);
    341 
    342 	/** Calculate minimal required precission for internal format's channel.
    343 	 *
    344 	 *  @note It is needed only for floating point and normalized fixed point types.
    345 	 *
    346 	 *  @param [in] descriptor      Internal format description.
    347 	 *  @param [in] channel         Color channel to be queried.
    348 	 *
    349 	 *  @return Minimum precission.
    350 	 */
    351 	glw::GLfloat getMinPrecision(TextureInternalFormatDescriptor descriptor, ColorChannelSelector channel);
    352 
    353 	/** Is target multisample.
    354 	 *
    355 	 *  @param [in] target      Target.
    356 	 *
    357 	 *  @return True if target is multisampled, false otherwise.
    358 	 */
    359 	bool isTargetMultisampled(glw::GLenum target);
    360 
    361 	/** Render data to the source texture for multisampled texture.
    362 	 *
    363 	 *  @param [in] descriptor      Internal format description.
    364 	 *  @param [in] target          Texture target to be used.
    365 	 */
    366 	void renderDataIntoMultisampledTexture(TextureInternalFormatDescriptor descriptor, glw::GLenum target);
    367 
    368 	/** Convert value from sRGB space to linear space.
    369 	 *
    370 	 *  @param [in] value           Value to be converted (sRGB space).
    371 	 *
    372 	 *  @return Converted value (linear space).
    373 	 */
    374 	float convert_from_sRGB(float value);
    375 };
    376 /* class TextureSizePromotion */
    377 
    378 namespace Utilities
    379 {
    380 /** Build a GLSL program
    381  *
    382  *  @param [in]  gl                                     OpenGL Functions Access.
    383  *  @param [in]  log                                    Log outut.
    384  *  @param [in]  vertex_shader_source                   Pointer to C string of the vertex shader or NULL if not used.
    385  *  @param [in]  fragment_shader_source                 Pointer to C string of the fragment shader or NULL if not used.
    386  *
    387  *  @return OpenGL program shader ID or zero if error had occured.
    388  */
    389 glw::GLuint buildProgram(glw::Functions const& gl, tcu::TestLog& log, glw::GLchar const* const vertex_shader_source,
    390 						 glw::GLchar const* const fragment_shader_source);
    391 
    392 /** Preprocess source string by replacing key tokens with new values.
    393  *
    394  *  @param [in] source      Source string.
    395  *  @param [in] key         Key, substring to be replaced.
    396  *  @param [in] value       Value, substring to be substituted in place of key.
    397  *
    398  *  @return Preprocessed string.
    399  */
    400 std::string preprocessString(std::string source, std::string key, std::string value);
    401 
    402 /** @brief Convert an integer to a string.
    403  *
    404  *  @param [in] i       Integer to be converted.
    405  *
    406  *  @return String representing integer.
    407  */
    408 std::string itoa(glw::GLint i);
    409 }
    410 
    411 } /* TextureSizePromotion namespace */
    412 } /* gl3cts namespace */
    413 
    414 #endif // _GL3CTEXTURESIZEPROMOTION_HPP
    415