Home | History | Annotate | Download | only in functional
      1 /*-------------------------------------------------------------------------
      2  * drawElements Quality Program OpenGL ES 3.0 Module
      3  * -------------------------------------------------
      4  *
      5  * Copyright 2014 The Android Open Source Project
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  *
     19  *//*!
     20  * \file
     21  * \brief Attribute location test
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "es3fAttribLocationTests.hpp"
     25 
     26 #include "glsAttributeLocationTests.hpp"
     27 
     28 #include "glw.h"
     29 
     30 using namespace deqp::gls::AttributeLocationTestUtil;
     31 using std::vector;
     32 
     33 namespace deqp
     34 {
     35 namespace gles3
     36 {
     37 namespace Functional
     38 {
     39 
     40 TestCaseGroup* createAttributeLocationTests	(Context& context)
     41 {
     42 	const AttribType	types[] =
     43 	{
     44 		AttribType("float",		1,  GL_FLOAT),
     45 		AttribType("vec2",		1,  GL_FLOAT_VEC2),
     46 		AttribType("vec3",		1,  GL_FLOAT_VEC3),
     47 		AttribType("vec4",		1,  GL_FLOAT_VEC4),
     48 
     49 		AttribType("mat2",		2,  GL_FLOAT_MAT2),
     50 		AttribType("mat3",		3,  GL_FLOAT_MAT3),
     51 		AttribType("mat4",		4,  GL_FLOAT_MAT4),
     52 
     53 		AttribType("int",		1,	GL_INT),
     54 		AttribType("ivec2",		1,	GL_INT_VEC2),
     55 		AttribType("ivec3",		1,	GL_INT_VEC3),
     56 		AttribType("ivec4",		1,	GL_INT_VEC4),
     57 
     58 		AttribType("uint",		1,	GL_UNSIGNED_INT),
     59 		AttribType("uvec2",		1,	GL_UNSIGNED_INT_VEC2),
     60 		AttribType("uvec3",		1,	GL_UNSIGNED_INT_VEC3),
     61 		AttribType("uvec4",		1,	GL_UNSIGNED_INT_VEC4),
     62 
     63 		AttribType("mat2x2",	2,	GL_FLOAT_MAT2),
     64 		AttribType("mat2x3",	2,	GL_FLOAT_MAT2x3),
     65 		AttribType("mat2x4",	2,	GL_FLOAT_MAT2x4),
     66 
     67 		AttribType("mat3x2",	3,	GL_FLOAT_MAT3x2),
     68 		AttribType("mat3x3",	3,	GL_FLOAT_MAT3),
     69 		AttribType("mat3x4",	3,	GL_FLOAT_MAT3x4),
     70 
     71 		AttribType("mat4x2",	4,	GL_FLOAT_MAT4x2),
     72 		AttribType("mat4x3",	4,	GL_FLOAT_MAT4x3),
     73 		AttribType("mat4x4",	4,	GL_FLOAT_MAT4)
     74 	};
     75 
     76 	const AttribType	es2Types[] =
     77 	{
     78 		AttribType("float",	1,  GL_FLOAT),
     79 		AttribType("vec2",	1,  GL_FLOAT_VEC2),
     80 		AttribType("vec3",	1,  GL_FLOAT_VEC3),
     81 		AttribType("vec4",	1,  GL_FLOAT_VEC4),
     82 
     83 		AttribType("mat2",	2,  GL_FLOAT_MAT2),
     84 		AttribType("mat3",	3,  GL_FLOAT_MAT3),
     85 		AttribType("mat4",	4,  GL_FLOAT_MAT4)
     86 	};
     87 
     88 	TestCaseGroup* const root = new TestCaseGroup (context, "attribute_location", "Attribute location tests");
     89 
     90 	// Basic bind attribute tests
     91 	{
     92 		TestCaseGroup* const bindAttributeGroup = new TestCaseGroup(context, "bind", "Basic bind attribute location tests.");
     93 
     94 		root->addChild(bindAttributeGroup);
     95 
     96 		for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
     97 		{
     98 			const AttribType& type = types[typeNdx];
     99 			bindAttributeGroup->addChild(new gls::BindAttributeTest(context.getTestContext(), context.getRenderContext(), type));
    100 		}
    101 	}
    102 
    103 	// Bind max number of attributes
    104 	{
    105 		TestCaseGroup* const bindMaxAttributeGroup = new TestCaseGroup(context, "bind_max_attributes", "Use bind with maximum number of attributes.");
    106 
    107 		root->addChild(bindMaxAttributeGroup);
    108 
    109 		for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
    110 		{
    111 			const AttribType& type = types[typeNdx];
    112 			bindMaxAttributeGroup->addChild(new gls::BindMaxAttributesTest(context.getTestContext(), context.getRenderContext(), type));
    113 		}
    114 	}
    115 
    116 	// Test aliasing
    117 	{
    118 		TestCaseGroup* const aliasingGroup = new TestCaseGroup(context, "bind_aliasing", "Test binding aliasing locations.");
    119 
    120 		root->addChild(aliasingGroup);
    121 
    122 		for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(es2Types); typeNdx++)
    123 		{
    124 			const AttribType& type = es2Types[typeNdx];
    125 
    126 			// Simple aliasing cases
    127 			aliasingGroup->addChild(new gls::BindAliasingAttributeTest(context.getTestContext(), context.getRenderContext(), type));
    128 
    129 			// For types which occupy more than one location. Alias second location.
    130 			if (type.getLocationSize() > 1)
    131 				aliasingGroup->addChild(new gls::BindAliasingAttributeTest(context.getTestContext(), context.getRenderContext(), type, 1));
    132 
    133 			// Use more than maximum attributes with aliasing
    134 			aliasingGroup->addChild(new gls::BindMaxAliasingAttributeTest(context.getTestContext(), context.getRenderContext(), type));
    135 
    136 			// Use more than maximum attributes but inactive
    137 			aliasingGroup->addChild(new gls::BindInactiveAliasingAttributeTest(context.getTestContext(), context.getRenderContext(), type));
    138 		}
    139 	}
    140 
    141 	// Test filling holes in attribute location
    142 	{
    143 		TestCaseGroup* const holeGroup = new TestCaseGroup(context, "bind_hole", "Bind all, but one attribute and leave hole in location space for it.");
    144 
    145 		root->addChild(holeGroup);
    146 
    147 		for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
    148 		{
    149 			const AttribType& type = types[typeNdx];
    150 
    151 			// Bind first location, leave hole size of type and fill rest of locations
    152 			holeGroup->addChild(new gls::BindHoleAttributeTest(context.getTestContext(), context.getRenderContext(), type));
    153 		}
    154 	}
    155 
    156 	// Test binding at different times
    157 	{
    158 		TestCaseGroup* const bindTimeGroup = new TestCaseGroup(context, "bind_time", "Bind time tests. Test binding at different stages.");
    159 
    160 		root->addChild(bindTimeGroup);
    161 
    162 		bindTimeGroup->addChild(new gls::PreAttachBindAttributeTest(context.getTestContext(), context.getRenderContext()));
    163 		bindTimeGroup->addChild(new gls::PreLinkBindAttributeTest(context.getTestContext(), context.getRenderContext()));
    164 		bindTimeGroup->addChild(new gls::PostLinkBindAttributeTest(context.getTestContext(), context.getRenderContext()));
    165 		bindTimeGroup->addChild(new gls::BindRelinkAttributeTest(context.getTestContext(), context.getRenderContext()));
    166 		bindTimeGroup->addChild(new gls::BindReattachAttributeTest(context.getTestContext(), context.getRenderContext()));
    167 	}
    168 
    169 	// Basic layout location attribute tests
    170 	{
    171 		TestCaseGroup* const layoutAttributeGroup = new TestCaseGroup(context, "layout", "Basic layout location tests.");
    172 
    173 		root->addChild(layoutAttributeGroup);
    174 
    175 		for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
    176 		{
    177 			const AttribType& type = types[typeNdx];
    178 			layoutAttributeGroup->addChild(new gls::LocationAttributeTest(context.getTestContext(), context.getRenderContext(), type));
    179 		}
    180 	}
    181 
    182 	// Test max attributes with layout locations
    183 	{
    184 		TestCaseGroup* const layoutMaxAttributeGroup = new TestCaseGroup(context, "layout_max_attributes", "Maximum attributes used with layout location qualifiers.");
    185 
    186 		root->addChild(layoutMaxAttributeGroup);
    187 
    188 		for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
    189 		{
    190 			const AttribType& type = types[typeNdx];
    191 			layoutMaxAttributeGroup->addChild(new gls::LocationMaxAttributesTest(context.getTestContext(), context.getRenderContext(), type));
    192 		}
    193 	}
    194 
    195 	// Test filling holes in attribute location
    196 	{
    197 		TestCaseGroup* const holeGroup = new TestCaseGroup(context, "layout_hole", "Define layout location for all, but one attribute consuming max attribute locations.");
    198 
    199 		root->addChild(holeGroup);
    200 
    201 		for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
    202 		{
    203 			const AttribType& type = types[typeNdx];
    204 
    205 			// Location first location, leave hole size of type and fill rest of locations
    206 			holeGroup->addChild(new gls::LocationHoleAttributeTest(context.getTestContext(), context.getRenderContext(), type));
    207 		}
    208 	}
    209 
    210 	// Basic mixed mixed attribute tests
    211 	{
    212 		TestCaseGroup* const mixedAttributeGroup = new TestCaseGroup(context, "mixed", "Basic mixed location tests.");
    213 
    214 		root->addChild(mixedAttributeGroup);
    215 
    216 		for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
    217 		{
    218 			const AttribType& type = types[typeNdx];
    219 			mixedAttributeGroup->addChild(new gls::MixedAttributeTest(context.getTestContext(), context.getRenderContext(), type));
    220 		}
    221 	}
    222 
    223 	{
    224 		TestCaseGroup* const mixedMaxAttributeGroup = new TestCaseGroup(context, "mixed_max_attributes", "Maximum attributes used with mixed binding and layout qualifiers.");
    225 
    226 		root->addChild(mixedMaxAttributeGroup);
    227 
    228 		for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
    229 		{
    230 			const AttribType& type = types[typeNdx];
    231 			mixedMaxAttributeGroup->addChild(new gls::MixedMaxAttributesTest(context.getTestContext(), context.getRenderContext(), type));
    232 		}
    233 	}
    234 
    235 	// Test mixed binding at different times
    236 	{
    237 		TestCaseGroup* const mixedTimeGroup = new TestCaseGroup(context, "mixed_time", "Bind time tests. Test binding at different stages.");
    238 
    239 		root->addChild(mixedTimeGroup);
    240 
    241 		mixedTimeGroup->addChild(new gls::PreAttachMixedAttributeTest(context.getTestContext(), context.getRenderContext()));
    242 		mixedTimeGroup->addChild(new gls::PreLinkMixedAttributeTest(context.getTestContext(), context.getRenderContext()));
    243 		mixedTimeGroup->addChild(new gls::PostLinkMixedAttributeTest(context.getTestContext(), context.getRenderContext()));
    244 		mixedTimeGroup->addChild(new gls::MixedRelinkAttributeTest(context.getTestContext(), context.getRenderContext()));
    245 		mixedTimeGroup->addChild(new gls::MixedReattachAttributeTest(context.getTestContext(), context.getRenderContext()));
    246 	}
    247 
    248 	{
    249 		TestCaseGroup* const holeGroup = new TestCaseGroup(context, "mixed_hole", "Use layout location qualifiers and binding. Leave hole in location space for only free attribute.");
    250 
    251 		root->addChild(holeGroup);
    252 
    253 		for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
    254 		{
    255 			const AttribType& type = types[typeNdx];
    256 
    257 			holeGroup->addChild(new gls::MixedHoleAttributeTest(context.getTestContext(), context.getRenderContext(), type));
    258 		}
    259 	}
    260 
    261 	// Test hole in location space that moves when relinking
    262 	{
    263 		TestCaseGroup* const relinkBindHoleGroup = new TestCaseGroup(context, "bind_relink_hole", "Test relinking with moving hole in attribute location space.");
    264 
    265 		root->addChild(relinkBindHoleGroup);
    266 
    267 		for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
    268 		{
    269 			const AttribType& type = types[typeNdx];
    270 
    271 			relinkBindHoleGroup->addChild(new gls::BindRelinkHoleAttributeTest(context.getTestContext(), context.getRenderContext(), type));
    272 		}
    273 	}
    274 
    275 	// Test hole in location space that moves when relinking
    276 	{
    277 		TestCaseGroup* const relinkMixedHoleGroup = new TestCaseGroup(context, "mixed_relink_hole", "Test relinking with moving hole in attribute location space.");
    278 
    279 		root->addChild(relinkMixedHoleGroup);
    280 
    281 		for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
    282 		{
    283 			const AttribType& type = types[typeNdx];
    284 
    285 			relinkMixedHoleGroup->addChild(new gls::MixedRelinkHoleAttributeTest(context.getTestContext(), context.getRenderContext(), type));
    286 		}
    287 	}
    288 
    289 	return root;
    290 }
    291 
    292 } // Functional
    293 } // gles3
    294 } // deqp
    295