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 Random shader tests.
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "es3fRandomShaderTests.hpp"
     25 #include "glsRandomShaderCase.hpp"
     26 #include "deString.h"
     27 #include "deStringUtil.hpp"
     28 
     29 namespace deqp
     30 {
     31 namespace gles3
     32 {
     33 namespace Functional
     34 {
     35 
     36 namespace
     37 {
     38 
     39 gls::RandomShaderCase* createRandomShaderCase (Context& context, const char* description, const rsg::ProgramParameters& baseParams, deUint32 seed, bool vertex, bool fragment)
     40 {
     41 	rsg::ProgramParameters params = baseParams;
     42 
     43 	params.version						= rsg::VERSION_300;
     44 	params.seed							= seed;
     45 	params.vertexParameters.randomize	= vertex;
     46 	params.fragmentParameters.randomize	= fragment;
     47 
     48 	return new gls::RandomShaderCase(context.getTestContext(), context.getRenderContext(), de::toString(seed).c_str(), description, params);
     49 }
     50 
     51 class BasicExpressionGroup : public TestCaseGroup
     52 {
     53 public:
     54 	BasicExpressionGroup (Context& context)
     55 		: TestCaseGroup(context, "basic_expression", "Basic arithmetic expressions")
     56 	{
     57 	}
     58 
     59 	void init (void)
     60 	{
     61 		rsg::ProgramParameters params;
     62 
     63 		tcu::TestCaseGroup* vertexGroup = new tcu::TestCaseGroup(m_testCtx, "vertex", "Vertex-only tests");
     64 		addChild(vertexGroup);
     65 
     66 		tcu::TestCaseGroup* fragmentGroup = new tcu::TestCaseGroup(m_testCtx, "fragment", "Fragment-only tests");
     67 		addChild(fragmentGroup);
     68 
     69 		tcu::TestCaseGroup* combinedGroup = new tcu::TestCaseGroup(m_testCtx, "combined", "Combined tests");
     70 		addChild(combinedGroup);
     71 
     72 		for (int seed = 0; seed < 100; seed++)
     73 		{
     74 			vertexGroup->addChild(createRandomShaderCase(m_context,		"Random expressions in vertex shader",					params, seed, true, false));
     75 			fragmentGroup->addChild(createRandomShaderCase(m_context,	"Random expressions in fragment shader",				params, seed, false, true));
     76 			combinedGroup->addChild(createRandomShaderCase(m_context,	"Random expressions in vertex and fragment shaders",	params, seed, true, true));
     77 		}
     78 	}
     79 };
     80 
     81 class ScalarConversionGroup : public TestCaseGroup
     82 {
     83 public:
     84 	ScalarConversionGroup (Context& context)
     85 		: TestCaseGroup(context, "scalar_conversion", "Scalar conversions")
     86 	{
     87 	}
     88 
     89 	void init (void)
     90 	{
     91 		rsg::ProgramParameters params;
     92 		params.useScalarConversions = true;
     93 
     94 		tcu::TestCaseGroup* vertexGroup = new tcu::TestCaseGroup(m_testCtx, "vertex", "Vertex-only tests");
     95 		addChild(vertexGroup);
     96 
     97 		tcu::TestCaseGroup* fragmentGroup = new tcu::TestCaseGroup(m_testCtx, "fragment", "Fragment-only tests");
     98 		addChild(fragmentGroup);
     99 
    100 		tcu::TestCaseGroup* combinedGroup = new tcu::TestCaseGroup(m_testCtx, "combined", "Combined tests");
    101 		addChild(combinedGroup);
    102 
    103 		for (int seed = 0; seed < 100; seed++)
    104 		{
    105 			vertexGroup->addChild(createRandomShaderCase(m_context,		"Scalar conversions in vertex shader",					params, seed, true, false));
    106 			fragmentGroup->addChild(createRandomShaderCase(m_context,	"Scalar conversions in fragment shader",				params, seed, false, true));
    107 			combinedGroup->addChild(createRandomShaderCase(m_context,	"Scalar conversions in vertex and fragment shaders",	params, seed, true, true));
    108 		}
    109 	}
    110 };
    111 
    112 class SwizzleGroup : public TestCaseGroup
    113 {
    114 public:
    115 	SwizzleGroup (Context& context)
    116 		: TestCaseGroup(context, "swizzle", "Vector swizzles")
    117 	{
    118 	}
    119 
    120 	void init (void)
    121 	{
    122 		rsg::ProgramParameters params;
    123 		params.useScalarConversions = true;
    124 		params.useSwizzle			= true;
    125 
    126 		tcu::TestCaseGroup* vertexGroup = new tcu::TestCaseGroup(m_testCtx, "vertex", "Vertex-only tests");
    127 		addChild(vertexGroup);
    128 
    129 		tcu::TestCaseGroup* fragmentGroup = new tcu::TestCaseGroup(m_testCtx, "fragment", "Fragment-only tests");
    130 		addChild(fragmentGroup);
    131 
    132 		for (int seed = 0; seed < 50; seed++)
    133 		{
    134 			vertexGroup->addChild(createRandomShaderCase(m_context,		"Vector swizzles in vertex shader",		params, seed, true, false));
    135 			fragmentGroup->addChild(createRandomShaderCase(m_context,	"Vector swizzles in fragment shader",	params, seed, false, true));
    136 		}
    137 	}
    138 };
    139 
    140 class ComparisonOpsGroup : public TestCaseGroup
    141 {
    142 public:
    143 	ComparisonOpsGroup (Context& context)
    144 		: TestCaseGroup(context, "comparison_ops", "Comparison operators")
    145 	{
    146 	}
    147 
    148 	void init (void)
    149 	{
    150 		rsg::ProgramParameters params;
    151 		params.useScalarConversions = true;
    152 		params.useComparisonOps		= true;
    153 
    154 		tcu::TestCaseGroup* vertexGroup = new tcu::TestCaseGroup(m_testCtx, "vertex", "Vertex-only tests");
    155 		addChild(vertexGroup);
    156 
    157 		tcu::TestCaseGroup* fragmentGroup = new tcu::TestCaseGroup(m_testCtx, "fragment", "Fragment-only tests");
    158 		addChild(fragmentGroup);
    159 
    160 		for (int seed = 0; seed < 50; seed++)
    161 		{
    162 			vertexGroup->addChild(createRandomShaderCase(m_context,		"Comparison operators in vertex shader",		params, seed, true, false));
    163 			fragmentGroup->addChild(createRandomShaderCase(m_context,	"Comparison operators in fragment shader",		params, seed, false, true));
    164 		}
    165 	}
    166 };
    167 
    168 class ConditionalsGroup : public TestCaseGroup
    169 {
    170 public:
    171 	ConditionalsGroup (Context& context)
    172 		: TestCaseGroup(context, "conditionals", "Conditional control flow (if-else)")
    173 	{
    174 	}
    175 
    176 	void init (void)
    177 	{
    178 		rsg::ProgramParameters params;
    179 		params.useScalarConversions = true;
    180 		params.useSwizzle			= true;
    181 		params.useComparisonOps		= true;
    182 		params.useConditionals		= true;
    183 		params.vertexParameters.maxStatementDepth		= 4;
    184 		params.vertexParameters.maxStatementsPerBlock	= 5;
    185 		params.fragmentParameters.maxStatementDepth		= 4;
    186 		params.fragmentParameters.maxStatementsPerBlock	= 5;
    187 
    188 		tcu::TestCaseGroup* vertexGroup = new tcu::TestCaseGroup(m_testCtx, "vertex", "Vertex-only tests");
    189 		addChild(vertexGroup);
    190 
    191 		tcu::TestCaseGroup* fragmentGroup = new tcu::TestCaseGroup(m_testCtx, "fragment", "Fragment-only tests");
    192 		addChild(fragmentGroup);
    193 
    194 		tcu::TestCaseGroup* combinedGroup = new tcu::TestCaseGroup(m_testCtx, "combined", "Combined tests");
    195 		addChild(combinedGroup);
    196 
    197 		for (int seed = 0; seed < 100; seed++)
    198 		{
    199 			vertexGroup->addChild(createRandomShaderCase(m_context,		"Conditional control flow in vertex shader",				params, seed, true, false));
    200 			fragmentGroup->addChild(createRandomShaderCase(m_context,	"Conditional control flow in fragment shader",				params, seed, false, true));
    201 			combinedGroup->addChild(createRandomShaderCase(m_context,	"Conditional control flow in vertex and fragment shaders",	params, seed, true, true));
    202 		}
    203 	}
    204 };
    205 
    206 class TrigonometricGroup : public TestCaseGroup
    207 {
    208 public:
    209 	TrigonometricGroup (Context& context)
    210 		: TestCaseGroup(context, "trigonometric", "Trigonometric built-in functions")
    211 	{
    212 	}
    213 
    214 	void init (void)
    215 	{
    216 		rsg::ProgramParameters params;
    217 		params.useScalarConversions		= true;
    218 		params.useSwizzle				= true;
    219 		params.trigonometricBaseWeight	= 4.0f;
    220 
    221 		tcu::TestCaseGroup* vertexGroup = new tcu::TestCaseGroup(m_testCtx, "vertex", "Vertex-only tests");
    222 		addChild(vertexGroup);
    223 
    224 		tcu::TestCaseGroup* fragmentGroup = new tcu::TestCaseGroup(m_testCtx, "fragment", "Fragment-only tests");
    225 		addChild(fragmentGroup);
    226 
    227 		for (int seed = 0; seed < 100; seed++)
    228 		{
    229 			vertexGroup->addChild(createRandomShaderCase(m_context,		"Trigonometric ops in vertex shader",	params, seed, true, false));
    230 			fragmentGroup->addChild(createRandomShaderCase(m_context,	"Trigonometric ops in fragment shader",	params, seed, false, true));
    231 		}
    232 	}
    233 };
    234 
    235 class ExponentialGroup : public TestCaseGroup
    236 {
    237 public:
    238 	ExponentialGroup (Context& context)
    239 		: TestCaseGroup(context, "exponential", "Exponential built-in functions")
    240 	{
    241 	}
    242 
    243 	void init (void)
    244 	{
    245 		rsg::ProgramParameters params;
    246 		params.useScalarConversions		= true;
    247 		params.useSwizzle				= true;
    248 		params.exponentialBaseWeight	= 4.0f;
    249 
    250 		tcu::TestCaseGroup* vertexGroup = new tcu::TestCaseGroup(m_testCtx, "vertex", "Vertex-only tests");
    251 		addChild(vertexGroup);
    252 
    253 		tcu::TestCaseGroup* fragmentGroup = new tcu::TestCaseGroup(m_testCtx, "fragment", "Fragment-only tests");
    254 		addChild(fragmentGroup);
    255 
    256 		for (int seed = 0; seed < 100; seed++)
    257 		{
    258 			vertexGroup->addChild(createRandomShaderCase(m_context,		"Exponential ops in vertex shader",		params, seed, true, false));
    259 			fragmentGroup->addChild(createRandomShaderCase(m_context,	"Exponential ops in fragment shader",	params, seed, false, true));
    260 		}
    261 	}
    262 };
    263 
    264 class TextureGroup : public TestCaseGroup
    265 {
    266 public:
    267 	TextureGroup (Context& context)
    268 		: TestCaseGroup(context, "texture", "Texture lookups")
    269 	{
    270 	}
    271 
    272 	void init (void)
    273 	{
    274 		rsg::ProgramParameters params;
    275 		params.useScalarConversions						= true;
    276 		params.useSwizzle								= true;
    277 		params.vertexParameters.texLookupBaseWeight		= 10.0f;
    278 		params.vertexParameters.useTexture2D			= true;
    279 		params.vertexParameters.useTextureCube			= true;
    280 		params.fragmentParameters.texLookupBaseWeight	= 10.0f;
    281 		params.fragmentParameters.useTexture2D			= true;
    282 		params.fragmentParameters.useTextureCube		= true;
    283 
    284 		tcu::TestCaseGroup* vertexGroup = new tcu::TestCaseGroup(m_testCtx, "vertex", "Vertex-only tests");
    285 		addChild(vertexGroup);
    286 
    287 		tcu::TestCaseGroup* fragmentGroup = new tcu::TestCaseGroup(m_testCtx, "fragment", "Fragment-only tests");
    288 		addChild(fragmentGroup);
    289 
    290 		// Do only 50 vertex cases and 150 fragment cases.
    291 		for (int seed = 0; seed < 50; seed++)
    292 			vertexGroup->addChild(createRandomShaderCase(m_context,		"Texture lookups in vertex shader",		params, seed, true, false));
    293 
    294 		for (int seed = 0; seed < 150; seed++)
    295 			fragmentGroup->addChild(createRandomShaderCase(m_context,	"Texture lookups in fragment shader",	params, seed, false, true));
    296 	}
    297 };
    298 
    299 class AllFeaturesGroup : public TestCaseGroup
    300 {
    301 public:
    302 	AllFeaturesGroup (Context& context)
    303 		: TestCaseGroup(context, "all_features", "All features enabled")
    304 	{
    305 	}
    306 
    307 	void init (void)
    308 	{
    309 		rsg::ProgramParameters params;
    310 		params.useScalarConversions		= true;
    311 		params.useSwizzle				= true;
    312 		params.useComparisonOps			= true;
    313 		params.useConditionals			= true;
    314 		params.trigonometricBaseWeight	= 1.0f;
    315 		params.exponentialBaseWeight	= 1.0f;
    316 
    317 		params.vertexParameters.maxStatementDepth				= 4;
    318 		params.vertexParameters.maxStatementsPerBlock			= 7;
    319 		params.vertexParameters.maxExpressionDepth				= 7;
    320 		params.vertexParameters.maxCombinedVariableScalars		= 64;
    321 		params.fragmentParameters.maxStatementDepth				= 4;
    322 		params.fragmentParameters.maxStatementsPerBlock			= 7;
    323 		params.fragmentParameters.maxExpressionDepth			= 7;
    324 		params.fragmentParameters.maxCombinedVariableScalars	= 64;
    325 
    326 		params.fragmentParameters.texLookupBaseWeight		= 4.0f; // \note Texture lookups are enabled for fragment shaders only.
    327 		params.fragmentParameters.useTexture2D				= true;
    328 		params.fragmentParameters.useTextureCube			= true;
    329 
    330 		tcu::TestCaseGroup* vertexGroup = new tcu::TestCaseGroup(m_testCtx, "vertex", "Vertex-only tests");
    331 		addChild(vertexGroup);
    332 
    333 		tcu::TestCaseGroup* fragmentGroup = new tcu::TestCaseGroup(m_testCtx, "fragment", "Fragment-only tests");
    334 		addChild(fragmentGroup);
    335 
    336 		for (int seed = 0; seed < 100; seed++)
    337 		{
    338 			vertexGroup->addChild(createRandomShaderCase(m_context,		"Texture lookups in vertex shader",		params, seed, true, false));
    339 			fragmentGroup->addChild(createRandomShaderCase(m_context,	"Texture lookups in fragment shader",	params, seed, false, true));
    340 		}
    341 	}
    342 };
    343 
    344 } // anonymous
    345 
    346 RandomShaderTests::RandomShaderTests (Context& context)
    347 	: TestCaseGroup(context, "random", "Random shaders")
    348 {
    349 }
    350 
    351 RandomShaderTests::~RandomShaderTests (void)
    352 {
    353 }
    354 
    355 namespace
    356 {
    357 
    358 } // anonymous
    359 
    360 void RandomShaderTests::init (void)
    361 {
    362 	addChild(new BasicExpressionGroup	(m_context));
    363 	addChild(new ScalarConversionGroup	(m_context));
    364 	addChild(new SwizzleGroup			(m_context));
    365 	addChild(new ComparisonOpsGroup		(m_context));
    366 	addChild(new ConditionalsGroup		(m_context));
    367 	addChild(new TrigonometricGroup		(m_context));
    368 	addChild(new ExponentialGroup		(m_context));
    369 	addChild(new TextureGroup			(m_context));
    370 	addChild(new AllFeaturesGroup		(m_context));
    371 }
    372 
    373 } // Functional
    374 } // gles2
    375 } // deqp
    376