Home | History | Annotate | Download | only in gl
      1 #ifndef _GL4CTEXTUREVIEWTESTS_HPP
      2 #define _GL4CTEXTUREVIEWTESTS_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  gl4cTextureViewTests.hpp
     28  * \brief Declares test classes for "texture view" functionality.
     29  */ /*-------------------------------------------------------------------*/
     30 
     31 #include "glcTestCase.hpp"
     32 #include "glwDefs.hpp"
     33 #include "glwEnums.hpp"
     34 #include "tcuDefs.hpp"
     35 #include "tcuVector.hpp"
     36 
     37 namespace gl4cts
     38 {
     39 namespace TextureView
     40 {
     41 
     42 enum _format
     43 {
     44 	FORMAT_FLOAT,
     45 	FORMAT_RGBE,
     46 	FORMAT_SIGNED_INTEGER,
     47 	FORMAT_SNORM,
     48 	FORMAT_UNORM,
     49 	FORMAT_UNSIGNED_INTEGER,
     50 
     51 	FORMAT_UNDEFINED
     52 };
     53 
     54 enum _sampler_type
     55 {
     56 	SAMPLER_TYPE_FLOAT,
     57 	SAMPLER_TYPE_SIGNED_INTEGER,
     58 	SAMPLER_TYPE_UNSIGNED_INTEGER,
     59 
     60 	SAMPLER_TYPE_UNDEFINED
     61 };
     62 
     63 enum _view_class
     64 {
     65 	VIEW_CLASS_FIRST,
     66 
     67 	VIEW_CLASS_128_BITS = VIEW_CLASS_FIRST,
     68 	VIEW_CLASS_96_BITS,
     69 	VIEW_CLASS_64_BITS,
     70 	VIEW_CLASS_48_BITS,
     71 	VIEW_CLASS_32_BITS,
     72 	VIEW_CLASS_24_BITS,
     73 	VIEW_CLASS_16_BITS,
     74 	VIEW_CLASS_8_BITS,
     75 	VIEW_CLASS_RGTC1_RED,
     76 	VIEW_CLASS_RGTC2_RG,
     77 	VIEW_CLASS_BPTC_UNORM,
     78 	VIEW_CLASS_BPTC_FLOAT,
     79 
     80 	/* Always last */
     81 	VIEW_CLASS_COUNT,
     82 	VIEW_CLASS_UNDEFINED = VIEW_CLASS_COUNT
     83 };
     84 
     85 } // namespace TextureView
     86 
     87 /** Helper class that implements various methods used across all Texture View tests. */
     88 class TextureViewUtilities
     89 {
     90 public:
     91 	/* Public type definitions */
     92 	typedef glw::GLenum _original_texture_internalformat;
     93 	typedef glw::GLenum _original_texture_target;
     94 	typedef glw::GLenum _view_texture_internalformat;
     95 	typedef glw::GLenum _view_texture_target;
     96 	typedef std::pair<_original_texture_internalformat, _view_texture_internalformat> _internalformat_pair;
     97 	typedef std::vector<glw::GLenum>		 _internalformats;
     98 	typedef _internalformats::const_iterator _internalformats_const_iterator;
     99 	typedef _internalformats::iterator		 _internalformats_iterator;
    100 	typedef std::pair<_original_texture_target, _view_texture_target> _texture_target_pair;
    101 	typedef std::vector<_internalformat_pair>				   _compatible_internalformat_pairs;
    102 	typedef _compatible_internalformat_pairs::const_iterator   _compatible_internalformat_pairs_const_iterator;
    103 	typedef std::vector<_texture_target_pair>				   _compatible_texture_target_pairs;
    104 	typedef _compatible_texture_target_pairs::const_iterator   _compatible_texture_target_pairs_const_iterator;
    105 	typedef std::vector<_internalformat_pair>				   _incompatible_internalformat_pairs;
    106 	typedef _incompatible_internalformat_pairs::const_iterator _incompatible_internalformat_pairs_const_iterator;
    107 	typedef _incompatible_internalformat_pairs::iterator	   _incompatible_internalformat_pairs_iterator;
    108 	typedef std::vector<_texture_target_pair>				   _incompatible_texture_target_pairs;
    109 	typedef _incompatible_texture_target_pairs::const_iterator _incompatible_texture_target_pairs_const_iterator;
    110 	typedef _incompatible_texture_target_pairs::iterator	   _incompatible_texture_target_pairs_iterator;
    111 
    112 	/* Public methods */
    113 
    114 	static unsigned int getAmountOfComponentsForInternalformat(const glw::GLenum internalformat);
    115 
    116 	static unsigned int getBlockSizeForCompressedInternalformat(const glw::GLenum internalformat);
    117 
    118 	static void getComponentSizeForInternalformat(const glw::GLenum internalformat, unsigned int* out_rgba_size);
    119 
    120 	static void getComponentSizeForType(const glw::GLenum type, unsigned int* out_rgba_size);
    121 
    122 	static const char* getErrorCodeString(const glw::GLint error_code);
    123 
    124 	static TextureView::_format getFormatOfInternalformat(const glw::GLenum internalformat);
    125 
    126 	static glw::GLenum getGLFormatOfInternalformat(const glw::GLenum internalformat);
    127 
    128 	static const char* getGLSLDataTypeForSamplerType(const TextureView::_sampler_type sampler_type,
    129 													 const unsigned int				  n_components);
    130 
    131 	static const char* getGLSLTypeForSamplerType(const TextureView::_sampler_type sampler_type);
    132 
    133 	static _incompatible_internalformat_pairs getIllegalTextureAndViewInternalformatCombinations();
    134 
    135 	static _incompatible_texture_target_pairs getIllegalTextureAndViewTargetCombinations();
    136 
    137 	static _internalformats getInternalformatsFromViewClass(TextureView::_view_class view_class);
    138 
    139 	static const char* getInternalformatString(const glw::GLenum internalformat);
    140 
    141 	static _compatible_internalformat_pairs getLegalTextureAndViewInternalformatCombinations();
    142 
    143 	static _compatible_texture_target_pairs getLegalTextureAndViewTargetCombinations();
    144 
    145 	static void getMajorMinorVersionFromContextVersion(const glu::ContextType& context_type,
    146 													   glw::GLint* out_major_version, glw::GLint* out_minor_version);
    147 
    148 	static TextureView::_sampler_type getSamplerTypeForInternalformat(const glw::GLenum internalformat);
    149 
    150 	static unsigned int getTextureDataSize(const glw::GLenum internalformat, const glw::GLenum type,
    151 										   const unsigned int width, const unsigned int height);
    152 
    153 	static const char* getTextureTargetString(const glw::GLenum texture_target);
    154 
    155 	static glw::GLenum getTypeCompatibleWithInternalformat(const glw::GLenum internalformat);
    156 
    157 	static TextureView::_view_class getViewClassForInternalformat(const glw::GLenum internalformat);
    158 
    159 	static void initTextureStorage(const glw::Functions& gl, bool init_mutable_to, glw::GLenum texture_target,
    160 								   glw::GLint texture_depth, glw::GLint texture_height, glw::GLint texture_width,
    161 								   glw::GLenum texture_internalformat, glw::GLenum texture_format,
    162 								   glw::GLenum texture_type, unsigned int n_levels_needed,
    163 								   unsigned int n_cubemaps_needed, glw::GLint bo_id);
    164 
    165 	static bool isInternalformatCompatibleForTextureView(glw::GLenum original_internalformat,
    166 														 glw::GLenum view_internalformat);
    167 
    168 	static bool isInternalformatCompressed(const glw::GLenum internalformat);
    169 
    170 	static bool isInternalformatSRGB(const glw::GLenum internalformat);
    171 
    172 	static bool isInternalformatSupported(glw::GLenum internalformat, const glw::GLint major_version,
    173 										  const glw::GLint minor_version);
    174 
    175 	static bool isLegalTextureTargetForTextureView(glw::GLenum original_texture_target,
    176 												   glw::GLenum view_texture_target);
    177 };
    178 
    179 /**
    180  *   1. Make sure glGetTexParameterfv() and glGetTexParameteriv() report
    181  *      correct values for the following texture view-specific
    182  *      properties:
    183  *
    184  *      * GL_TEXTURE_IMMUTABLE_LEVELS; (in texture view-specific context
    185  *                                      only)
    186  *      * GL_TEXTURE_VIEW_MIN_LAYER;
    187  *      * GL_TEXTURE_VIEW_MIN_LEVEL;
    188  *      * GL_TEXTURE_VIEW_NUM_LAYERS;
    189  *      * GL_TEXTURE_VIEW_NUM_LEVELS;
    190  *
    191  *      These properties should be set to 0 (or GL_FALSE) by default.
    192  *      For textures created with glTexStorage() and glTextureView()
    193  *      functions, language from bullet (11) of GL_ARB_texture_view
    194  *      extension specification applies, as well as "Texture Views"
    195  *      section 8.18 of OpenGL 4.3 Core Profile specification.
    196  *
    197  *      The conformance test should check values of the aforementioned
    198  *      properties for the following objects:
    199  *
    200  *      1) mutable texture objects generated with glTexImage*D() calls,
    201  *         then bound to all supported texture targets (as described
    202  *         under (*) ).
    203  *      2) immutable texture objects generated with glTexStorage*D() calls
    204  *         for all supported texture targets (as described under (*) ).
    205  *      3) texture views using all texture targets (as described under
    206  *         (*) ) compatible with parent texture object's texture target.
    207  *         All texture targets should be considered for the parent object.
    208  *      4) texture views created on top of texture views described in 3).
    209  *
    210  *      For texture view cases, the test should verify that:
    211  *
    212  *      1) GL_TEXTURE_VIEW_NUM_LAYERS and GL_TEXTURE_VIEW_NUM_LEVELS are
    213  *         clamped as specified for cases where <numlayers> or <numlevels>
    214  *         arguments used for glTextureView() calls exceed beyond the
    215  *         original texture.
    216  *      2) GL_TEXTURE_VIEW_MIN_LEVEL is set to <minlevel> + value of
    217  *         GL_TEXTURE_VIEW_MIN_LEVEL from the original texture.
    218  *      3) GL_TEXTURE_VIEW_MIN_LAYER is set to <minlayer> + value of
    219  *         GL_TEXTURE_VIEW_MIN_LAYER from the original texture.
    220  *      4) GL_TEXTURE_VIEW_NUM_LEVELS is set to the lesser of <numlevels>
    221  *         and the value of original texture's GL_TEXTURE_VIEW_NUM_LEVELS
    222  *         minus <minlevels>.
    223  *      5) GL_TEXTURE_VIEW_NUM_LAYERS is set to the lesser of <numlayers>
    224  *         and the value of original texture's GL_TEXTURE_VIEW_NUM_LAYERS
    225  *         minus <minlayer>.
    226  *
    227  *      A single configuration of a texture object and a texture view
    228  *      for each valid texture target should be considered for the
    229  *      purpose of the test.
    230  *
    231  *      (*) Texture targets to use:
    232  *
    233  *      * GL_TEXTURE_1D;
    234  *      * GL_TEXTURE_1D_ARRAY;
    235  *      * GL_TEXTURE_2D;
    236  *      * GL_TEXTURE_2D_ARRAY;
    237  *      * GL_TEXTURE_2D_MULTISAMPLE;
    238  *      * GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
    239  *      * GL_TEXTURE_3D;
    240  *      * GL_TEXTURE_CUBE_MAP;
    241  *      * GL_TEXTURE_CUBE_MAP_ARRAY;
    242  *      * GL_TEXTURE_RECTANGLE;
    243  **/
    244 class TextureViewTestGetTexParameter : public deqp::TestCase
    245 {
    246 public:
    247 	/* Public methods */
    248 	TextureViewTestGetTexParameter(deqp::Context& context);
    249 
    250 	virtual ~TextureViewTestGetTexParameter()
    251 	{
    252 	}
    253 
    254 	virtual void						 deinit();
    255 	virtual tcu::TestNode::IterateResult iterate();
    256 
    257 private:
    258 	/* Private type definitions */
    259 	enum _test_texture_type
    260 	{
    261 		TEST_TEXTURE_TYPE_NO_STORAGE_ALLOCATED,
    262 		TEST_TEXTURE_TYPE_IMMUTABLE_TEXTURE_OBJECT,
    263 		TEST_TEXTURE_TYPE_MUTABLE_TEXTURE_OBJECT,
    264 		TEST_TEXTURE_TYPE_TEXTURE_VIEW_CREATED_FROM_IMMUTABLE_TEXTURE_OBJECT,
    265 		TEST_TEXTURE_TYPE_TEXTURE_VIEW_CREATED_FROM_TEXTURE_VIEW,
    266 
    267 		/* Always last */
    268 		TEST_TEXTURE_TYPE_UNDEFINED
    269 	};
    270 
    271 	struct _test_run
    272 	{
    273 		glw::GLint expected_n_immutable_levels;
    274 		glw::GLint expected_n_min_layer;
    275 		glw::GLint expected_n_min_level;
    276 		glw::GLint expected_n_num_layers;
    277 		glw::GLint expected_n_num_levels;
    278 
    279 		glw::GLuint parent_texture_object_id;
    280 		glw::GLuint texture_view_object_created_from_immutable_to_id;
    281 		glw::GLuint texture_view_object_created_from_view_to_id;
    282 
    283 		glw::GLenum		   texture_target;
    284 		_test_texture_type texture_type;
    285 
    286 		/* Constructor */
    287 		_test_run()
    288 		{
    289 			expected_n_immutable_levels = 0;
    290 			expected_n_min_layer		= 0;
    291 			expected_n_min_level		= 0;
    292 			expected_n_num_layers		= 0;
    293 			expected_n_num_levels		= 0;
    294 
    295 			parent_texture_object_id						 = 0;
    296 			texture_view_object_created_from_immutable_to_id = 0;
    297 			texture_view_object_created_from_view_to_id		 = 0;
    298 
    299 			texture_target = GL_NONE;
    300 			texture_type   = TEST_TEXTURE_TYPE_UNDEFINED;
    301 		}
    302 	};
    303 
    304 	typedef std::vector<_test_run>	 _test_runs;
    305 	typedef _test_runs::const_iterator _test_runs_const_iterator;
    306 	typedef _test_runs::iterator	   _test_runs_iterator;
    307 
    308 	/* Private methods */
    309 	void initTestRuns();
    310 
    311 	/* Private fields */
    312 	_test_runs m_test_runs;
    313 };
    314 
    315 /** Verify glTextureView() generates errors as described in the
    316  *  specification:
    317  *
    318  *  a) GL_INVALID_VALUE should be generated if <texture> is 0.
    319  *  b) GL_INVALID_OPERATION should be generated if <texture> is not
    320  *     a valid name returned by glGenTextures().
    321  *  c) GL_INVALID_OPERATION should be generated if <texture> has
    322  *     already been bound and given a target.
    323  *  d) GL_INVALID_VALUE should be generated if <origtexture> is not
    324  *     the name of a texture object.
    325  *  e) GL_INVALID_OPERATION error should be generated if <origtexture>
    326  *     is a mutable texture object.
    327  *  f) GL_INVALID_OPERATION error should be generated whenever the
    328  *     application tries to generate a texture view for a target
    329  *     that is incompatible with original texture's target. (as per
    330  *     table 8.20 from OpenGL 4.4 specification)
    331  *
    332  *    NOTE: All invalid original+view texture target combinations
    333  *          should be checked.
    334  *
    335  *  g) GL_INVALID_OPERATION error should be generated whenever the
    336  *     application tries to create a texture view, internal format
    337  *     of which can be found in table 8.21 of OpenGL 4.4
    338  *     specification, and the texture view's internal format is
    339  *     incompatible with parent object's internal format. Both
    340  *     textures and views should be used as parent objects for the
    341  *     purpose of the test.
    342  *
    343  *     NOTE: All invalid texture view internal formats should be
    344  *           checked for all applicable original object's internal
    345  *           formats.
    346  *
    347  *  h) GL_INVALID_OPERATION error should be generated whenever the
    348  *     application tries to create a texture view using an internal
    349  *     format that does not match the original texture's, and the
    350  *     original texture's internalformat cannot be found in table
    351  *     8.21 of OpenGL 4.4 specification.
    352  *
    353  *     NOTE: All required base, sized and compressed texture internal
    354  *           formats (as described in section 8.5.1 and table 8.14
    355  *           of OpenGL 4.4 specification) that cannot be found in
    356  *           table 8.21 should be considered for the purpose of this
    357  *           test.
    358  *
    359  *  i) GL_INVALID_VALUE error should be generated if <minlevel> is
    360  *     larger than the greatest level of <origtexture>.
    361  *  j) GL_INVALID_VALUE error should be generated if <minlayer> is
    362  *     larger than the greatest layer of <origtexture>.
    363  *  k) GL_INVALID_VALUE error should be generated if <target> is
    364  *     GL_TEXTURE_CUBE_MAP and <numlayers> is not 6.
    365  *  l) GL_INVALID_VALUE error should be generated if <target> is
    366  *     GL_TEXTURE_CUBE_MAP_ARRAY and <numlayers> is not a multiple
    367  *     of 6.
    368  *  m) GL_INVALID_VALUE error should be generated if <target> is
    369  *     GL_TEXTURE_1D and <numlayers> is not 1;
    370  *  n) GL_INVALID_VALUE error should be generated if <target> is
    371  *     GL_TEXTURE_2D and <numlayers> is not 1;
    372  *  o) GL_INVALID_VALUE error should be generated if <target> is
    373  *     GL_TEXTURE_3D and <numlayers> is not 1;
    374  *  p) GL_INVALID_VALUE error should be generated if <target> is
    375  *     GL_TEXTURE_RECTANGLE and <numlayers> is not 1;
    376  *  q) GL_INVALID_VALUE error should be generated if <target> is
    377  *     GL_TEXTURE_2D_MULTISAMPLE and <numlayers> is not 1;
    378  *  r) GL_INVALID_OPERATION error should be generated if <target> is
    379  *     GL_TEXTURE_CUBE_MAP and original texture's width does not
    380  *     match original texture's height for all levels.
    381  *  s) GL_INVALID_OPERATION error should be generated if <target> is
    382  *     GL_TEXTURE_CUBE_MAP_ARRAY and original texture's width does
    383  *     not match original texture's height for all levels.
    384  *
    385  *  NOTE: GL_INVALID_OPERATION error should also be generated for cases
    386  *        when any of the original texture's dimension is larger
    387  *        than the maximum supported corresponding dimension of the
    388  *        new target, but that condition can be very tricky to test
    389  *        in a portable manner. Hence, the conformance test will
    390  *        not verify if the error is generated as specified.
    391  *
    392  **/
    393 class TextureViewTestErrors : public deqp::TestCase
    394 {
    395 public:
    396 	/* Public methods */
    397 	TextureViewTestErrors(deqp::Context& context);
    398 
    399 	virtual ~TextureViewTestErrors()
    400 	{
    401 	}
    402 
    403 	virtual void deinit();
    404 
    405 	virtual tcu::TestNode::IterateResult iterate();
    406 
    407 private:
    408 	/* Private fields */
    409 	glw::GLuint m_bo_id;
    410 	glw::GLuint m_reference_immutable_to_1d_id;
    411 	glw::GLuint m_reference_immutable_to_2d_id;
    412 	glw::GLuint m_reference_immutable_to_2d_array_id;
    413 	glw::GLuint m_reference_immutable_to_2d_array_32_by_33_id;
    414 	glw::GLuint m_reference_immutable_to_2d_multisample_id;
    415 	glw::GLuint m_reference_immutable_to_3d_id;
    416 	glw::GLuint m_reference_immutable_to_cube_map_id;
    417 	glw::GLuint m_reference_immutable_to_cube_map_array_id;
    418 	glw::GLuint m_reference_immutable_to_rectangle_id;
    419 	glw::GLuint m_reference_mutable_to_2d_id;
    420 	glw::GLuint m_test_modified_to_id_1;
    421 	glw::GLuint m_test_modified_to_id_2;
    422 	glw::GLuint m_test_modified_to_id_3;
    423 	glw::GLuint m_view_bound_to_id;
    424 	glw::GLuint m_view_never_bound_to_id;
    425 };
    426 
    427 /** Verify that sampling data from texture views, that use internal
    428  *  format which is compatible with the original texture's internal
    429  *  format, works correctly.
    430  *
    431  *  For simplicity, both the parent object and its corresponding
    432  *  view should use the same GL_RGBA8 internal format. Both texture
    433  *  and view should be used as parent objects for the purpose of
    434  *  the test.
    435  *
    436  *  The test should iterate over all texture targets enlisted in
    437  *  table 8.20 from OpenGL 4.4 specification, excluding GL_TEXTURE_BUFFER.
    438  *  For each such texture target, an immutable texture object that
    439  *  will be used as original object should be created. The object
    440  *  should be defined as follows:
    441  *
    442  *  a) For 1D texture targets, width of 4 should be used.
    443  *  b) For 2D texture targets, width and height of 4 should be used.
    444  *  c) For 3D texture targets, depth, width and height of 4 should
    445  *     be used;
    446  *  d) Cube-map texture objects should use a 4x4 face size;
    447  *  e) Arrayed 1D/2D/cube-map texture objects should have a depth
    448  *     of 4.
    449  *  f) Each slice/face/layer-face mip-map should be filled with
    450  *     a static color. If original texture is multi-sampled, subsequent
    451  *     samples should be assigned a different color. Exact R/G/B/A
    452  *     intensities are arbitrary but they must be unique across all
    453  *     mip-maps and samples considered for a particular iteration.
    454  *     Mip-maps should *not* be generated - instead, it is expected
    455  *     the test will fill them manually with content using API (for
    456  *     non-multisampled cases), or by means of a simple FS+VS
    457  *     program (for multisampled render targets).
    458  *
    459  *  For each such original texture object, texture views should be
    460  *  created for all compatible texture targets. These views should
    461  *  be configured as below:
    462  *
    463  *  * minlayer:  1 (for arrayed/cube-map/cube-map arrayed views),
    464  *               0 otherwise;
    465  *  * numlayers: 12 (for cube-map arrayed views),
    466  *               6 (for cube-map views)
    467  *               2 (for arrayed views),
    468  *               1 otherwise;
    469  *
    470  *  * minlevel:  1;
    471  *  * numlevels: 2;
    472  *
    473  *  For testing purposes, the test should use the following rendering
    474  *  stages (forming a program object):
    475  *
    476  *  - Vertex shader;
    477  *  - Tessellation control;
    478  *  - Tessellation evaluation;
    479  *  - Geometry shader;         (should output a triangle strip forming
    480  *                              a full-screen quad);
    481  *  - Fragment shader;
    482  *
    483  *  In each stage (excluding fragment shader), as many samples as
    484  *  available (for multisample views) OR a single texel should be
    485  *  sampled at central (0.5, 0.5, ...) location using textureLod().
    486  *  The data should then be compared with reference values and the
    487  *  validation result should be passed to next stage using
    488  *  an output variable. Subsequent stages should pass validation results
    489  *  from all previous stages to following stages until geometry shader
    490  *  stage is reached. The information should be captured by the test
    491  *  using XFB and verified.
    492  *  Fragment shader should output a green colour, if the sampling
    493  *  operation returned a valid set of colors for (U, V) location,
    494  *  corresponding to rasterized fragment location, red otherwise.
    495  *
    496  *  The test passes if the sampling operation worked correctly in
    497  *  all stages for all texture's internal format+view's internal
    498  *  format combinations.
    499  *
    500  **/
    501 class TextureViewTestViewSampling : public deqp::TestCase
    502 {
    503 public:
    504 	/* Public methods */
    505 	TextureViewTestViewSampling(deqp::Context& context);
    506 
    507 	virtual tcu::TestNode::IterateResult iterate();
    508 
    509 protected:
    510 	/* Protected methods */
    511 	virtual void deinit();
    512 
    513 private:
    514 	/* Private type declarations */
    515 	struct _reference_color_storage
    516 	{
    517 		tcu::Vec4* data;
    518 
    519 		unsigned int n_faces;
    520 		unsigned int n_layers;
    521 		unsigned int n_mipmaps;
    522 		unsigned int n_samples;
    523 
    524 		/** Constructor.
    525 		 *
    526 		 *  @param in_n_faces   Amount of faces to initialize the storage for.
    527 		 *                      Must not be 0.
    528 		 *  @param in_n_layers  Amount of layers to initialize the storage for.
    529 		 *                      Must not be 0.
    530 		 *  @param in_n_mipmaps Amount of mip-maps to initialize the storage for.
    531 		 *                      Must not be 0.
    532 		 *  @param in_n_samples Amount of samples to initialize the storage for.
    533 		 *                      Must not be 0.
    534 		 **/
    535 		explicit _reference_color_storage(const unsigned int in_n_faces, const unsigned int in_n_layers,
    536 										  const unsigned int in_n_mipmaps, const unsigned int in_n_samples)
    537 		{
    538 			DE_ASSERT(in_n_faces != 0);
    539 			DE_ASSERT(in_n_layers != 0);
    540 			DE_ASSERT(in_n_mipmaps != 0);
    541 			DE_ASSERT(in_n_samples != 0);
    542 
    543 			n_faces   = in_n_faces;
    544 			n_layers  = in_n_layers;
    545 			n_mipmaps = in_n_mipmaps;
    546 			n_samples = in_n_samples;
    547 
    548 			data = new tcu::Vec4[in_n_faces * in_n_layers * in_n_mipmaps * in_n_samples];
    549 		}
    550 
    551 		/** Destructor */
    552 		~_reference_color_storage()
    553 		{
    554 			if (data != DE_NULL)
    555 			{
    556 				delete[] data;
    557 
    558 				data = DE_NULL;
    559 			}
    560 		}
    561 	};
    562 
    563 	/* Private methods */
    564 	void deinitIterationSpecificProgramAndShaderObjects();
    565 	void deinitPerSampleFillerProgramAndShaderObjects();
    566 	void deinitTextureObjects();
    567 	bool executeTest();
    568 	void initIterationSpecificProgramObject();
    569 	void initParentTextureContents();
    570 	void initPerSampleFillerProgramObject();
    571 	void initTest();
    572 
    573 	void initTextureObject(bool is_view_texture, glw::GLenum texture_target, glw::GLenum view_texture_target);
    574 
    575 	tcu::Vec4 getRandomReferenceColor();
    576 
    577 	tcu::Vec4 getReferenceColor(unsigned int n_layer, unsigned int n_face, unsigned int n_mipmap,
    578 								unsigned int n_sample);
    579 
    580 	glw::GLint getMaxConformantSampleCount(glw::GLenum target, glw::GLenum internalFormat);
    581 
    582 	void resetReferenceColorStorage(unsigned int n_layers, unsigned int n_faces, unsigned int n_mipmaps,
    583 									unsigned int n_samples);
    584 
    585 	void setReferenceColor(unsigned int n_layer, unsigned int n_face, unsigned int n_mipmap, unsigned int n_sample,
    586 						   tcu::Vec4 color);
    587 
    588 	/* Private variables */
    589 	glw::GLuint m_bo_id;
    590 	glw::GLuint m_fs_id;
    591 	glw::GLuint m_gs_id;
    592 	glw::GLuint m_po_id;
    593 	glw::GLint  m_po_lod_location;
    594 	glw::GLint  m_po_n_face_location;
    595 	glw::GLint  m_po_reference_colors_location;
    596 	glw::GLint  m_po_texture_location;
    597 	glw::GLint  m_po_z_float_location;
    598 	glw::GLint  m_po_z_int_location;
    599 	glw::GLuint m_tc_id;
    600 	glw::GLuint m_te_id;
    601 	glw::GLuint m_vs_id;
    602 
    603 	glw::GLuint m_per_sample_filler_fs_id;
    604 	glw::GLuint m_per_sample_filler_gs_id;
    605 	glw::GLuint m_per_sample_filler_po_id;
    606 	glw::GLint  m_per_sample_filler_po_layer_id_location;
    607 	glw::GLint  m_per_sample_filler_po_reference_colors_location;
    608 	glw::GLuint m_per_sample_filler_vs_id;
    609 
    610 	glw::GLuint m_result_to_id;
    611 	glw::GLuint m_to_id;
    612 	glw::GLuint m_view_to_id;
    613 
    614 	glw::GLuint m_fbo_id;
    615 	glw::GLuint m_vao_id;
    616 
    617 	glw::GLint m_max_color_texture_samples_gl_value;
    618 
    619 	glw::GLuint m_iteration_parent_texture_depth;
    620 	glw::GLuint m_iteration_parent_texture_height;
    621 	glw::GLuint m_iteration_parent_texture_n_levels;
    622 	glw::GLuint m_iteration_parent_texture_n_samples;
    623 	glw::GLenum m_iteration_parent_texture_target;
    624 	glw::GLuint m_iteration_parent_texture_width;
    625 	glw::GLuint m_iteration_view_texture_minlayer;
    626 	glw::GLuint m_iteration_view_texture_numlayers;
    627 	glw::GLuint m_iteration_view_texture_minlevel;
    628 	glw::GLuint m_iteration_view_texture_numlevels;
    629 	glw::GLenum m_iteration_view_texture_target;
    630 
    631 	const glw::GLuint m_reference_texture_depth;
    632 	const glw::GLuint m_reference_texture_height;
    633 	const glw::GLuint m_reference_texture_n_mipmaps;
    634 	const glw::GLuint m_reference_texture_width;
    635 
    636 	_reference_color_storage* m_reference_color_storage;
    637 	unsigned char*			  m_result_data;
    638 };
    639 
    640 /** Verify view class functionality.
    641  *
    642  *  Consider all view classes presented in table 8.20 of OpenGL 4.4
    643  *  Specification. For each view class, consider all internal format
    644  *  combinations for the purpose of the test.
    645  *
    646  *  For each internal format, a texture object of specified internal
    647  *  format and of 2x2 base mip-map resolution should be used.
    648  *
    649  *  For each internal format, a program object consisting of a vertex
    650  *  shader stage should be used. The shader should sample all 4 texels
    651  *  of the view and store retrieved data in output variables.
    652  *  These values should then be XFBed to the test.
    653  *
    654  *  The test passes if all retrieved values for all pairs considered
    655  *  are found to be valid.
    656  *
    657  **/
    658 class TextureViewTestViewClasses : public deqp::TestCase
    659 {
    660 public:
    661 	/* Public methods */
    662 	TextureViewTestViewClasses(deqp::Context& context);
    663 
    664 	virtual tcu::TestNode::IterateResult iterate();
    665 
    666 protected:
    667 	/* Protected methods */
    668 	virtual void deinit();
    669 
    670 private:
    671 	/* Private methods */
    672 	void getComponentDataForByteAlignedInternalformat(const unsigned char* data, const unsigned int n_components,
    673 													  const unsigned int*		 component_sizes,
    674 													  const TextureView::_format format, void* result);
    675 
    676 	void initBufferObject(glw::GLenum texture_internalformat, glw::GLenum view_internalformat);
    677 
    678 	void initProgramObject(glw::GLenum texture_internalformat, glw::GLenum view_internalformat);
    679 
    680 	void initTest();
    681 
    682 	void initTextureObject(bool should_init_parent_texture, glw::GLenum texture_internalformat,
    683 						   glw::GLenum view_internalformat);
    684 
    685 	void verifyResultData(glw::GLenum texture_internalformat, glw::GLenum view_internalformat,
    686 						  const unsigned char* texture_data_ptr, const unsigned char* view_data_ptr);
    687 
    688 	/* Private fields */
    689 	glw::GLuint m_bo_id;
    690 	glw::GLuint m_po_id;
    691 	glw::GLuint m_to_id;
    692 	glw::GLuint m_to_temp_id;
    693 	glw::GLuint m_vao_id;
    694 	glw::GLuint m_view_to_id;
    695 	glw::GLuint m_vs_id;
    696 
    697 	unsigned char* m_decompressed_mipmap_data;
    698 	unsigned char* m_mipmap_data;
    699 
    700 	unsigned int	   m_bo_size;
    701 	bool			   m_has_test_failed;
    702 	const unsigned int m_texture_height;
    703 	const glw::GLenum  m_texture_unit_for_parent_texture;
    704 	const glw::GLenum  m_texture_unit_for_view_texture;
    705 	const unsigned int m_texture_width;
    706 	unsigned int	   m_view_data_offset;
    707 };
    708 
    709 /**
    710  *  Verify view/parent texture coherency.
    711  *
    712  *  Consider an original 2D texture of 64x64 base mip-map resolution,
    713  *  using GL_RGBA8 internal format, filled with horizontal linear
    714  *  gradient from (0.0, 0.1, 1.0, 1.0) to (1.0, 0.9, 0.0, 0.0).
    715  *  All subsequent mip-maps are to be generated by glGenerateMipmap().
    716  *
    717  *  A 2D texture view should be generated from this texture, using
    718  *  mipmaps from levels 1 to 2 (inclusive).
    719  *
    720  *  The test should verify the following scenarios are handled
    721  *  correctly by GL implementation:
    722  *
    723  *  1) glTexSubImage2D() should be used on the view to replace portion
    724  *     of the gradient with a static color. A vertex shader should
    725  *     then be used to sample the parent texture at central
    726  *     location of that sub-region and verify it has been replaced
    727  *     with the static color. Result of the comparison (true/false)
    728  *     should be XFBed and verified by the test; *No* memory barrier
    729  *     is to be used between the first two steps.
    730  *  2) The view should be updated as in step 1), with glTexSubImage2D()
    731  *     being replaced with glBlitFramebuffer(). A texture filled
    732  *     with a static color should be used as a source for the blitting
    733  *     operation.
    734  *  3) A program object should be used to fill the view with
    735  *     reversed (1.0, 0.9, 0.0, 0.0)->(0.0, 0.1, 1.0, 1.0) gradient.
    736  *     Contents of the parent texture should then be validated with
    737  *     another program object and the result should be verified by
    738  *     XFBing the comparison outcome, similar to what has been
    739  *     described for step 1). Again, *no* memory barrier is to be
    740  *     used in-between.
    741  *  4) The view should be bound to an image unit. The contents of
    742  *     that view should then be completely replaced with the reversed
    743  *     gradient by doing a sufficient amount of writes, assuming each vertex
    744  *     shader invocation performs a single store operation in an
    745  *     unique location. A GL_TEXTURE_FETCH_BARRIER_BIT memory
    746  *     barrier should be issued. The contents of the parent texture
    747  *     should then be verified, as described in step 1) and 3).
    748  *  5) The view should be updated as in step 4). However, this time
    749  *     a GL_TEXTURE_UPDATE_BARRIER_BIT memory barrier should be issued.
    750  *     The contents of the parent texture should then be read with
    751  *     a glGetTexImage() call and verified by the test.
    752  *
    753  *     (NOTE: cases 4) and 5) should only be executed on implementations
    754  *            reporting GL_ARB_shader_image_load_store extension
    755  *            support, owing to lack of glMemoryBarrier() support
    756  *            in OpenGL 4.0)
    757  *
    758  *  6), 7), 8), 9) Execute tests 1), 2), 3), 4), 5), replacing "texture
    759  *                 views" with "parent textures" and "parent textures"
    760  *                 with "texture views".
    761  */
    762 class TextureViewTestCoherency : public deqp::TestCase
    763 {
    764 public:
    765 	/* Public methods */
    766 	TextureViewTestCoherency(deqp::Context& context);
    767 
    768 	virtual void						 deinit();
    769 	virtual tcu::TestNode::IterateResult iterate();
    770 
    771 private:
    772 	/* Private type definitions */
    773 	enum _barrier_type
    774 	{
    775 		BARRIER_TYPE_NONE,
    776 		BARRIER_TYPE_TEXTURE_FETCH_BARRIER_BIT,
    777 		BARRIER_TYPE_TEXTURE_UPDATE_BUFFER_BIT
    778 	};
    779 
    780 	enum _texture_type
    781 	{
    782 		TEXTURE_TYPE_PARENT_TEXTURE,
    783 		TEXTURE_TYPE_TEXTURE_VIEW,
    784 		TEXTURE_TYPE_IMAGE
    785 	};
    786 
    787 	enum _verification_mean
    788 	{
    789 		VERIFICATION_MEAN_PROGRAM,
    790 		VERIFICATION_MEAN_GLGETTEXIMAGE
    791 	};
    792 
    793 	/* Private methods */
    794 	void checkAPICallCoherency(_texture_type texture_type, bool should_use_glTexSubImage2D);
    795 
    796 	void checkProgramWriteCoherency(_texture_type texture_type, bool should_use_images, _barrier_type barrier_type,
    797 									_verification_mean verification_mean);
    798 
    799 	unsigned char* getHorizontalGradientData() const;
    800 
    801 	void getReadPropertiesForTextureType(_texture_type texture_type, glw::GLuint* out_to_id,
    802 										 unsigned int* out_read_lod) const;
    803 
    804 	unsigned char* getStaticColorTextureData(unsigned int width, unsigned int height) const;
    805 
    806 	void getWritePropertiesForTextureType(_texture_type texture_type, glw::GLuint* out_to_id, unsigned int* out_width,
    807 										  unsigned int* out_height) const;
    808 
    809 	void initBufferObjects();
    810 	void initFBO();
    811 	void initPrograms();
    812 	void initTextureContents();
    813 	void initTextures();
    814 	void initVAO();
    815 
    816 	/* Private fields */
    817 	bool		m_are_images_supported;
    818 	glw::GLuint m_bo_id;
    819 	glw::GLuint m_draw_fbo_id;
    820 	glw::GLuint m_gradient_verification_po_id;
    821 	glw::GLint  m_gradient_verification_po_sample_exact_uv_location;
    822 	glw::GLint  m_gradient_verification_po_lod_location;
    823 	glw::GLint  m_gradient_verification_po_texture_location;
    824 	glw::GLuint m_gradient_verification_vs_id;
    825 	glw::GLint  m_gradient_image_write_image_size_location;
    826 	glw::GLuint m_gradient_image_write_po_id;
    827 	glw::GLuint m_gradient_image_write_vs_id;
    828 	glw::GLuint m_gradient_write_po_id;
    829 	glw::GLuint m_gradient_write_fs_id;
    830 	glw::GLuint m_gradient_write_vs_id;
    831 	glw::GLuint m_read_fbo_id;
    832 	glw::GLuint m_static_to_id;
    833 	glw::GLuint m_to_id;
    834 	glw::GLuint m_vao_id;
    835 	glw::GLuint m_view_to_id;
    836 	glw::GLint  m_verification_po_expected_color_location;
    837 	glw::GLint  m_verification_po_lod_location;
    838 	glw::GLuint m_verification_po_id;
    839 	glw::GLuint m_verification_vs_id;
    840 
    841 	unsigned char m_static_color_byte[4 /* rgba */];
    842 	float		  m_static_color_float[4 /* rgba */];
    843 
    844 	const unsigned int m_static_texture_height;
    845 	const unsigned int m_static_texture_width;
    846 	const unsigned int m_texture_height;
    847 	const unsigned int m_texture_n_components;
    848 	const unsigned int m_texture_n_levels;
    849 	const unsigned int m_texture_width;
    850 };
    851 
    852 /** Verify GL_TEXTURE_BASE_LEVEL and GL_TEXTURE_MAX_LEVEL are
    853  *  interpreted relative to the view, not to the original data
    854  *  store.
    855  *
    856  *  Consider original 2D texture of 64x64 base mip-map resolution,
    857  *  using GL_RGBA8 internal format, filled with:
    858  *
    859  *  * horizontal linear gradient from (0.0, 0.1, 0,2, 0.3) to
    860  *    (1.0, 0.9, 0.8, 0.7) at level 0;
    861  *  * horizontal linear gradient from (0.1, 0.2, 0.3, 0.4) to
    862  *    (0.9, 0.8, 0.7, 0.6) at level 1;
    863  *  * horizontal linear gradient from (0.2, 0.3, 0.4, 0.5) to
    864  *    (0.8, 0.7, 0.6, 0.5) at level 2;
    865  *  * ..and so on.
    866  *
    867  *  GL_TEXTURE_BASE_LEVEL of the texture should be set at 2,
    868  *  GL_TEXTURE_MAX_LEVEL of the texture should be set at 4.
    869  *
    870  *  A 2D texture view should be generated from this texture, using
    871  *  mipmaps from 0 to 5 (inclusive).
    872  *
    873  *  GL_TEXTURE_BASE_LEVEL of the view should be set at 1,
    874  *  GL_TEXTURE_MAX_LEVEL of the view should be set at 2.
    875  *
    876  *  The test should perform the following:
    877  *
    878  *  1) First, a FS+VS program should be executed twice. The vertex
    879  *     shader should output 4 vertices forming a triangle-strip, forming
    880  *     a quad spanning from (-1, -1, 0, 1) to (1, 1, 0, 1). Each
    881  *     vertex should be assigned a corresponding UV location.
    882  *     The fragment shader should sample input texture view with
    883  *     textureLod() at fragment-specific UV using LOD 0 in the
    884  *     first run, and LOD 1 in the second run.
    885  *     The sampled vec4 should be written into a draw buffer, to which
    886  *     a texture has been attached of exactly the same resolution
    887  *     and internal format as the input texture view's mip-map being
    888  *     processed at the time of invocation.
    889  *
    890  *     This pass should provide us with LOD 0 and LOD 1 texture data,
    891  *     as configured with GL_TEXTURE_BASE_LEVEL and
    892  *     GL_TEXTURE_MAX_LEVEL view parameters.
    893  *
    894  *  2) Having executed the aforementioned program, the test should
    895  *     download the textures that step 1 has rendered to using
    896  *     glGetTexImage() and verify correct mipmaps have been sampled
    897  *     by textureLod().
    898  *
    899  *  Test passes if the retrieved texture data is valid.
    900  **/
    901 class TextureViewTestBaseAndMaxLevels : public deqp::TestCase
    902 {
    903 public:
    904 	/* Public methods */
    905 	TextureViewTestBaseAndMaxLevels(deqp::Context& context);
    906 
    907 	virtual void						 deinit();
    908 	virtual tcu::TestNode::IterateResult iterate();
    909 
    910 private:
    911 	/* Private methods */
    912 	void initProgram();
    913 	void initTest();
    914 	void initTextures();
    915 
    916 	/* Private fields */
    917 	const unsigned int m_texture_height;
    918 	const unsigned int m_texture_n_components;
    919 	const unsigned int m_texture_n_levels;
    920 	const unsigned int m_texture_width;
    921 	const unsigned int m_view_height;
    922 	const unsigned int m_view_width;
    923 
    924 	unsigned char* m_layer_data_lod0;
    925 	unsigned char* m_layer_data_lod1;
    926 
    927 	glw::GLuint m_fbo_id;
    928 	glw::GLuint m_fs_id;
    929 	glw::GLuint m_po_id;
    930 	glw::GLint  m_po_lod_index_uniform_location;
    931 	glw::GLint  m_po_to_sampler_uniform_location;
    932 	glw::GLuint m_result_to_id;
    933 	glw::GLuint m_to_id;
    934 	glw::GLuint m_vao_id;
    935 	glw::GLuint m_view_to_id;
    936 	glw::GLuint m_vs_id;
    937 };
    938 
    939 /** Verify texture view reference counting is implemented correctly.
    940  *
    941  *  Parent texture object A should be an immutable 2D texture of
    942  *  64x64 resolution and of GL_RGBA8 internalformat. Each mip-map
    943  *  should be filled with a different static color.
    944  *
    945  *  View B should be created from texture A, and view C should be
    946  *  instantiated from view B. The views should use the same texture
    947  *  target and internalformat as texture A. <minlayer> and <minlevel>
    948  *  values of 0 should be used for view generation. All available
    949  *  texture layers and levels should be used for the views.
    950  *
    951  *  The test should:
    952  *
    953  *  a) Sample the texture and both views, make sure correct data can
    954  *     be sampled in VS stage;
    955  *  b) Delete texture A;
    956  *  c) Sample both views, make sure correct data can be sampled in
    957  *     VS stage;
    958  *  d) Delete view B;
    959  *  e) Sample view C, make sure correct data can be sampled in VS
    960  *     stage;
    961  *
    962  *  A program object consisting only of vertex shader should be used
    963  *  by the test. The shader should sample all mip-maps of the bound
    964  *  texture at (0.5, 0.5) and compare the retrieved texels against
    965  *  reference values. Comparison outcome should be XFBed back to
    966  *  the test implementation.
    967  *
    968  *  Test passes if the sampling operation is reported to work
    969  *  correctly for all steps.
    970  *
    971  **/
    972 class TextureViewTestReferenceCounting : public deqp::TestCase
    973 {
    974 public:
    975 	/* Public methods */
    976 	TextureViewTestReferenceCounting(deqp::Context& context);
    977 
    978 	virtual void						 deinit();
    979 	virtual tcu::TestNode::IterateResult iterate();
    980 
    981 private:
    982 	/* Private type definitions */
    983 	struct _norm_vec4
    984 	{
    985 		unsigned char rgba[4];
    986 
    987 		/* Constructor
    988 		 *
    989 		 * @param r Red value to store for the component
    990 		 * @param g Green value to store for the component
    991 		 * @param b Blue value to store for the component
    992 		 * @param a Alpha value to store for the component.
    993 		 */
    994 		explicit _norm_vec4(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
    995 		{
    996 			rgba[0] = r;
    997 			rgba[1] = g;
    998 			rgba[2] = b;
    999 			rgba[3] = a;
   1000 		}
   1001 	};
   1002 
   1003 	/* Private methods */
   1004 	void initProgram();
   1005 	void initTest();
   1006 	void initTextures();
   1007 	void initXFB();
   1008 
   1009 	/* Private variables */
   1010 	glw::GLuint m_bo_id;
   1011 	glw::GLuint m_parent_to_id;
   1012 	glw::GLuint m_po_id;
   1013 	glw::GLint  m_po_expected_texel_uniform_location;
   1014 	glw::GLint  m_po_lod_uniform_location;
   1015 	glw::GLuint m_vao_id;
   1016 	glw::GLuint m_view_to_id;
   1017 	glw::GLuint m_view_view_to_id;
   1018 	glw::GLuint m_vs_id;
   1019 
   1020 	const glw::GLuint m_texture_height;
   1021 	const glw::GLuint m_texture_n_levels;
   1022 	const glw::GLuint m_texture_width;
   1023 
   1024 	std::vector<_norm_vec4> m_mipmap_colors;
   1025 };
   1026 
   1027 /** Group class for texture view conformance tests */
   1028 class TextureViewTests : public deqp::TestCaseGroup
   1029 {
   1030 public:
   1031 	/* Public methods */
   1032 	TextureViewTests(deqp::Context& context);
   1033 	virtual ~TextureViewTests()
   1034 	{
   1035 	}
   1036 
   1037 	virtual void init(void);
   1038 
   1039 private:
   1040 	/* Private methods */
   1041 	TextureViewTests(const TextureViewTests&);
   1042 	TextureViewTests& operator=(const TextureViewTests&);
   1043 };
   1044 
   1045 } /* gl4cts namespace */
   1046 
   1047 #endif // _GL4CTEXTUREVIEWTESTS_HPP
   1048