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)