1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/*-------------------------------------------------------------------------
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * drawElements Quality Program Random Shader Generator
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ----------------------------------------------------
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Copyright 2014 The Android Open Source Project
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
85e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) * you may not use this file except in compliance with the License.
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * You may obtain a copy of the License at
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *      http://www.apache.org/licenses/LICENSE-2.0
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * Unless required by applicable law or agreed to in writing, software
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * See the License for the specific language governing permissions and
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * limitations under the License.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *//*!
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \file
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \brief Random Shader Generator Tester.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *//*--------------------------------------------------------------------*/
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rsgProgramGenerator.hpp"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rsgProgramExecutor.hpp"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "tcuSurface.hpp"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "tcuImageIO.hpp"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rsgUtils.hpp"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "deStringUtil.hpp"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <iostream>
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string>
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <cstdio>
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing std::string;
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid runTest (deUint32 seed)
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	printf("Seed: %d\n", seed);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	// Generate test program
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	try
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	{
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		rsg::ProgramParameters programParams;
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)		programParams.seed = seed;
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci		programParams.fragmentParameters.randomize			= true;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci		programParams.fragmentParameters.maxStatementDepth	= 3;
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci		rsg::Shader				vertexShader(rsg::Shader::TYPE_VERTEX);
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci		rsg::Shader				fragmentShader(rsg::Shader::TYPE_FRAGMENT);
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci		rsg::ProgramGenerator generator;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		generator.generate(programParams, vertexShader, fragmentShader);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci		std::cout << "Vertex shader:\n--\n"		<< vertexShader.getSource()		<< "--\n";
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci		std::cout << "Fragment shader:\n--\n"	<< fragmentShader.getSource()	<< "--\n";
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		// Uniforms
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		std::vector<const rsg::ShaderInput*>	uniforms;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		std::vector<rsg::VariableValue>			uniformValues;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		de::Random								rnd(seed);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		rsg::computeUnifiedUniforms(vertexShader, fragmentShader, uniforms);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		rsg::computeUniformValues(rnd, uniformValues, uniforms);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		// Render image
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)		tcu::Surface			surface(64, 64);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		rsg::ProgramExecutor	executor(surface.getAccess(), 3, 5);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		executor.execute(vertexShader, fragmentShader, uniformValues);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		string fileName = string("test-") + de::toString(seed) + ".png";
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		tcu::ImageIO::savePNG(surface.getAccess(), fileName.c_str());
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		std::cout << fileName << " written\n";
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	}
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	catch (const std::exception& e)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	{
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		printf("Failed: %s\n", e.what());
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)	}
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int main (int argc, const char* const* argv)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	DE_UNREF(argc && argv);
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	for (int seed = 0; seed < 10; seed++)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)		runTest(seed);
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	return 0;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)