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