You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
8.2 KiB
241 lines
8.2 KiB
/*-------------------------------------------------------------------------
|
|
* drawElements Quality Program OpenGL ES 2.0 Module
|
|
* -------------------------------------------------
|
|
*
|
|
* Copyright 2014 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*//*!
|
|
* \file
|
|
* \brief Light amount test.
|
|
*//*--------------------------------------------------------------------*/
|
|
|
|
#include "es2fLightAmountTest.hpp"
|
|
#include "tcuStringTemplate.hpp"
|
|
#include "gluDefs.hpp"
|
|
#include "gluShaderProgram.hpp"
|
|
#include "tcuTestLog.hpp"
|
|
#include "deStringUtil.hpp"
|
|
#include "deInt32.h"
|
|
#include "deRandom.h"
|
|
|
|
#include <stdio.h>
|
|
#include <vector>
|
|
|
|
#include "glw.h"
|
|
|
|
using namespace std;
|
|
|
|
namespace deqp
|
|
{
|
|
namespace gles2
|
|
{
|
|
namespace Functional
|
|
{
|
|
|
|
const char* s_noLightsVertexShader =
|
|
"uniform mat4 u_modelviewMatrix;\n"
|
|
"uniform mat4 u_modelviewProjectionMatrix;\n"
|
|
"uniform mat3 u_normalMatrix;\n"
|
|
"\n"
|
|
"attribute vec4 a_position;\n"
|
|
"attribute vec3 a_normal;\n"
|
|
"\n"
|
|
"varying vec3 v_color;\n"
|
|
"\n"
|
|
"void main()\n"
|
|
"{\n"
|
|
" v_color = vec3(0.0);\n"
|
|
" gl_Position = u_modelviewProjectionMatrix * a_position;\n"
|
|
"}\n"
|
|
;
|
|
|
|
const char* s_vertexShaderTemplate =
|
|
"struct Light\n"
|
|
"{\n"
|
|
" vec3 position;\n"
|
|
" vec3 diffuse;\n"
|
|
" vec3 specular;\n"
|
|
" vec3 attenuation;\n"
|
|
"};\n"
|
|
"uniform Light u_lights[${NUM_DIR_LIGHTS} + ${NUM_OMNI_LIGHTS}];\n"
|
|
"uniform mat4 u_modelviewMatrix;\n"
|
|
"uniform mat4 u_modelviewProjectionMatrix;\n"
|
|
"uniform mat3 u_normalMatrix;\n"
|
|
"\n"
|
|
"attribute vec4 a_position;\n"
|
|
"attribute vec3 a_normal;\n"
|
|
"\n"
|
|
"varying vec3 v_color;\n"
|
|
"\n"
|
|
"float computeAttenuation(vec3 dirToLight, vec3 attenuation)\n"
|
|
"{\n"
|
|
" float dist = length(dirToLight);\n"
|
|
" return 1.0 / (attenuation.x + attenuation.y*dist + attenuation.z*dist*dist);\n"
|
|
"}\n"
|
|
"\n"
|
|
"vec3 computeDirLight(int ndx, vec3 position, vec3 normal)\n"
|
|
"{\n"
|
|
" Light light = u_lights[ndx];\n"
|
|
" float cosAngle = dot(light.position, normal);\n"
|
|
" return cosAngle * light.diffuse;\n"
|
|
"}\n"
|
|
"\n"
|
|
"vec3 computeOmniLight(int ndx, vec3 position, vec3 normal)\n"
|
|
"{\n"
|
|
" Light light = u_lights[ndx];\n"
|
|
" vec3 dirToLight = light.position - position;\n"
|
|
" float cosAngle = dot(normalize(dirToLight), normal);\n"
|
|
" float atten = computeAttenuation(dirToLight, light.attenuation);\n"
|
|
" return atten * cosAngle * light.diffuse;\n"
|
|
"}\n"
|
|
"\n"
|
|
"void main()\n"
|
|
"{\n"
|
|
" vec3 lightSpacePos = vec3(u_modelviewMatrix * a_position);\n"
|
|
" vec3 lightNormal = normalize(u_normalMatrix * a_normal);\n"
|
|
" vec3 color = vec3(0.0);\n"
|
|
" for (int i = 0; i < ${NUM_DIR_LIGHTS}; i++)\n"
|
|
" color += computeDirLight(i, lightSpacePos, lightNormal);\n"
|
|
" for (int i = 0; i < ${NUM_OMNI_LIGHTS}; i++)\n"
|
|
" color += computeOmniLight(${NUM_DIR_LIGHTS}+i, lightSpacePos, lightNormal);\n"
|
|
" v_color = color;\n"
|
|
" gl_Position = u_modelviewProjectionMatrix * a_position;\n"
|
|
"}\n"
|
|
;
|
|
|
|
const char* s_fragmentShaderTemplate =
|
|
"varying highp vec3 v_color;\n"
|
|
"\n"
|
|
"void main()\n"
|
|
"{\n"
|
|
" gl_FragColor = vec4(v_color, 1.0);\n"
|
|
"}\n"
|
|
;
|
|
|
|
class LightAmountCase : public TestCase
|
|
{
|
|
public:
|
|
LightAmountCase(Context& context, const char* name, int numDirectionalLights, int numOmniLights, int numSpotLights)
|
|
: TestCase(context, name, name)
|
|
, m_numDirectionalLights (numDirectionalLights)
|
|
, m_numOmniLights (numOmniLights)
|
|
, m_numSpotLights (numSpotLights)
|
|
{
|
|
}
|
|
|
|
virtual IterateResult iterate (void);
|
|
|
|
private:
|
|
int m_numDirectionalLights;
|
|
int m_numOmniLights;
|
|
int m_numSpotLights;
|
|
};
|
|
|
|
TestCase::IterateResult LightAmountCase::iterate (void)
|
|
{
|
|
GLU_CHECK_MSG("LightAmountTest::iterate() begin");
|
|
|
|
string vertexShaderSource;
|
|
string fragmentShaderSource;
|
|
|
|
// Fill in shader template parameters.
|
|
{
|
|
bool hasAnyLights = ((m_numDirectionalLights + m_numOmniLights + m_numSpotLights) != 0);
|
|
|
|
tcu::StringTemplate vertexTemplate(hasAnyLights ? s_vertexShaderTemplate : s_noLightsVertexShader);
|
|
tcu::StringTemplate fragmentTemplate(s_fragmentShaderTemplate);
|
|
|
|
map<string, string> params;
|
|
params.insert(pair<string, string>("NUM_DIR_LIGHTS", de::toString(m_numDirectionalLights)));
|
|
params.insert(pair<string, string>("NUM_OMNI_LIGHTS", de::toString(m_numOmniLights)));
|
|
params.insert(pair<string, string>("NUM_SPOT_LIGHTS", de::toString(m_numSpotLights)));
|
|
|
|
vertexShaderSource = vertexTemplate.specialize(params);
|
|
fragmentShaderSource = fragmentTemplate.specialize(params);
|
|
}
|
|
|
|
// Create shader and program objects.
|
|
glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
|
|
m_testCtx.getLog() << program;
|
|
|
|
// Draw something? Check results?
|
|
glUseProgram(program.getProgram());
|
|
|
|
bool testOk = program.isOk();
|
|
|
|
GLU_CHECK_MSG("LightAmountTest::iterate() end");
|
|
|
|
m_testCtx.setTestResult(testOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, testOk ? "Pass" : "Fail");
|
|
return TestCase::STOP;
|
|
}
|
|
|
|
//
|
|
|
|
LightAmountTest::LightAmountTest (Context& context) : TestCaseGroup(context, "light_amount", "Light Amount Stress Tests")
|
|
{
|
|
}
|
|
|
|
LightAmountTest::~LightAmountTest (void)
|
|
{
|
|
}
|
|
|
|
void LightAmountTest::init (void)
|
|
{
|
|
// name dir, omni, spot
|
|
addChild(new LightAmountCase(m_context, "none", 0, 0, 0 ));
|
|
addChild(new LightAmountCase(m_context, "1dir", 1, 0, 0 ));
|
|
addChild(new LightAmountCase(m_context, "2dir", 2, 0, 0 ));
|
|
addChild(new LightAmountCase(m_context, "4dir", 4, 0, 0 ));
|
|
addChild(new LightAmountCase(m_context, "6dir", 6, 0, 0 ));
|
|
addChild(new LightAmountCase(m_context, "8dir", 8, 0, 0 ));
|
|
addChild(new LightAmountCase(m_context, "10dir", 10, 0, 0 ));
|
|
addChild(new LightAmountCase(m_context, "12dir", 12, 0, 0 ));
|
|
addChild(new LightAmountCase(m_context, "14dir", 14, 0, 0 ));
|
|
addChild(new LightAmountCase(m_context, "16dir", 16, 0, 0 ));
|
|
addChild(new LightAmountCase(m_context, "1omni", 0, 1, 0 ));
|
|
addChild(new LightAmountCase(m_context, "2omni", 0, 2, 0 ));
|
|
addChild(new LightAmountCase(m_context, "4omni", 0, 4, 0 ));
|
|
addChild(new LightAmountCase(m_context, "6omni", 0, 6, 0 ));
|
|
addChild(new LightAmountCase(m_context, "8omni", 0, 8, 0 ));
|
|
addChild(new LightAmountCase(m_context, "10omni", 0, 10, 0 ));
|
|
addChild(new LightAmountCase(m_context, "12omni", 0, 12, 0 ));
|
|
addChild(new LightAmountCase(m_context, "14omni", 0, 14, 0 ));
|
|
addChild(new LightAmountCase(m_context, "16omni", 0, 16, 0 ));
|
|
// addChild(new LightAmountCase(m_context, "1spot", 0, 0, 1 ));
|
|
// addChild(new LightAmountCase(m_context, "2spot", 0, 0, 2 ));
|
|
// addChild(new LightAmountCase(m_context, "4spot", 0, 0, 4 ));
|
|
// addChild(new LightAmountCase(m_context, "6spot", 0, 0, 6 ));
|
|
// addChild(new LightAmountCase(m_context, "8spot", 0, 0, 8 ));
|
|
// addChild(new LightAmountCase(m_context, "1dir_1omni", 1, 1, 0 ));
|
|
// addChild(new LightAmountCase(m_context, "2dir_2omni", 2, 2, 0 ));
|
|
// addChild(new LightAmountCase(m_context, "4dir_4omni", 4, 4, 0 ));
|
|
// addChild(new LightAmountCase(m_context, "1dir_1spot", 1, 0, 1 ));
|
|
// addChild(new LightAmountCase(m_context, "2dir_2spot", 2, 0, 2 ));
|
|
// addChild(new LightAmountCase(m_context, "4dir_4spot", 4, 0, 4 ));
|
|
// addChild(new LightAmountCase(m_context, "1omni_1spot", 0, 1, 1 ));
|
|
// addChild(new LightAmountCase(m_context, "2omni_2spot", 0, 2, 2 ));
|
|
// addChild(new LightAmountCase(m_context, "4omni_4spot", 0, 4, 4 ));
|
|
// addChild(new LightAmountCase(m_context, "1dir_1omni_1spot", 1, 1, 1 ));
|
|
// addChild(new LightAmountCase(m_context, "2dir_2omni_2spot", 2, 2, 2 ));
|
|
// addChild(new LightAmountCase(m_context, "4dir_2omni_2spot", 4, 2, 2 ));
|
|
// addChild(new LightAmountCase(m_context, "2dir_4omni_2spot", 2, 4, 2 ));
|
|
// addChild(new LightAmountCase(m_context, "2dir_2omni_4spot", 2, 2, 4 ));
|
|
// addChild(new LightAmountCase(m_context, "4dir_4omni_4spot", 4, 4, 4 ));
|
|
}
|
|
|
|
} // Functional
|
|
} // gles2
|
|
} // deqp
|