13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.0 Module 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ------------------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Long running shader stress tests. 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3sLongRunningShaderTests.hpp" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluShaderProgram.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluShaderUtil.hpp" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluDrawUtil.hpp" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuRenderTarget.hpp" 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuVector.hpp" 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp" 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp" 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deStringUtil.hpp" 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deString.h" 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp" 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp" 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles3 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Stress 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::TestLog; 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::Vec2; 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector; 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum LoopType 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOOPTYPE_FOR = 0, 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOOPTYPE_WHILE, 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOOPTYPE_DO_WHILE, 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOOPTYPE_LAST 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum IterCountType 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ITERCOUNTTYPE_STATIC = 0, 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ITERCOUNTTYPE_UNIFORM, 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ITERCOUNTTYPE_DYNAMIC, 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ITERCOUNTTYPE_LAST 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass LongRunningShaderCase : public TestCase 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry struct Params 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* name; 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* description; 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::ShaderType shaderType; 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LoopType loopType; 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IterCountType iterCountType; 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int numInvocations; 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int minLoopIterCount; 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int maxLoopIterCount; 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LongRunningShaderCase (Context& context, const Params* params); 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~LongRunningShaderCase (void); 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void init (void); 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void deinit (void); 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IterateResult iterate (void); 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LongRunningShaderCase (const LongRunningShaderCase&); 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LongRunningShaderCase& operator= (const LongRunningShaderCase&); 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static glu::ProgramSources genSources (const Params& params); 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static deUint32 getSeed (const Params& params); 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const Params* const m_params; 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int m_numCaseIters; 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::ShaderProgram* m_program; 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int m_caseIterNdx; 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1093c827367444ee418f129b2c238299f49d3264554Jarkko PoyryLongRunningShaderCase::LongRunningShaderCase (Context& context, const Params* params) 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCase (context, params->name, params->description) 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_params (params) 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_numCaseIters (5) 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_program (DE_NULL) 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_caseIterNdx (0) 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1183c827367444ee418f129b2c238299f49d3264554Jarkko PoyryLongRunningShaderCase::~LongRunningShaderCase (void) 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deinit(); 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryglu::ProgramSources LongRunningShaderCase::genSources (const Params& params) 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool isVertCase = params.shaderType == glu::SHADERTYPE_VERTEX; 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::ostringstream vert, frag; 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "#version 300 es\n" 1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "in highp vec2 a_position;\n"; 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "#version 300 es\n"; 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (params.iterCountType == ITERCOUNTTYPE_DYNAMIC) 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "in highp int a_iterCount;\n"; 1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!isVertCase) 1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "flat out highp int v_iterCount;\n"; 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "flat in highp int v_iterCount;\n"; 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (params.iterCountType == ITERCOUNTTYPE_UNIFORM) 1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry (isVertCase ? vert : frag) << "uniform highp int u_iterCount;\n"; 1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isVertCase) 1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "out mediump vec4 v_color;\n"; 1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "in mediump vec4 v_color;\n"; 1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "out mediump vec4 o_color;\n"; 1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "\nvoid main (void)\n{\n" 1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " gl_Position = vec4(a_position, 0.0, 1.0);\n" 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " gl_PointSize = 1.0;\n"; 1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!isVertCase && params.iterCountType == ITERCOUNTTYPE_DYNAMIC) 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << " v_iterCount = a_iterCount;\n"; 1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "\nvoid main (void)\n{\n"; 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const std::string iterCount = params.iterCountType == ITERCOUNTTYPE_DYNAMIC ? (isVertCase ? "a_iterCount" : "v_iterCount") : 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry params.iterCountType == ITERCOUNTTYPE_UNIFORM ? "u_iterCount" : 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry params.iterCountType == ITERCOUNTTYPE_STATIC ? de::toString(params.maxLoopIterCount) : "<invalid>"; 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* const body = "color = cos(sin(color*1.25)*0.8);"; 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::ostringstream& op = isVertCase ? vert : frag; 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << " mediump vec4 color = " << (isVertCase ? "a_position.xyxy" : "gl_FragCoord") << ";\n"; 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (params.loopType == LOOPTYPE_FOR) 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << " for (highp int i = 0; i < " << iterCount << " || " << iterCount << " < 0; ++i)\n" 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " " << body << "\n"; 1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (params.loopType == LOOPTYPE_WHILE) 1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << " highp int i = 0;\n" 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " while (i < " << iterCount << " || " << iterCount << " < 0) {\n" 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " i += 1;\n" 1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " " << body << "\n" 1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }\n"; 1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(params.loopType == LOOPTYPE_DO_WHILE); 1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << " highp int i = 0;\n" 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " do {\n" 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " i += 1;\n" 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " " << body << "\n" 1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " } while (i <= " << iterCount << " || " << iterCount << " < 0);\n"; 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isVertCase) 1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << " v_color = color;\n"; 1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << " o_color = v_color;\n"; 1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << " o_color = color;\n"; 2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "}\n"; 2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "}\n"; 2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return glu::ProgramSources() << glu::VertexSource(vert.str()) << glu::FragmentSource(frag.str()); 2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid LongRunningShaderCase::init (void) 2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(!m_program); 2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_program = new glu::ShaderProgram(m_context.getRenderContext(), genSources(*m_params)); 2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.getLog() << *m_program; 2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!m_program->isOk()) 2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deinit(); 2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_FAIL("Failed to compile shader program"); 2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_caseIterNdx = 0; 2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_params->iterCountType != ITERCOUNTTYPE_STATIC) 2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.getLog() << TestLog::Message << "Loop iteration counts in range: [" << m_params->minLoopIterCount 2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << ", " << m_params->maxLoopIterCount << "]" 2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << TestLog::EndMessage; 2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.getLog() << TestLog::Message << "Number of vertices and fragments: " << m_params->numInvocations << TestLog::EndMessage; 2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); // Test will pass or timeout, unless driver/device crashes. 2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid LongRunningShaderCase::deinit (void) 2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_program; 2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_program = DE_NULL; 2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid genPositions (const tcu::RenderTarget& renderTarget, int numPoints, Vec2* positions) 2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int width = renderTarget.getWidth(); 2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int height = renderTarget.getHeight(); 2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (width*height < numPoints) 2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw tcu::NotSupportedError("Too small viewport to fit all test points"); 2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int pointNdx = 0; pointNdx < numPoints; pointNdx++) 2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int xi = pointNdx % width; 2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int yi = pointNdx / height; 2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const float xf = 2.0f * ((float(xi) + 0.5f) / float(width)) - 1.0f; 2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const float yf = 2.0f * ((float(yi) + 0.5f) / float(height)) - 1.0f; 2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry positions[pointNdx] = Vec2(xf, yf); 2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2613c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeUint32 LongRunningShaderCase::getSeed (const Params& params) 2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint32 seed = deStringHash(params.name) 2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ^ deInt32Hash(params.shaderType) 2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ^ deInt32Hash(params.loopType) 2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ^ deInt32Hash(params.iterCountType) 2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ^ deInt32Hash(params.minLoopIterCount) 2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ^ deInt32Hash(params.maxLoopIterCount) 2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ^ deInt32Hash(params.numInvocations); 2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return seed; 2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2733c827367444ee418f129b2c238299f49d3264554Jarkko PoyryLongRunningShaderCase::IterateResult LongRunningShaderCase::iterate (void) 2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry de::Random rnd (getSeed(*m_params)); 2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<Vec2> positions (m_params->numInvocations); 2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<int> iterCounts (m_params->iterCountType == ITERCOUNTTYPE_DYNAMIC ? m_params->numInvocations : 1); 2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<glu::VertexArrayBinding> vertexArrays; 2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexArrays.push_back(glu::va::Float("a_position", 2, (int)positions.size(), 0, positions[0].getPtr())); 2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_params->iterCountType == ITERCOUNTTYPE_DYNAMIC) 2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexArrays.push_back(glu::va::Int32("a_iterCount", 1, (int)iterCounts.size(), 0, &iterCounts[0])); 2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry genPositions(m_context.getRenderTarget(), (int)positions.size(), &positions[0]); 2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (vector<int>::iterator i = iterCounts.begin(); i != iterCounts.end(); ++i) 2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *i = rnd.getInt(m_params->minLoopIterCount, m_params->maxLoopIterCount); 2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.useProgram(m_program->getProgram()); 2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_params->iterCountType == ITERCOUNTTYPE_UNIFORM) 2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform1i(gl.getUniformLocation(m_program->getProgram(), "u_iterCount"), iterCounts[0]); 2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::draw(m_context.getRenderContext(), m_program->getProgram(), 2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry (int)vertexArrays.size(), &vertexArrays[0], 2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::pr::Points(m_params->numInvocations)); 2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_caseIterNdx += 1; 3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return (m_caseIterNdx < m_numCaseIters) ? CONTINUE : STOP; 3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous 3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3053c827367444ee418f129b2c238299f49d3264554Jarkko PoyryLongRunningShaderTests::LongRunningShaderTests (Context& context) 3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCaseGroup(context, "long_running_shaders", "Long-running shader stress tests") 3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3103c827367444ee418f129b2c238299f49d3264554Jarkko PoyryLongRunningShaderTests::~LongRunningShaderTests (void) 3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid LongRunningShaderTests::init (void) 3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int numInvocations = 4096; 3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int shortLoopMin = 5; 3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int shortLoopMax = 10; 3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int mediumLoopMin = 10000; 3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int mediumLoopMax = 50000; 3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int longLoopMin = 100000; 3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int longLoopMax = 500000; 3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const LongRunningShaderCase::Params s_cases[] = 3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "short_for_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations, shortLoopMin, shortLoopMax }, 3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "short_for_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations, shortLoopMin, shortLoopMax }, 3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "short_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, shortLoopMin, shortLoopMax }, 3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "short_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, shortLoopMin, shortLoopMax }, 3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "short_do_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, shortLoopMin, shortLoopMax }, 3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "short_do_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, shortLoopMin, shortLoopMax }, 3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "medium_static_for_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_FOR, ITERCOUNTTYPE_STATIC, numInvocations, mediumLoopMin, mediumLoopMax }, 3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "medium_static_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_WHILE, ITERCOUNTTYPE_STATIC, numInvocations, mediumLoopMin, mediumLoopMax }, 3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "medium_uniform_do_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_UNIFORM, numInvocations, mediumLoopMin, mediumLoopMax }, 3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "medium_uniform_for_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_FOR, ITERCOUNTTYPE_UNIFORM, numInvocations, mediumLoopMin, mediumLoopMax }, 3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "medium_dynamic_for_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations, mediumLoopMin, mediumLoopMax }, 3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "medium_dynamic_for_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations, mediumLoopMin, mediumLoopMax }, 3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "medium_dynamic_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, mediumLoopMin, mediumLoopMax }, 3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "medium_dynamic_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, mediumLoopMin, mediumLoopMax }, 3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "medium_dynamic_do_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, mediumLoopMin, mediumLoopMax }, 3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "medium_dynamic_do_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, mediumLoopMin, mediumLoopMax }, 3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "long_static_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_WHILE, ITERCOUNTTYPE_STATIC, numInvocations, longLoopMin, longLoopMax }, 3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "long_static_do_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_STATIC, numInvocations, longLoopMin, longLoopMax }, 3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "long_uniform_for_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_FOR, ITERCOUNTTYPE_UNIFORM, numInvocations, longLoopMin, longLoopMax }, 3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "long_uniform_do_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_UNIFORM, numInvocations, longLoopMin, longLoopMax }, 3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "long_dynamic_for_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations, longLoopMin, longLoopMax }, 3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "long_dynamic_for_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations, longLoopMin, longLoopMax }, 3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "long_dynamic_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, longLoopMin, longLoopMax }, 3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "long_dynamic_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, longLoopMin, longLoopMax }, 3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "long_dynamic_do_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, longLoopMin, longLoopMax }, 3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "long_dynamic_do_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, longLoopMin, longLoopMax }, 3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "infinite_for_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations, -1, -1 }, 3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "infinite_for_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations, -1, -1 }, 3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "infinite_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, -1, -1 }, 3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "infinite_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, -1, -1 }, 3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "infinite_do_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, -1, -1 }, 3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "infinite_do_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, -1, -1 }, 3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_cases); ndx++) 3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(new LongRunningShaderCase(m_context, &s_cases[ndx])); 3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Stress 3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3 3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp 372