Add CTS_ARB_gl_spirv test implementation
[platform/upstream/VK-GL-CTS.git] / framework / randomshaders / rsgTest.cpp
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 }