Home | History | Annotate | Download | only in randomshaders
      1 /*-------------------------------------------------------------------------
      2  * drawElements Quality Program Random Shader Generator
      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 Generator Tester.
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "rsgProgramGenerator.hpp"
     25 #include "rsgProgramExecutor.hpp"
     26 #include "tcuSurface.hpp"
     27 #include "tcuImageIO.hpp"
     28 #include "rsgUtils.hpp"
     29 #include "deStringUtil.hpp"
     30 
     31 #include <iostream>
     32 #include <string>
     33 #include <cstdio>
     34 
     35 using std::string;
     36 
     37 void runTest (deUint32 seed)
     38 {
     39 	printf("Seed: %d\n", seed);
     40 
     41 	// Generate test program
     42 	try
     43 	{
     44 		rsg::ProgramParameters programParams;
     45 
     46 		programParams.seed = seed;
     47 		programParams.fragmentParameters.randomize			= true;
     48 		programParams.fragmentParameters.maxStatementDepth	= 3;
     49 
     50 		rsg::Shader				vertexShader(rsg::Shader::TYPE_VERTEX);
     51 		rsg::Shader				fragmentShader(rsg::Shader::TYPE_FRAGMENT);
     52 
     53 		rsg::ProgramGenerator generator;
     54 		generator.generate(programParams, vertexShader, fragmentShader);
     55 
     56 		std::cout << "Vertex shader:\n--\n"		<< vertexShader.getSource()		<< "--\n";
     57 		std::cout << "Fragment shader:\n--\n"	<< fragmentShader.getSource()	<< "--\n";
     58 
     59 		// Uniforms
     60 		std::vector<const rsg::ShaderInput*>	uniforms;
     61 		std::vector<rsg::VariableValue>			uniformValues;
     62 		de::Random								rnd(seed);
     63 		rsg::computeUnifiedUniforms(vertexShader, fragmentShader, uniforms);
     64 		rsg::computeUniformValues(rnd, uniformValues, uniforms);
     65 
     66 		// Render image
     67 		tcu::Surface			surface(64, 64);
     68 		rsg::ProgramExecutor	executor(surface.getAccess(), 3, 5);
     69 
     70 		executor.execute(vertexShader, fragmentShader, uniformValues);
     71 
     72 		string fileName = string("test-") + de::toString(seed) + ".png";
     73 		tcu::ImageIO::savePNG(surface.getAccess(), fileName.c_str());
     74 		std::cout << fileName << " written\n";
     75 	}
     76 	catch (const std::exception& e)
     77 	{
     78 		printf("Failed: %s\n", e.what());
     79 	}
     80 }
     81 
     82 int main (int argc, const char* const* argv)
     83 {
     84 	DE_UNREF(argc && argv);
     85 
     86 	for (int seed = 0; seed < 10; seed++)
     87 		runTest(seed);
     88 
     89 	return 0;
     90 }
     91