1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * drawElements Quality Program Random Shader Generator
3e5c31af7Sopenharmony_ci * ----------------------------------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci *
11e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci * limitations under the License.
18e5c31af7Sopenharmony_ci *
19e5c31af7Sopenharmony_ci *//*!
20e5c31af7Sopenharmony_ci * \file
21e5c31af7Sopenharmony_ci * \brief Program generator.
22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "rsgProgramGenerator.hpp"
25e5c31af7Sopenharmony_ci#include "rsgShaderGenerator.hpp"
26e5c31af7Sopenharmony_ci#include "rsgGeneratorState.hpp"
27e5c31af7Sopenharmony_ci
28e5c31af7Sopenharmony_ciusing std::vector;
29e5c31af7Sopenharmony_ci
30e5c31af7Sopenharmony_cinamespace rsg
31e5c31af7Sopenharmony_ci{
32e5c31af7Sopenharmony_ci
33e5c31af7Sopenharmony_ciProgramGenerator::ProgramGenerator (void)
34e5c31af7Sopenharmony_ci{
35e5c31af7Sopenharmony_ci}
36e5c31af7Sopenharmony_ci
37e5c31af7Sopenharmony_ciProgramGenerator::~ProgramGenerator (void)
38e5c31af7Sopenharmony_ci{
39e5c31af7Sopenharmony_ci}
40e5c31af7Sopenharmony_ci
41e5c31af7Sopenharmony_civoid ProgramGenerator::generate (
42e5c31af7Sopenharmony_ci	const ProgramParameters&	programParams,
43e5c31af7Sopenharmony_ci	Shader&						vertexShader,
44e5c31af7Sopenharmony_ci	Shader&						fragmentShader)
45e5c31af7Sopenharmony_ci{
46e5c31af7Sopenharmony_ci	// Random number generator
47e5c31af7Sopenharmony_ci	de::Random rnd(programParams.seed);
48e5c31af7Sopenharmony_ci
49e5c31af7Sopenharmony_ci	GeneratorState state(programParams, rnd);
50e5c31af7Sopenharmony_ci
51e5c31af7Sopenharmony_ci	// Fragment shader
52e5c31af7Sopenharmony_ci	{
53e5c31af7Sopenharmony_ci		ShaderGenerator			shaderGen(state);
54e5c31af7Sopenharmony_ci		vector<ShaderInput*>	emptyOutputs; // \note [pyry] gl_FragColor is added in ShaderGenerator
55e5c31af7Sopenharmony_ci		shaderGen.generate(programParams.fragmentParameters, fragmentShader, emptyOutputs);
56e5c31af7Sopenharmony_ci	}
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ci	// Vertex shader
59e5c31af7Sopenharmony_ci	{
60e5c31af7Sopenharmony_ci		ShaderGenerator shaderGen(state);
61e5c31af7Sopenharmony_ci
62e5c31af7Sopenharmony_ci		// Initialize outputs from fragment shader inputs
63e5c31af7Sopenharmony_ci		const vector<ShaderInput*>& fragmentInputs = fragmentShader.getInputs(); // \note gl_Position and dEQP_Position are handled in ShaderGenerator
64e5c31af7Sopenharmony_ci
65e5c31af7Sopenharmony_ci		shaderGen.generate(programParams.vertexParameters, vertexShader, fragmentInputs);
66e5c31af7Sopenharmony_ci	}
67e5c31af7Sopenharmony_ci
68e5c31af7Sopenharmony_ci	// Allocate samplers \todo [pyry] Randomize allocation.
69e5c31af7Sopenharmony_ci	{
70e5c31af7Sopenharmony_ci		const vector<ShaderInput*>&		vertexUniforms		= vertexShader.getUniforms();
71e5c31af7Sopenharmony_ci		const vector<ShaderInput*>&		fragmentUniforms	= fragmentShader.getUniforms();
72e5c31af7Sopenharmony_ci		vector<ShaderInput*>			unifiedSamplers;
73e5c31af7Sopenharmony_ci		int								curSamplerNdx	= 0;
74e5c31af7Sopenharmony_ci
75e5c31af7Sopenharmony_ci		// Build unified sampler list.
76e5c31af7Sopenharmony_ci		for (vector<ShaderInput*>::const_iterator i = vertexUniforms.begin(); i != vertexUniforms.end(); i++)
77e5c31af7Sopenharmony_ci		{
78e5c31af7Sopenharmony_ci			if ((*i)->getVariable()->getType().isSampler())
79e5c31af7Sopenharmony_ci				unifiedSamplers.push_back(*i);
80e5c31af7Sopenharmony_ci		}
81e5c31af7Sopenharmony_ci
82e5c31af7Sopenharmony_ci		for (vector<ShaderInput*>::const_iterator i = fragmentUniforms.begin(); i != fragmentUniforms.end(); i++)
83e5c31af7Sopenharmony_ci		{
84e5c31af7Sopenharmony_ci			if ((*i)->getVariable()->getType().isSampler())
85e5c31af7Sopenharmony_ci				unifiedSamplers.push_back(*i);
86e5c31af7Sopenharmony_ci		}
87e5c31af7Sopenharmony_ci
88e5c31af7Sopenharmony_ci		// Assign sampler indices.
89e5c31af7Sopenharmony_ci		for (vector<ShaderInput*>::const_iterator i = unifiedSamplers.begin(); i != unifiedSamplers.end(); i++)
90e5c31af7Sopenharmony_ci		{
91e5c31af7Sopenharmony_ci			ShaderInput* input = *i;
92e5c31af7Sopenharmony_ci			if (input->getVariable()->getType().isSampler())
93e5c31af7Sopenharmony_ci			{
94e5c31af7Sopenharmony_ci				input->getValueRange().getMin() = curSamplerNdx;
95e5c31af7Sopenharmony_ci				input->getValueRange().getMax() = curSamplerNdx;
96e5c31af7Sopenharmony_ci				curSamplerNdx += 1;
97e5c31af7Sopenharmony_ci			}
98e5c31af7Sopenharmony_ci		}
99e5c31af7Sopenharmony_ci	}
100e5c31af7Sopenharmony_ci}
101e5c31af7Sopenharmony_ci
102e5c31af7Sopenharmony_ci} // rsg
103