13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 2.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 Shader struct tests. 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es2fShaderStructTests.hpp" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsShaderRenderCase.hpp" 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuStringTemplate.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluTexture.hpp" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTextureUtil.hpp" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp" 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp" 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMath.h" 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::StringTemplate; 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string; 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector; 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::ostringstream; 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace glu; 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace deqp::gls; 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles2 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TEXTURE_BRICK = 0 //!< Unit index for brick texture 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum CaseFlags 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FLAG_USES_TEXTURES = (1<<0), 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FLAG_REQUIRES_DYNAMIC_LOOPS = (1<<1), 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FLAG_REQUIRES_DYNAMIC_INDEXING = (1<<2), 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytypedef void (*SetupUniformsFunc) (const glw::Functions& gl, deUint32 programID, const tcu::Vec4& constCoords); 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ShaderStructCase : public ShaderRenderCase 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ShaderStructCase (Context& context, const char* name, const char* description, bool isVertexCase, deUint32 flags, ShaderEvalFunc evalFunc, SetupUniformsFunc setupUniformsFunc, const char* vertShaderSource, const char* fragShaderSource); 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~ShaderStructCase (void); 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void init (void); 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void deinit (void); 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void setupUniforms (int programID, const tcu::Vec4& constCoords); 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ShaderStructCase (const ShaderStructCase&); 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ShaderStructCase& operator= (const ShaderStructCase&); 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const SetupUniformsFunc m_setupUniforms; 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint32 m_flags; 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::Texture2D* m_brickTexture; 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 843c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderStructCase::ShaderStructCase (Context& context, const char* name, const char* description, bool isVertexCase, deUint32 flags, ShaderEvalFunc evalFunc, SetupUniformsFunc setupUniformsFunc, const char* vertShaderSource, const char* fragShaderSource) 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : ShaderRenderCase (context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, description, isVertexCase, evalFunc) 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_setupUniforms (setupUniformsFunc) 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_flags (flags) 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_brickTexture (DE_NULL) 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_vertShaderSource = vertShaderSource; 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_fragShaderSource = fragShaderSource; 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 943c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderStructCase::~ShaderStructCase (void) 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_brickTexture; 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderStructCase::init (void) 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry try 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gls::ShaderRenderCase::init(); 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry catch (const CompileFailed&) 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_flags & FLAG_REQUIRES_DYNAMIC_LOOPS) 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool isSupported = m_isVertexCase ? m_ctxInfo.isVertexDynamicLoopSupported() : m_ctxInfo.isFragmentDynamicLoopSupported(); 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!isSupported) 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw tcu::NotSupportedError("Dynamic loops not supported"); 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if ((m_flags && FLAG_USES_TEXTURES) && m_isVertexCase) 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int numTextures = 0; 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_renderCtx.getFunctions().getIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &numTextures); 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (numTextures == 0) 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw tcu::NotSupportedError("Vertex shader texture access not supported"); 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_flags & FLAG_REQUIRES_DYNAMIC_INDEXING) 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw tcu::NotSupportedError("Dynamic indexing not supported"); 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw; 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_flags & FLAG_USES_TEXTURES) 1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_brickTexture = glu::Texture2D::create(m_renderCtx, m_ctxInfo, m_testCtx.getArchive(), "data/brick.png"); 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_textures.push_back(TextureBinding(m_brickTexture, tcu::Sampler(tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::CLAMP_TO_EDGE, 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Sampler::LINEAR, tcu::Sampler::LINEAR))); 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(m_textures.size() == 1); 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderStructCase::deinit (void) 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gls::ShaderRenderCase::deinit(); 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_brickTexture; 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_brickTexture = DE_NULL; 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderStructCase::setupUniforms (int programID, const tcu::Vec4& constCoords) 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ShaderRenderCase::setupUniforms(programID, constCoords); 1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_setupUniforms) 1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_setupUniforms(m_renderCtx.getFunctions(), programID, constCoords); 1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic ShaderStructCase* createStructCase (Context& context, const char* name, const char* description, bool isVertexCase, deUint32 flags, ShaderEvalFunc evalFunc, SetupUniformsFunc setupUniforms, const LineStream& shaderSrc) 1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const char* defaultVertSrc = 1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "attribute highp vec4 a_position;\n" 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "attribute highp vec4 a_coords;\n" 1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "varying mediump vec4 v_coords;\n\n" 1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "void main (void)\n" 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "{\n" 1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " v_coords = a_coords;\n" 1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " gl_Position = a_position;\n" 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "}\n"; 1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const char* defaultFragSrc = 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "varying mediump vec4 v_color;\n\n" 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "void main (void)\n" 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "{\n" 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " gl_FragColor = v_color;\n" 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "}\n"; 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Fill in specialization parameters. 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::map<std::string, std::string> spParams; 1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isVertexCase) 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spParams["DECLARATIONS"] = 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "attribute highp vec4 a_position;\n" 1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "attribute highp vec4 a_coords;\n" 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "varying mediump vec4 v_color;"; 1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spParams["COORDS"] = "a_coords"; 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spParams["DST"] = "v_color"; 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spParams["ASSIGN_POS"] = "gl_Position = a_position;"; 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spParams["DECLARATIONS"] = "varying mediump vec4 v_coords;"; 1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spParams["COORDS"] = "v_coords"; 1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spParams["DST"] = "gl_FragColor"; 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spParams["ASSIGN_POS"] = ""; 1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isVertexCase) 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return new ShaderStructCase(context, name, description, isVertexCase, flags, evalFunc, setupUniforms, StringTemplate(shaderSrc.str()).specialize(spParams).c_str(), defaultFragSrc); 1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return new ShaderStructCase(context, name, description, isVertexCase, flags, evalFunc, setupUniforms, defaultVertSrc, StringTemplate(shaderSrc.str()).specialize(spParams).c_str()); 1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass LocalStructTests : public TestCaseGroup 1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LocalStructTests (Context& context) 1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCaseGroup(context, "local", "Local structs") 2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~LocalStructTests (void) 2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void init (void); 2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid LocalStructTests::init (void) 2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry #define LOCAL_STRUCT_CASE(NAME, DESCRIPTION, FLAGS, SHADER_SRC, EVAL_FUNC_BODY) \ 2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry do { \ 21401af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulos struct Eval_##NAME { static void eval (ShaderEvalContext& c) EVAL_FUNC_BODY }; /* NOLINT(EVAL_FUNC_BODY) */ \ 2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(createStructCase(m_context, #NAME "_vertex", DESCRIPTION, true, FLAGS, &Eval_##NAME::eval, DE_NULL, SHADER_SRC)); \ 2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(createStructCase(m_context, #NAME "_fragment", DESCRIPTION, false, FLAGS,&Eval_##NAME::eval, DE_NULL, SHADER_SRC)); \ 2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } while (deGetFalse()) 2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(basic, "Basic struct usage", 0, 2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 b;" 2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = S(${COORDS}.x, vec3(0.0), ui_one);" 2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b = ${COORDS}.yzw;" 2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b.x, s.b.y, s.c);" 2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(0,1,2); 2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(nested, "Nested struct", 0, 2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int a;" 2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b;" 2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b;" 2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);" 2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b = T(ui_zero, ${COORDS}.yz);" 2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b.b, s.b.a + s.c);" 2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(0,1,2); 2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(array_member, "Struct with array member", 0, 2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float b[3];" 2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s;" 2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.a = ${COORDS}.w;" 2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.c = ui_one;" 2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b[0] = ${COORDS}.z;" 2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b[1] = ${COORDS}.y;" 2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b[2] = ${COORDS}.x;" 2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b[0], s.b[1], s.c);" 2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(3,2,1); 2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(array_member_dynamic_index, "Struct with array member, dynamic indexing", FLAG_REQUIRES_DYNAMIC_INDEXING, 2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float b[3];" 3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s;" 3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.a = ${COORDS}.w;" 3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.c = ui_one;" 3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b[0] = ${COORDS}.z;" 3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b[1] = ${COORDS}.y;" 3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b[2] = ${COORDS}.x;" 3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.b[ui_one], s.b[ui_zero], s.b[ui_two], s.c);" 3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(1,2,0); 3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(struct_array, "Struct array", 0, 3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump int b;" 3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s[3];" 3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0] = S(${COORDS}.x, ui_zero);" 3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].a = ${COORDS}.y;" 3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b = ui_one;" 3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[2] = S(${COORDS}.z, ui_two);" 3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s[2].a, s[1].a, s[0].a, s[2].b - s[1].b + s[0].b);" 3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(2,1,0); 3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(struct_array_dynamic_index, "Struct array with dynamic indexing", FLAG_REQUIRES_DYNAMIC_INDEXING, 3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump int b;" 3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s[3];" 3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0] = S(${COORDS}.x, ui_zero);" 3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].a = ${COORDS}.y;" 3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b = ui_one;" 3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[2] = S(${COORDS}.z, ui_two);" 3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s[ui_two].a, s[ui_one].a, s[ui_zero].a, s[ui_two].b - s[ui_one].b + s[ui_zero].b);" 3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(2,1,0); 3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(nested_struct_array, "Nested struct array", 0, 3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_two;" 3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_three;" 3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_four;" 3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_half;" 3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_third;" 3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_fourth;" 3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b[2];" 3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b[3];" 3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s[2];" 4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " // S[0]" 4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].a = ${COORDS}.x;" 4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[0].a = uf_half;" 4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[0].b[0] = ${COORDS}.xy;" 4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[0].b[1] = ${COORDS}.zw;" 4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[1].a = uf_third;" 4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[1].b[0] = ${COORDS}.zw;" 4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[1].b[1] = ${COORDS}.xy;" 4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[2].a = uf_fourth;" 4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[2].b[0] = ${COORDS}.xz;" 4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[2].b[1] = ${COORDS}.yw;" 4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].c = ui_zero;" 4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " // S[1]" 4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].a = ${COORDS}.w;" 4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[0].a = uf_two;" 4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[0].b[0] = ${COORDS}.xx;" 4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[0].b[1] = ${COORDS}.yy;" 4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[1].a = uf_three;" 4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[1].b[0] = ${COORDS}.zz;" 4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[1].b[1] = ${COORDS}.ww;" 4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[2].a = uf_four;" 4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[2].b[0] = ${COORDS}.yx;" 4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[2].b[1] = ${COORDS}.wz;" 4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].c = ui_one;" 4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float r = (s[0].b[1].b[0].x + s[1].b[2].b[1].y) * s[0].b[0].a; // (z + z) * 0.5" 4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float g = s[1].b[0].b[0].y * s[0].b[2].a * s[1].b[2].a; // x * 0.25 * 4" 4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float b = (s[0].b[2].b[1].y + s[0].b[1].b[0].y + s[1].a) * s[0].b[1].a; // (w + w + w) * 0.333" 4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a = float(s[0].c) + s[1].b[2].a - s[1].b[1].a; // 0 + 4.0 - 3.0" 4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(r, g, b, a);" 4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(2,0,3); 4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(nested_struct_array_dynamic_index, "Nested struct array with dynamic indexing", FLAG_REQUIRES_DYNAMIC_INDEXING, 4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_two;" 4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_three;" 4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_four;" 4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_half;" 4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_third;" 4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_fourth;" 4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b[2];" 4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b[3];" 4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s[2];" 4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " // S[0]" 4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].a = ${COORDS}.x;" 4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[0].a = uf_half;" 4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[0].b[0] = ${COORDS}.xy;" 4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[0].b[1] = ${COORDS}.zw;" 4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[1].a = uf_third;" 4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[1].b[0] = ${COORDS}.zw;" 4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[1].b[1] = ${COORDS}.xy;" 4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[2].a = uf_fourth;" 4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[2].b[0] = ${COORDS}.xz;" 4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[2].b[1] = ${COORDS}.yw;" 4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].c = ui_zero;" 4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " // S[1]" 4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].a = ${COORDS}.w;" 4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[0].a = uf_two;" 4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[0].b[0] = ${COORDS}.xx;" 4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[0].b[1] = ${COORDS}.yy;" 4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[1].a = uf_three;" 4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[1].b[0] = ${COORDS}.zz;" 4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[1].b[1] = ${COORDS}.ww;" 4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[2].a = uf_four;" 4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[2].b[0] = ${COORDS}.yx;" 4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[2].b[1] = ${COORDS}.wz;" 4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].c = ui_one;" 4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float r = (s[0].b[ui_one].b[ui_one-1].x + s[ui_one].b[ui_two].b[ui_zero+1].y) * s[0].b[0].a; // (z + z) * 0.5" 4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float g = s[ui_two-1].b[ui_two-2].b[ui_zero].y * s[0].b[ui_two].a * s[ui_one].b[2].a; // x * 0.25 * 4" 4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float b = (s[ui_zero].b[ui_one+1].b[1].y + s[0].b[ui_one*ui_one].b[0].y + s[ui_one].a) * s[0].b[ui_two-ui_one].a; // (w + w + w) * 0.333" 4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a = float(s[ui_zero].c) + s[ui_one-ui_zero].b[ui_two].a - s[ui_zero+ui_one].b[ui_two-ui_one].a; // 0 + 4.0 - 3.0" 4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(r, g, b, a);" 4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(2,0,3); 5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(parameter, "Struct as a function parameter", 0, 5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 b;" 5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "mediump vec4 myFunc (S s)" 5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " return vec4(s.a, s.b.x, s.b.y, s.c);" 5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}" 5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = S(${COORDS}.x, vec3(0.0), ui_one);" 5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b = ${COORDS}.yzw;" 5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = myFunc(s);" 5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(0,1,2); 5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(parameter_nested, "Nested struct as a function parameter", 0, 5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int a;" 5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b;" 5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b;" 5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "mediump vec4 myFunc (S s)" 5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " return vec4(s.a, s.b.b, s.b.a + s.c);" 5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}" 5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);" 5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b = T(ui_zero, ${COORDS}.yz);" 5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = myFunc(s);" 5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(0,1,2); 5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(return, "Struct as a return value", 0, 5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 b;" 5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "S myFunc (void)" 5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = S(${COORDS}.x, vec3(0.0), ui_one);" 5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b = ${COORDS}.yzw;" 5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " return s;" 5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}" 5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = myFunc();" 5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b.x, s.b.y, s.c);" 5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(0,1,2); 5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(return_nested, "Nested struct", 0, 5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int a;" 5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b;" 5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b;" 6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "S myFunc (void)" 6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);" 6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b = T(ui_zero, ${COORDS}.yz);" 6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " return s;" 6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}" 6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = myFunc();" 6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b.b, s.b.a + s.c);" 6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(0,1,2); 6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(conditional_assignment, "Conditional struct assignment", 0, 6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_one;" 6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 b;" 6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);" 6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (uf_one > 0.0)" 6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);" 6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b.xy, s.c);" 6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(3,2,1); 6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(loop_assignment, "Struct assignment in loop", 0, 6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 b;" 6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);" 6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int i = 0; i < 3; i++)" 6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (i == 1)" 6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);" 6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b.xy, s.c);" 6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(3,2,1); 6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(dynamic_loop_assignment, "Struct assignment in loop", FLAG_REQUIRES_DYNAMIC_INDEXING, 6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_three;" 6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 b;" 6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);" 6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int i = 0; i < ui_three; i++)" 6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (i == ui_one)" 6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);" 6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b.xy, s.c);" 6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(3,2,1); 7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(nested_conditional_assignment, "Conditional assignment of nested struct", 0, 7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_one;" 7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int a;" 7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b;" 7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b;" 7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);" 7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (uf_one > 0.0)" 7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b = T(ui_zero, ${COORDS}.zw);" 7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b.b, s.c - s.b.a);" 7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(0,2,3); 7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(nested_loop_assignment, "Nested struct assignment in loop", 0, 7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_one;" 7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int a;" 7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b;" 7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b;" 7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);" 7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int i = 0; i < 3; i++)" 7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (i == 1)" 7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b = T(ui_zero, ${COORDS}.zw);" 7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b.b, s.c - s.b.a);" 7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(0,2,3); 7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(nested_dynamic_loop_assignment, "Nested struct assignment in dynamic loop", FLAG_REQUIRES_DYNAMIC_INDEXING, 7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_three;" 7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_one;" 7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int a;" 7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b;" 7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b;" 7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);" 7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int i = 0; i < ui_three; i++)" 7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (i == ui_one)" 7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s.b = T(ui_zero, ${COORDS}.zw);" 7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b.b, s.c - s.b.a);" 7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(0,2,3); 7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(loop_struct_array, "Struct array usage in loop", 0, 7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump int b;" 8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s[3];" 8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0] = S(${COORDS}.x, ui_zero);" 8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].a = ${COORDS}.y;" 8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b = -ui_one;" 8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[2] = S(${COORDS}.z, ui_two);" 8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float rgb[3];" 8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int alpha = 0;" 8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int i = 0; i < 3; i++)" 8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " rgb[i] = s[2-i].a;" 8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " alpha += s[i].b;" 8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);" 8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(2,1,0); 8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(loop_nested_struct_array, "Nested struct array usage in loop", 0, 8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_two;" 8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_three;" 8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_four;" 8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_half;" 8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_third;" 8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_fourth;" 8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_sixth;" 8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b[2];" 8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b[3];" 8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s[2];" 8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " // S[0]" 8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].a = ${COORDS}.x;" 8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[0].a = uf_half;" 8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[0].b[0] = ${COORDS}.yx;" 8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[0].b[1] = ${COORDS}.zx;" 8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[1].a = uf_third;" 8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[1].b[0] = ${COORDS}.yy;" 8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[1].b[1] = ${COORDS}.wy;" 8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[2].a = uf_fourth;" 8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[2].b[0] = ${COORDS}.zx;" 8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[2].b[1] = ${COORDS}.zy;" 8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].c = ui_zero;" 8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " // S[1]" 8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].a = ${COORDS}.w;" 8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[0].a = uf_two;" 8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[0].b[0] = ${COORDS}.zx;" 8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[0].b[1] = ${COORDS}.zy;" 8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[1].a = uf_three;" 8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[1].b[0] = ${COORDS}.zz;" 8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[1].b[1] = ${COORDS}.ww;" 8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[2].a = uf_four;" 8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[2].b[0] = ${COORDS}.yx;" 8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[2].b[1] = ${COORDS}.wz;" 8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].c = ui_one;" 8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float r = 0.0; // (x*3 + y*3) / 6.0" 8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float g = 0.0; // (y*3 + z*3) / 6.0" 8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float b = 0.0; // (z*3 + w*3) / 6.0" 8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a = 1.0;" 8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int i = 0; i < 2; i++)" 8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int j = 0; j < 3; j++)" 8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " r += s[0].b[j].b[i].y;" 8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " g += s[i].b[j].b[0].x;" 8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " b += s[i].b[j].b[1].x;" 8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " a *= s[i].b[j].a;" 8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);" 8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = (c.coords.swizzle(0,1,2) + c.coords.swizzle(1,2,3)) * 0.5f; 9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(dynamic_loop_struct_array, "Struct array usage in dynamic loop", FLAG_REQUIRES_DYNAMIC_INDEXING|FLAG_REQUIRES_DYNAMIC_LOOPS, 9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_three;" 9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump int b;" 9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s[3];" 9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0] = S(${COORDS}.x, ui_zero);" 9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].a = ${COORDS}.y;" 9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b = -ui_one;" 9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[2] = S(${COORDS}.z, ui_two);" 9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float rgb[3];" 9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int alpha = 0;" 9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int i = 0; i < ui_three; i++)" 9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " rgb[i] = s[2-i].a;" 9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " alpha += s[i].b;" 9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);" 9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.coords.swizzle(2,1,0); 9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(dynamic_loop_nested_struct_array, "Nested struct array usage in dynamic loop", FLAG_REQUIRES_DYNAMIC_INDEXING|FLAG_REQUIRES_DYNAMIC_LOOPS, 9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_three;" 9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_two;" 9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_three;" 9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_four;" 9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_half;" 9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_third;" 9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_fourth;" 9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_sixth;" 9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 9553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b[2];" 9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b[3];" 9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S s[2];" 9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " // S[0]" 9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].a = ${COORDS}.x;" 9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[0].a = uf_half;" 9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[0].b[0] = ${COORDS}.yx;" 9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[0].b[1] = ${COORDS}.zx;" 9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[1].a = uf_third;" 9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[1].b[0] = ${COORDS}.yy;" 9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[1].b[1] = ${COORDS}.wy;" 9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[2].a = uf_fourth;" 9783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[2].b[0] = ${COORDS}.zx;" 9793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].b[2].b[1] = ${COORDS}.zy;" 9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[0].c = ui_zero;" 9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " // S[1]" 9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].a = ${COORDS}.w;" 9843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[0].a = uf_two;" 9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[0].b[0] = ${COORDS}.zx;" 9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[0].b[1] = ${COORDS}.zy;" 9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[1].a = uf_three;" 9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[1].b[0] = ${COORDS}.zz;" 9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[1].b[1] = ${COORDS}.ww;" 9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[2].a = uf_four;" 9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[2].b[0] = ${COORDS}.yx;" 9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].b[2].b[1] = ${COORDS}.wz;" 9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " s[1].c = ui_one;" 9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float r = 0.0; // (x*3 + y*3) / 6.0" 9963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float g = 0.0; // (y*3 + z*3) / 6.0" 9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float b = 0.0; // (z*3 + w*3) / 6.0" 9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a = 1.0;" 9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int i = 0; i < ui_two; i++)" 10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int j = 0; j < ui_three; j++)" 10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " r += s[0].b[j].b[i].y;" 10043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " g += s[i].b[j].b[0].x;" 10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " b += s[i].b[j].b[1].x;" 10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " a *= s[i].b[j].a;" 10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);" 10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = (c.coords.swizzle(0,1,2) + c.coords.swizzle(1,2,3)) * 0.5f; 10143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 10153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(basic_equal, "Basic struct equality", 0, 10173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 10183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 10193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 10203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 10213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 10223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 10233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 10243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 b;" 10253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 10263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 10273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 10283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 10293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 10303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S a = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);" 10313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S b = S(floor(${COORDS}.x+0.5), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);" 10323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S c = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one);" 10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S d = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_two);" 10343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(0.0, 0.0, 0.0, 1.0);" 10353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a == b) ${DST}.x = 1.0;" 10363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a == c) ${DST}.y = 1.0;" 10373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a == d) ${DST}.z = 1.0;" 10383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 10393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 10403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (deFloatFloor(c.coords[0]) == deFloatFloor(c.coords[0]+0.5f)) 10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.x() = 1.0f; 10433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (deFloatFloor(c.coords[1]) == deFloatFloor(c.coords[1]+0.5f)) 10443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.y() = 1.0f; 10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(basic_not_equal, "Basic struct equality", 0, 10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 10493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 10503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 10513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 10543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 10553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 b;" 10563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 10573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 10583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 10593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 10603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 10613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S a = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);" 10623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S b = S(floor(${COORDS}.x+0.5), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);" 10633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S c = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one);" 10643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S d = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_two);" 10653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(0.0, 0.0, 0.0, 1.0);" 10663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a != b) ${DST}.x = 1.0;" 10673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a != c) ${DST}.y = 1.0;" 10683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a != d) ${DST}.z = 1.0;" 10693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 10703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 10713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (deFloatFloor(c.coords[0]) != deFloatFloor(c.coords[0]+0.5f)) 10733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.x() = 1.0f; 10743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (deFloatFloor(c.coords[1]) != deFloatFloor(c.coords[1]+0.5f)) 10753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.y() = 1.0f; 10763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.z() = 1.0f; 10773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(nested_equal, "Nested struct struct equality", 0, 10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 10833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 10843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 10853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 10863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 a;" 10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int b;" 10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b;" 10923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 10933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 10963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S a = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);" 10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S b = S(floor(${COORDS}.x+0.5), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);" 10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S c = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one), 1);" 11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S d = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_two), 1);" 11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(0.0, 0.0, 0.0, 1.0);" 11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a == b) ${DST}.x = 1.0;" 11033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a == c) ${DST}.y = 1.0;" 11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a == d) ${DST}.z = 1.0;" 11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (deFloatFloor(c.coords[0]) == deFloatFloor(c.coords[0]+0.5f)) 11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.x() = 1.0f; 11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (deFloatFloor(c.coords[1]) == deFloatFloor(c.coords[1]+0.5f)) 11113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.y() = 1.0f; 11123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LOCAL_STRUCT_CASE(nested_not_equal, "Nested struct struct equality", 0, 11153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 11163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 11173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 a;" 11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int b;" 11233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b;" 11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 11313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S a = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);" 11333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S b = S(floor(${COORDS}.x+0.5), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);" 11343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S c = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one), 1);" 11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S d = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_two), 1);" 11363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(0.0, 0.0, 0.0, 1.0);" 11373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a != b) ${DST}.x = 1.0;" 11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a != c) ${DST}.y = 1.0;" 11393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a != d) ${DST}.z = 1.0;" 11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (deFloatFloor(c.coords[0]) != deFloatFloor(c.coords[0]+0.5f)) 11443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.x() = 1.0f; 11453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (deFloatFloor(c.coords[1]) != deFloatFloor(c.coords[1]+0.5f)) 11463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.y() = 1.0f; 11473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.z() = 1.0f; 11483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 11493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 11503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass UniformStructTests : public TestCaseGroup 11523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 11533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 11543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UniformStructTests (Context& context) 11553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCaseGroup(context, "uniform", "Uniform structs") 11563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~UniformStructTests (void) 11603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void init (void); 11643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 11653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11663c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace 11673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 11683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1169dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh#define CHECK_SET_UNIFORM(NAME) GLU_EXPECT_NO_ERROR(gl.getError(), (string("Failed to set ") + (NAME)).c_str()) 11703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define MAKE_SET_VEC_UNIFORM(VECTYPE, SETUNIFORM) \ 11723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid setUniform (const glw::Functions& gl, deUint32 programID, const char* name, const tcu::VECTYPE& vec) \ 11733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ \ 11743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int loc = gl.getUniformLocation(programID, name); \ 11753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry SETUNIFORM(loc, 1, vec.getPtr()); \ 11763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CHECK_SET_UNIFORM(name); \ 11773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} \ 11783c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct SetUniform##VECTYPE##Dummy_s { int unused; } 11793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define MAKE_SET_VEC_UNIFORM_PTR(VECTYPE, SETUNIFORM) \ 11813c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid setUniform (const glw::Functions& gl, deUint32 programID, const char* name, const tcu::VECTYPE* vec, int arraySize) \ 11823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ \ 11833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int loc = gl.getUniformLocation(programID, name); \ 11843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry SETUNIFORM(loc, arraySize, vec->getPtr()); \ 11853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CHECK_SET_UNIFORM(name); \ 11863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} \ 11873c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct SetUniformPtr##VECTYPE##Dummy_s { int unused; } 11883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11893c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMAKE_SET_VEC_UNIFORM (Vec2, gl.uniform2fv); 11903c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMAKE_SET_VEC_UNIFORM (Vec3, gl.uniform3fv); 11913c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMAKE_SET_VEC_UNIFORM_PTR(Vec2, gl.uniform2fv); 11923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11933c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid setUniform (const glw::Functions& gl, deUint32 programID, const char* name, float value) 11943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 11953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int loc = gl.getUniformLocation(programID, name); 11963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform1f(loc, value); 11973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CHECK_SET_UNIFORM(name); 11983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 11993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12003c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid setUniform (const glw::Functions& gl, deUint32 programID, const char* name, int value) 12013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 12023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int loc = gl.getUniformLocation(programID, name); 12033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform1i(loc, value); 12043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CHECK_SET_UNIFORM(name); 12053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 12063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12073c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid setUniform (const glw::Functions& gl, deUint32 programID, const char* name, const float* value, int arraySize) 12083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 12093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int loc = gl.getUniformLocation(programID, name); 12103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform1fv(loc, arraySize, value); 12113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CHECK_SET_UNIFORM(name); 12123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 12133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous 12153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12163c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid UniformStructTests::init (void) 12173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 12183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry #define UNIFORM_STRUCT_CASE(NAME, DESCRIPTION, FLAGS, SHADER_SRC, SET_UNIFORMS_BODY, EVAL_FUNC_BODY) \ 12193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry do { \ 1220dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh struct SetUniforms_##NAME { \ 1221dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh static void setUniforms (const glw::Functions& gl, deUint32 programID, const tcu::Vec4& constCoords) SET_UNIFORMS_BODY /* NOLINT(SET_UNIFORMS_BODY) */ \ 1222dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh }; \ 122301af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulos struct Eval_##NAME { static void eval (ShaderEvalContext& c) EVAL_FUNC_BODY }; /* NOLINT(EVAL_FUNC_BODY) */ \ 12243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(createStructCase(m_context, #NAME "_vertex", DESCRIPTION, true, FLAGS, Eval_##NAME::eval, SetUniforms_##NAME::setUniforms, SHADER_SRC)); \ 12253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(createStructCase(m_context, #NAME "_fragment", DESCRIPTION, false, FLAGS, Eval_##NAME::eval, SetUniforms_##NAME::setUniforms, SHADER_SRC)); \ 12263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } while (deGetFalse()) 12273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(basic, "Basic struct usage", 0, 12293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 12303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 12313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 12323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 12333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 12343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 12353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 b;" 12363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 12373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 12383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s;" 12393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 12403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 12413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 12423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b.x, s.b.y, s.c);" 12433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 12443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 12453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.a", constCoords.x()); 12473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.b", constCoords.swizzle(1, 2, 3)); 12483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.c", 1); 12493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 12503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.constCoords.swizzle(0,1,2); 12523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 12533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(nested, "Nested struct", 0, 12553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 12563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 12573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 12583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 12593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 12603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 12613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int a;" 12623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b;" 12633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 12643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 12653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 12663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b;" 12673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 12683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 12693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s;" 12703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 12713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 12723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 12733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b.b, s.b.a + s.c);" 12743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 12753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 12763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.a", constCoords.x()); 12783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.b.a", 0); 12793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.b.b", constCoords.swizzle(1,2)); 12803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.c", 1); 12813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 12823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.constCoords.swizzle(0,1,2); 12843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 12853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(array_member, "Struct with array member", 0, 12873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 12883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 12893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 12903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 12913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 12923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 12933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float b[3];" 12943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 12953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 12963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s;" 12973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 12983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 12993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 13003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.a, s.b[0], s.b[1], s.c);" 13013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 13023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 13033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.a", constCoords.w()); 13053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.c", 1); 13063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float b[3]; 13083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry b[0] = constCoords.z(); 13093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry b[1] = constCoords.y(); 13103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry b[2] = constCoords.x(); 13113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.b", b, DE_LENGTH_OF_ARRAY(b)); 13123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 13133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.constCoords.swizzle(3,2,1); 13153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 13163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(array_member_dynamic_index, "Struct with array member, dynamic indexing", FLAG_REQUIRES_DYNAMIC_INDEXING, 13183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 13193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 13203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 13213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 13223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 13233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 13243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 13253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 13263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float b[3];" 13273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 13283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 13293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s;" 13303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 13313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 13323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 13333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s.b[ui_one], s.b[ui_zero], s.b[ui_two], s.c);" 13343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 13353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 13363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.a", constCoords.w()); 13383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.c", 1); 13393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float b[3]; 13413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry b[0] = constCoords.z(); 13423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry b[1] = constCoords.y(); 13433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry b[2] = constCoords.x(); 13443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.b", b, DE_LENGTH_OF_ARRAY(b)); 13453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 13463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.constCoords.swizzle(1,2,0); 13483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 13493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(struct_array, "Struct array", 0, 13513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 13523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 13533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 13543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 13553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 13563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 13573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 13583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 13593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump int b;" 13603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 13613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s[3];" 13623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 13633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 13643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 13653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s[2].a, s[1].a, s[0].a, s[2].b - s[1].b + s[0].b);" 13663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 13673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 13683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].a", constCoords.x()); 13703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b", 0); 13713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].a", constCoords.y()); 13723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b", 1); 13733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[2].a", constCoords.z()); 13743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[2].b", 2); 13753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 13763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.constCoords.swizzle(2,1,0); 13783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 13793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(struct_array_dynamic_index, "Struct array with dynamic indexing", FLAG_REQUIRES_DYNAMIC_INDEXING, 13813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 13823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 13833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 13843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 13853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 13863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 13873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 13883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 13893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump int b;" 13903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 13913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s[3];" 13923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 13933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 13943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 13953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(s[ui_two].a, s[ui_one].a, s[ui_zero].a, s[ui_two].b - s[ui_one].b + s[ui_zero].b);" 13963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 13973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 13983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].a", constCoords.x()); 14003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b", 0); 14013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].a", constCoords.y()); 14023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b", 1); 14033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[2].a", constCoords.z()); 14043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[2].b", 2); 14053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 14063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 14073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.constCoords.swizzle(2,1,0); 14083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 14093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(nested_struct_array, "Nested struct array", 0, 14113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 14123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 14133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 14143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 14153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b[2];" 14163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 14173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 14183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 14193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b[3];" 14203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 14213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 14223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s[2];" 14233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 14243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 14253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 14263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float r = (s[0].b[1].b[0].x + s[1].b[2].b[1].y) * s[0].b[0].a; // (z + z) * 0.5" 14273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float g = s[1].b[0].b[0].y * s[0].b[2].a * s[1].b[2].a; // x * 0.25 * 4" 14283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float b = (s[0].b[2].b[1].y + s[0].b[1].b[0].y + s[1].a) * s[0].b[1].a; // (w + w + w) * 0.333" 14293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a = float(s[0].c) + s[1].b[2].a - s[1].b[1].a; // 0 + 4.0 - 3.0" 14303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(r, g, b, a);" 14313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 14323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 14333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 14343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec2 arr[2]; 14353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].a", constCoords.x()); 14373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(0,1); 14383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(2,3); 14393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[0].a", 0.5f); 14403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 14413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(2,3); 14423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(0,1); 14433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[1].a", 1.0f/3.0f); 14443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 14453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(0,2); 14463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(1,3); 14473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[2].a", 1.0f/4.0f); 14483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 14493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].c", 0); 14503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].a", constCoords.w()); 14523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(0,0); 14533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(1,1); 14543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[0].a", 2.0f); 14553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 14563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(2,2); 14573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(3,3); 14583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[1].a", 3.0f); 14593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 14603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(1,0); 14613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(3,2); 14623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[2].a", 4.0f); 14633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 14643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].c", 1); 14653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 14663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 14673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.constCoords.swizzle(2,0,3); 14683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 14693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(nested_struct_array_dynamic_index, "Nested struct array with dynamic indexing", FLAG_REQUIRES_DYNAMIC_INDEXING, 14713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 14723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 14733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 14743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 14753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 14763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 14773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 14783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 14793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b[2];" 14803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 14813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 14823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 14833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b[3];" 14843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 14853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 14863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s[2];" 14873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 14883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 14893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 14903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float r = (s[0].b[ui_one].b[ui_one-1].x + s[ui_one].b[ui_two].b[ui_zero+1].y) * s[0].b[0].a; // (z + z) * 0.5" 14913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float g = s[ui_two-1].b[ui_two-2].b[ui_zero].y * s[0].b[ui_two].a * s[ui_one].b[2].a; // x * 0.25 * 4" 14923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float b = (s[ui_zero].b[ui_one+1].b[1].y + s[0].b[ui_one*ui_one].b[0].y + s[ui_one].a) * s[0].b[ui_two-ui_one].a; // (w + w + w) * 0.333" 14933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a = float(s[ui_zero].c) + s[ui_one-ui_zero].b[ui_two].a - s[ui_zero+ui_one].b[ui_two-ui_one].a; // 0 + 4.0 - 3.0" 14943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(r, g, b, a);" 14953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 14963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 14973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 14983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec2 arr[2]; 14993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].a", constCoords.x()); 15013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(0,1); 15023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(2,3); 15033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[0].a", 0.5f); 15043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 15053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(2,3); 15063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(0,1); 15073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[1].a", 1.0f/3.0f); 15083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 15093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(0,2); 15103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(1,3); 15113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[2].a", 1.0f/4.0f); 15123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 15133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].c", 0); 15143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].a", constCoords.w()); 15163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(0,0); 15173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(1,1); 15183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[0].a", 2.0f); 15193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 15203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(2,2); 15213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(3,3); 15223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[1].a", 3.0f); 15233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 15243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(1,0); 15253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(3,2); 15263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[2].a", 4.0f); 15273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 15283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].c", 1); 15293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 15303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 15313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.constCoords.swizzle(2,0,3); 15323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 15333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(loop_struct_array, "Struct array usage in loop", 0, 15353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 15363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 15373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 15383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 15393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 15403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 15413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 15423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 15433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump int b;" 15443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 15453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s[3];" 15463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 15473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 15483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 15493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float rgb[3];" 15503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int alpha = 0;" 15513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int i = 0; i < 3; i++)" 15523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 15533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " rgb[i] = s[2-i].a;" 15543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " alpha += s[i].b;" 15553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 15563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);" 15573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 15583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 15593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 15603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].a", constCoords.x()); 15613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b", 0); 15623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].a", constCoords.y()); 15633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b", -1); 15643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[2].a", constCoords.z()); 15653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[2].b", 2); 15663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 15673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 15683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.constCoords.swizzle(2,1,0); 15693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 15703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(loop_nested_struct_array, "Nested struct array usage in loop", 0, 15723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 15733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 15743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 15753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 15763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 15773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_two;" 15783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_three;" 15793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_four;" 15803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_half;" 15813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_third;" 15823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_fourth;" 15833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_sixth;" 15843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 15853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 15863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 15873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b[2];" 15883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 15893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 15903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 15913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b[3];" 15923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 15933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 15943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s[2];" 15953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 15963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 15973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 15983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float r = 0.0; // (x*3 + y*3) / 6.0" 15993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float g = 0.0; // (y*3 + z*3) / 6.0" 16003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float b = 0.0; // (z*3 + w*3) / 6.0" 16013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a = 1.0;" 16023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int i = 0; i < 2; i++)" 16033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 16043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int j = 0; j < 3; j++)" 16053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 16063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " r += s[0].b[j].b[i].y;" 16073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " g += s[i].b[j].b[0].x;" 16083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " b += s[i].b[j].b[1].x;" 16093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " a *= s[i].b[j].a;" 16103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 16113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 16123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);" 16133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 16143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 16153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 16163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec2 arr[2]; 16173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].a", constCoords.x()); 16193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(1,0); 16203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(2,0); 16213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[0].a", 0.5f); 16223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 16233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(1,1); 16243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(3,1); 16253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[1].a", 1.0f/3.0f); 16263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 16273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(2,1); 16283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(2,1); 16293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[2].a", 1.0f/4.0f); 16303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 16313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].c", 0); 16323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].a", constCoords.w()); 16343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(2,0); 16353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(2,1); 16363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[0].a", 2.0f); 16373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 16383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(2,2); 16393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(3,3); 16403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[1].a", 3.0f); 16413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 16423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(1,0); 16433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(3,2); 16443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[2].a", 4.0f); 16453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 16463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].c", 1); 16473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 16483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 16493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = (c.constCoords.swizzle(0,1,2) + c.constCoords.swizzle(1,2,3)) * 0.5f; 16503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 16513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(dynamic_loop_struct_array, "Struct array usage in dynamic loop", FLAG_REQUIRES_DYNAMIC_INDEXING|FLAG_REQUIRES_DYNAMIC_LOOPS, 16533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 16543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 16553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 16563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 16573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 16583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_three;" 16593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 16603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 16613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 16623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump int b;" 16633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 16643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s[3];" 16653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 16663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 16673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 16683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float rgb[3];" 16693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int alpha = 0;" 16703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int i = 0; i < ui_three; i++)" 16713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 16723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " rgb[i] = s[2-i].a;" 16733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " alpha += s[i].b;" 16743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 16753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);" 16763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 16773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 16783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 16793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].a", constCoords.x()); 16803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b", 0); 16813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].a", constCoords.y()); 16823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b", -1); 16833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[2].a", constCoords.z()); 16843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[2].b", 2); 16853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 16863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 16873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.constCoords.swizzle(2,1,0); 16883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 16893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(dynamic_loop_nested_struct_array, "Nested struct array usage in dynamic loop", FLAG_REQUIRES_DYNAMIC_INDEXING|FLAG_REQUIRES_DYNAMIC_LOOPS, 16913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 16923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 16933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 16943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 16953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 16963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_three;" 16973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_two;" 16983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_three;" 16993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_four;" 17003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_half;" 17013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_third;" 17023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_fourth;" 17033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_sixth;" 17043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 17053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 17063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 17073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b[2];" 17083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 17093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 17103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 17113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b[3];" 17123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 17133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 17143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s[2];" 17153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 17163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 17173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 17183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float r = 0.0; // (x*3 + y*3) / 6.0" 17193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float g = 0.0; // (y*3 + z*3) / 6.0" 17203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float b = 0.0; // (z*3 + w*3) / 6.0" 17213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a = 1.0;" 17223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int i = 0; i < ui_two; i++)" 17233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 17243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " for (int j = 0; j < ui_three; j++)" 17253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " {" 17263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " r += s[0].b[j].b[i].y;" 17273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " g += s[i].b[j].b[0].x;" 17283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " b += s[i].b[j].b[1].x;" 17293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " a *= s[i].b[j].a;" 17303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 17313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " }" 17323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);" 17333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 17343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 17353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 17363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec2 arr[2]; 17373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].a", constCoords.x()); 17393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(1,0); 17403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(2,0); 17413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[0].a", 0.5f); 17423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 17433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(1,1); 17443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(3,1); 17453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[1].a", 1.0f/3.0f); 17463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 17473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(2,1); 17483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(2,1); 17493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[2].a", 1.0f/4.0f); 17503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 17513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].c", 0); 17523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].a", constCoords.w()); 17543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(2,0); 17553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(2,1); 17563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[0].a", 2.0f); 17573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 17583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(2,2); 17593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(3,3); 17603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[1].a", 3.0f); 17613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 17623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[0] = constCoords.swizzle(1,0); 17633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry arr[1] = constCoords.swizzle(3,2); 17643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[2].a", 4.0f); 17653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr)); 17663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].c", 1); 17673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 17683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 17693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = (c.constCoords.swizzle(0,1,2) + c.constCoords.swizzle(1,2,3)) * 0.5f; 17703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 17713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(sampler, "Sampler in struct", FLAG_USES_TEXTURES, 17733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 17743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 17753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 17763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 17773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 17783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 17793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 b;" 17803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " sampler2D c;" 17813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 17823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s;" 17833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 17843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 17853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 17863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(texture2D(s.c, ${COORDS}.xy * s.b.xy + s.b.z).rgb, s.a);" 17873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 17883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 17893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 17903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_UNREF(constCoords); 17913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.a", 1.0f); 17923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.b", tcu::Vec3(0.25f, 0.25f, 0.5f)); 17933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.c", 0); 17943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 17953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 17963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.texture2D(TEXTURE_BRICK, c.coords.swizzle(0,1) * 0.25f + 0.5f).swizzle(0,1,2); 17973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 17983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(sampler_nested, "Sampler in nested struct", FLAG_USES_TEXTURES, 18003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 18013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 18023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_zero;" 18033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 18043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 18053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct T {" 18063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " sampler2D a;" 18073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec2 b;" 18083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 18093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 18103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 18113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " T b;" 18123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 18133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 18143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s;" 18153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 18163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 18173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 18183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(texture2D(s.b.a, ${COORDS}.xy * s.b.b + s.a).rgb, s.c);" 18193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 18203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 18213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 18223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_UNREF(constCoords); 18233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.a", 0.5f); 18243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.b.a", 0); 18253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.b.b", tcu::Vec2(0.25f, 0.25f)); 18263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s.c", 1); 18273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 18283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 18293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.texture2D(TEXTURE_BRICK, c.coords.swizzle(0,1) * 0.25f + 0.5f).swizzle(0,1,2); 18303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 18313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(sampler_array, "Sampler in struct array", FLAG_USES_TEXTURES, 18333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 18343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 18353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_one;" 18363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 18373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 18383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 18393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 b;" 18403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " sampler2D c;" 18413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 18423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S s[2];" 18433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 18443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 18453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 18463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(texture2D(s[1].c, ${COORDS}.xy * s[0].b.xy + s[1].b.z).rgb, s[0].a);" 18473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 18483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 18493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 18503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_UNREF(constCoords); 18513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].a", 1.0f); 18523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].b", tcu::Vec3(0.25f, 0.25f, 0.25f)); 18533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[0].c", 1); 18543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].a", 0.0f); 18553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].b", tcu::Vec3(0.5f, 0.5f, 0.5f)); 18563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "s[1].c", 0); 18573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 18583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 18593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xyz() = c.texture2D(TEXTURE_BRICK, c.coords.swizzle(0,1) * 0.25f + 0.5f).swizzle(0,1,2); 18603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 18613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(equal, "Struct equality", 0, 18633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 18643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 18653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_one;" 18663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 18673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 18683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 18693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 18703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 b;" 18713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 18723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 18733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S a;" 18743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S b;" 18753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S c;" 18763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 18773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 18783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 18793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S d = S(uf_one, vec3(0.0, floor(${COORDS}.y+1.0), 2.0), ui_two);" 18803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(0.0, 0.0, 0.0, 1.0);" 18813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a == b) ${DST}.x = 1.0;" 18823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a == c) ${DST}.y = 1.0;" 18833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a == d) ${DST}.z = 1.0;" 18843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 18853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 18863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 18873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_UNREF(constCoords); 18883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "a.a", 1.0f); 18893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "a.b", tcu::Vec3(0.0f, 1.0f, 2.0f)); 18903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "a.c", 2); 18913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "b.a", 1.0f); 18923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "b.b", tcu::Vec3(0.0f, 1.0f, 2.0f)); 18933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "b.c", 2); 18943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "c.a", 1.0f); 18953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "c.b", tcu::Vec3(0.0f, 1.1f, 2.0f)); 18963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "c.c", 2); 18973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 18983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 18993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xy() = tcu::Vec2(1.0f, 0.0f); 19003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (deFloatFloor(c.coords[1]+1.0f) == deFloatFloor(1.1f)) 19013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.z() = 1.0f; 19023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 19033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UNIFORM_STRUCT_CASE(not_equal, "Struct equality", 0, 19053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LineStream() 19063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "${DECLARATIONS}" 19073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform mediump float uf_one;" 19083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform int ui_two;" 19093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 19103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "struct S {" 19113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump float a;" 19123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " mediump vec3 b;" 19133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " int c;" 19143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "};" 19153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S a;" 19163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S b;" 19173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform S c;" 19183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "" 19193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)" 19203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{" 19213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " S d = S(uf_one, vec3(0.0, floor(${COORDS}.y+1.0), 2.0), ui_two);" 19223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${DST} = vec4(0.0, 0.0, 0.0, 1.0);" 19233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a != b) ${DST}.x = 1.0;" 19243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a != c) ${DST}.y = 1.0;" 19253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " if (a != d) ${DST}.z = 1.0;" 19263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << " ${ASSIGN_POS}" 19273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}", 19283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 19293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_UNREF(constCoords); 19303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "a.a", 1.0f); 19313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "a.b", tcu::Vec3(0.0f, 1.0f, 2.0f)); 19323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "a.c", 2); 19333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "b.a", 1.0f); 19343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "b.b", tcu::Vec3(0.0f, 1.0f, 2.0f)); 19353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "b.c", 2); 19363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "c.a", 1.0f); 19373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "c.b", tcu::Vec3(0.0f, 1.1f, 2.0f)); 19383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setUniform(gl, programID, "c.c", 2); 19393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }, 19403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 19413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.xy() = tcu::Vec2(0.0f, 1.0f); 19423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (deFloatFloor(c.coords[1]+1.0f) != deFloatFloor(1.1f)) 19433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color.z() = 1.0f; 19443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }); 19453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 19463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19473c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderStructTests::ShaderStructTests (Context& context) 19483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCaseGroup(context, "struct", "Struct Tests") 19493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 19503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 19513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19523c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderStructTests::~ShaderStructTests (void) 19533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 19543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 19553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19563c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderStructTests::init (void) 19573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 19583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(new LocalStructTests(m_context)); 19593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(new UniformStructTests(m_context)); 19603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 19613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional 19633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles2 19643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp 1965