1d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal/*------------------------------------------------------------------------ 2d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * Vulkan Conformance Tests 3d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * ------------------------ 4d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * 5d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * Copyright (c) 2015 The Khronos Group Inc. 6d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * Copyright (c) 2015 Samsung Electronics Co., Ltd. 7c05b7f1437e619205c96eaa31c0b79ec97a0d47dPyry Haulos * Copyright (c) 2016 The Android Open Source Project 8d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * 9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License. 11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at 12d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * 13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 14d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * 15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software 16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and 19978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License. 20d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * 21d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal *//*! 22d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * \file 23d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * \brief Shader struct tests. 24d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal *//*--------------------------------------------------------------------*/ 25d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 26d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal#include "vktShaderRenderStructTests.hpp" 27d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal#include "vktShaderRender.hpp" 28d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal#include "tcuStringTemplate.hpp" 29d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal#include "deMath.h" 30d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 31d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galnamespace vkt 32d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 33d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galnamespace sr 34d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 35d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galnamespace 36d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 37d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 38d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galclass ShaderStructCase : public ShaderRenderCase 39d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 40d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galpublic: 41d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal ShaderStructCase (tcu::TestContext& testCtx, 42d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal const std::string& name, 43d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal const std::string& description, 44d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal bool isVertexCase, 45d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal ShaderEvalFunc evalFunc, 46d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UniformSetupFunc setupUniformsFunc, 47d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal const std::string& vertShaderSource, 48d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal const std::string& fragShaderSource); 49d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal ~ShaderStructCase (void); 50d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 51d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galprivate: 52d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal ShaderStructCase (const ShaderStructCase&); 53d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal ShaderStructCase& operator= (const ShaderStructCase&); 54d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal}; 55d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 56d994b3a2d869497f1496273b6d9b8affb1752b20Peter GalShaderStructCase::ShaderStructCase (tcu::TestContext& testCtx, 57d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal const std::string& name, 58d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal const std::string& description, 59d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal bool isVertexCase, 60d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal ShaderEvalFunc evalFunc, 61d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UniformSetupFunc setupUniformsFunc, 62d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal const std::string& vertShaderSource, 63d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal const std::string& fragShaderSource) 64d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal : ShaderRenderCase (testCtx, name, description, isVertexCase, evalFunc, new UniformSetup(setupUniformsFunc), DE_NULL) 65d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 66d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal m_vertShaderSource = vertShaderSource; 67d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal m_fragShaderSource = fragShaderSource; 68d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} 69d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 70d994b3a2d869497f1496273b6d9b8affb1752b20Peter GalShaderStructCase::~ShaderStructCase (void) 71d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 72d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} 73d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 74d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galstatic de::MovePtr<ShaderStructCase> createStructCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, bool isVertexCase, ShaderEvalFunc evalFunc, UniformSetupFunc uniformFunc, const LineStream& shaderSrc) 75d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 76d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal static std::string defaultVertSrc = 77168546fb8ff28c2a81bf2dd37a5f865c3730fa2dCsaba Osztrogonác "#version 310 es\n" 78d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "layout(location = 0) in highp vec4 a_position;\n" 79d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "layout(location = 1) in highp vec4 a_coords;\n" 80d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "layout(location = 0) out mediump vec4 v_coords;\n\n" 81d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "void main (void)\n" 82d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "{\n" 83d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal " v_coords = a_coords;\n" 84d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal " gl_Position = a_position;\n" 85d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "}\n"; 86d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal static std::string defaultFragSrc = 87168546fb8ff28c2a81bf2dd37a5f865c3730fa2dCsaba Osztrogonác "#version 310 es\n" 88d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "layout(location = 0) in mediump vec4 v_color;\n" 89d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "layout(location = 0) out mediump vec4 o_color;\n\n" 90d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "void main (void)\n" 91d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "{\n" 92d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal " o_color = v_color;\n" 93d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "}\n"; 94d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 95d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal // Fill in specialization parameters and build the shader source. 96d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal std::string vertSrc; 97d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal std::string fragSrc; 98d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal std::map<std::string, std::string> spParams; 99d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 100d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal if (isVertexCase) 101d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 102d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal spParams["HEADER"] = 103168546fb8ff28c2a81bf2dd37a5f865c3730fa2dCsaba Osztrogonác "#version 310 es\n" 104d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "layout(location = 0) in highp vec4 a_position;\n" 105d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "layout(location = 1) in highp vec4 a_coords;\n" 106d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "layout(location = 0) out mediump vec4 v_color;"; 107d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal spParams["COORDS"] = "a_coords"; 108d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal spParams["DST"] = "v_color"; 109d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal spParams["ASSIGN_POS"] = "gl_Position = a_position;"; 110d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 111d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal vertSrc = tcu::StringTemplate(shaderSrc.str()).specialize(spParams); 112d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal fragSrc = defaultFragSrc; 113d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal } 114d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal else 115d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 116d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal spParams["HEADER"] = 117168546fb8ff28c2a81bf2dd37a5f865c3730fa2dCsaba Osztrogonác "#version 310 es\n" 118d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "layout(location = 0) in mediump vec4 v_coords;\n" 119d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal "layout(location = 0) out mediump vec4 o_color;"; 120d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal spParams["COORDS"] = "v_coords"; 121d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal spParams["DST"] = "o_color"; 122d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal spParams["ASSIGN_POS"] = ""; 123d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 124d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal vertSrc = defaultVertSrc; 125d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal fragSrc = tcu::StringTemplate(shaderSrc.str()).specialize(spParams); 126d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal } 127d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 128d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal return de::MovePtr<ShaderStructCase>(new ShaderStructCase(testCtx, name, description, isVertexCase, evalFunc, uniformFunc, vertSrc, fragSrc)); 129d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} 130d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 131d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galclass LocalStructTests : public tcu::TestCaseGroup 132d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 133d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galpublic: 134d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LocalStructTests (tcu::TestContext& testCtx) 135d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal : TestCaseGroup(testCtx, "local", "Local structs") 136d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 137d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal } 138d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 139d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal ~LocalStructTests (void) 140d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 141d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal } 142d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 143d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal virtual void init (void); 144d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal}; 145d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 146d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galvoid LocalStructTests::init (void) 147d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 148dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh #define LOCAL_STRUCT_CASE(NAME, DESCRIPTION, SHADER_SRC, SET_UNIFORMS_BODY, EVAL_FUNC_BODY) \ 149dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh do { \ 150dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh struct SetUniforms_##NAME { static void setUniforms (ShaderRenderCaseInstance& instance, const tcu::Vec4&) SET_UNIFORMS_BODY }; /* NOLINT(SET_UNIFORMS_BODY) */ \ 151dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh struct Eval_##NAME { static void eval (ShaderEvalContext& c) EVAL_FUNC_BODY }; /* NOLINT(EVAL_FUNC_BODY) */ \ 152d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal addChild(createStructCase(m_testCtx, #NAME "_vertex", DESCRIPTION, true, &Eval_##NAME::eval, &SetUniforms_##NAME::setUniforms, SHADER_SRC).release()); \ 153d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal addChild(createStructCase(m_testCtx, #NAME "_fragment", DESCRIPTION, false, &Eval_##NAME::eval, &SetUniforms_##NAME::setUniforms, SHADER_SRC).release()); \ 154d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal } while (deGetFalse()) 155d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 156d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(basic, "Basic struct usage", 157d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 158d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 159d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };" 160d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 161d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 162d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 163d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec3 b;" 164d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 165d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 166d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 167d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 168d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 169d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = S(${COORDS}.x, vec3(0.0), ui_one);" 170d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b = ${COORDS}.yzw;" 171d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b.x, s.b.y, s.c);" 172d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 173d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 174d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 175d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ONE); 176d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 177d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 178d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(0, 1, 2); 179d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 180d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 181d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(nested, "Nested struct", 182d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 183d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 184d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 185d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 186d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 187d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 188d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int a;" 189d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b;" 190d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 191d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 192d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 193d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b;" 194d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 195d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 196d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 197d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 198d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 199d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);" 200d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b = T(ui_zero, ${COORDS}.yz);" 201d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b.b, s.b.a + s.c);" 202d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 203d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 204d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 205d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 206d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 207d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 208d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 209d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(0, 1, 2); 210d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 211d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 212d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(array_member, "Struct with array member", 213d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 214d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 215d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };" 216d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 217d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 218d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 219d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float b[3];" 220d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 221d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 222d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 223d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 224d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 225d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s;" 226d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.a = ${COORDS}.w;" 227d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.c = ui_one;" 228d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b[0] = ${COORDS}.z;" 229d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b[1] = ${COORDS}.y;" 230d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b[2] = ${COORDS}.x;" 231d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b[0], s.b[1], s.c);" 232d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 233d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 234d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 235d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ONE); 236d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 237d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 238d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(3, 2, 1); 239d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 240d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 241d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(array_member_dynamic_index, "Struct with array member, dynamic indexing", 242d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 243d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 244d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 245d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 246d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 247d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 248d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 249d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 250d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float b[3];" 251d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 252d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 253d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 254d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 255d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 256d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s;" 257d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.a = ${COORDS}.w;" 258d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.c = ui_one;" 259d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b[0] = ${COORDS}.z;" 260d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b[1] = ${COORDS}.y;" 261d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b[2] = ${COORDS}.x;" 262d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.b[ui_one], s.b[ui_zero], s.b[ui_two], s.c);" 263d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 264d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 265d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 266d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 267d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 268d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 269d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 270d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 271d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(1,2,0); 272d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 273d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 274d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(struct_array, "Struct array", 275d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 276d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 277d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 278d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 279d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 280d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 281d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 282d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 283d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump int b;" 284d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 285d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 286d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 287d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 288d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s[3];" 289d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0] = S(${COORDS}.x, ui_zero);" 290d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].a = ${COORDS}.y;" 291d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b = ui_one;" 292d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[2] = S(${COORDS}.z, ui_two);" 293d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s[2].a, s[1].a, s[0].a, s[2].b - s[1].b + s[0].b);" 294d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 295d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 296d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 297d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 298d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 299d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 300d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 301d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 302d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(2, 1, 0); 303d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 304d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 305d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(struct_array_dynamic_index, "Struct array with dynamic indexing", 306d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 307d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 308d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 309d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 310d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 311d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 312d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 313d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 314d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump int b;" 315d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 316d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 317d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 318d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 319d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s[3];" 320d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0] = S(${COORDS}.x, ui_zero);" 321d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].a = ${COORDS}.y;" 322d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b = ui_one;" 323d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[2] = S(${COORDS}.z, ui_two);" 324d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${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);" 325d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 326d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 327d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 328d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 329d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 330d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 331d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 332d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 333d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(2, 1, 0); 334d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 335d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 336d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(nested_struct_array, "Nested struct array", 337d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 338d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 339d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 340d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 341d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 342d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { mediump float uf_two; };" 343d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 4) uniform buffer4 { mediump float uf_three; };" 344d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 5) uniform buffer5 { mediump float uf_four; };" 345d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 6) uniform buffer6 { mediump float uf_half; };" 346d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 7) uniform buffer7 { mediump float uf_third; };" 347d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 8) uniform buffer8 { mediump float uf_fourth; };" 348d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 349d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 350d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 351d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b[2];" 352d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 353d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 354d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 355d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b[3];" 356d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 357d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 358d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 359d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 360d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 361d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s[2];" 362d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 363d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " // S[0]" 364d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].a = ${COORDS}.x;" 365d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[0].a = uf_half;" 366d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[0].b[0] = ${COORDS}.xy;" 367d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[0].b[1] = ${COORDS}.zw;" 368d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[1].a = uf_third;" 369d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[1].b[0] = ${COORDS}.zw;" 370d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[1].b[1] = ${COORDS}.xy;" 371d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[2].a = uf_fourth;" 372d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[2].b[0] = ${COORDS}.xz;" 373d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[2].b[1] = ${COORDS}.yw;" 374d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].c = ui_zero;" 375d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 376d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " // S[1]" 377d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].a = ${COORDS}.w;" 378d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[0].a = uf_two;" 379d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[0].b[0] = ${COORDS}.xx;" 380d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[0].b[1] = ${COORDS}.yy;" 381d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[1].a = uf_three;" 382d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[1].b[0] = ${COORDS}.zz;" 383d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[1].b[1] = ${COORDS}.ww;" 384d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[2].a = uf_four;" 385d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[2].b[0] = ${COORDS}.yx;" 386d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[2].b[1] = ${COORDS}.wz;" 387d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].c = ui_one;" 388d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 389d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " 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" 390d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float g = s[1].b[0].b[0].y * s[0].b[2].a * s[1].b[2].a; // x * 0.25 * 4" 391d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " 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" 392d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a = float(s[0].c) + s[1].b[2].a - s[1].b[1].a; // 0 + 4.0 - 3.0" 393d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(r, g, b, a);" 394d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 395d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 396d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 397d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 398d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 399d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 400d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(3u, UF_TWO); 401d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(4u, UF_THREE); 402d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(5u, UF_FOUR); 403d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(6u, UF_HALF); 404d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(7u, UF_THIRD); 405d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(8u, UF_FOURTH); 406d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 407d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 408d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(2, 0, 3); 409d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 410d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 411d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(nested_struct_array_dynamic_index, "Nested struct array with dynamic indexing", 412d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 413d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 414d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 415d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 416d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 417d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { mediump float uf_two; };" 418d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 4) uniform buffer4 { mediump float uf_three; };" 419d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 5) uniform buffer5 { mediump float uf_four; };" 420d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 6) uniform buffer6 { mediump float uf_half; };" 421d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 7) uniform buffer7 { mediump float uf_third; };" 422d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 8) uniform buffer8 { mediump float uf_fourth; };" 423d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 424d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 425d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 426d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b[2];" 427d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 428d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 429d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 430d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b[3];" 431d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 432d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 433d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 434d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 435d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 436d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s[2];" 437d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 438d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " // S[0]" 439d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].a = ${COORDS}.x;" 440d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[0].a = uf_half;" 441d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[0].b[0] = ${COORDS}.xy;" 442d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[0].b[1] = ${COORDS}.zw;" 443d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[1].a = uf_third;" 444d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[1].b[0] = ${COORDS}.zw;" 445d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[1].b[1] = ${COORDS}.xy;" 446d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[2].a = uf_fourth;" 447d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[2].b[0] = ${COORDS}.xz;" 448d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[2].b[1] = ${COORDS}.yw;" 449d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].c = ui_zero;" 450d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 451d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " // S[1]" 452d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].a = ${COORDS}.w;" 453d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[0].a = uf_two;" 454d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[0].b[0] = ${COORDS}.xx;" 455d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[0].b[1] = ${COORDS}.yy;" 456d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[1].a = uf_three;" 457d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[1].b[0] = ${COORDS}.zz;" 458d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[1].b[1] = ${COORDS}.ww;" 459d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[2].a = uf_four;" 460d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[2].b[0] = ${COORDS}.yx;" 461d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[2].b[1] = ${COORDS}.wz;" 462d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].c = ui_one;" 463d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 464d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " 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" 465d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " 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" 466d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " 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" 467d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " 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" 468d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(r, g, b, a);" 469d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 470d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 471d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 472d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 473d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 474d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 475d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(3u, UF_TWO); 476d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(4u, UF_THREE); 477d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(5u, UF_FOUR); 478d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(6u, UF_HALF); 479d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(7u, UF_THIRD); 480d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(8u, UF_FOURTH); 481d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 482d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 483d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(2, 0, 3); 484d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 485d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 486d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(parameter, "Struct as a function parameter", 487d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 488d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 489d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };" 490d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 491d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 492d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 493d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec3 b;" 494d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 495d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 496d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 497d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "mediump vec4 myFunc (S s)" 498d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 499d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " return vec4(s.a, s.b.x, s.b.y, s.c);" 500d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}" 501d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 502d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 503d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 504d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = S(${COORDS}.x, vec3(0.0), ui_one);" 505d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b = ${COORDS}.yzw;" 506d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = myFunc(s);" 507d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 508d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 509d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 510d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ONE); 511d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 512d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 513d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(0, 1, 2); 514d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 515d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 516d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(parameter_nested, "Nested struct as a function parameter", 517d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 518d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 519d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 520d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 521d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 522d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 523d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int a;" 524d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b;" 525d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 526d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 527d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 528d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b;" 529d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 530d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 531d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 532d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "mediump vec4 myFunc (S s)" 533d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 534d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " return vec4(s.a, s.b.b, s.b.a + s.c);" 535d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}" 536d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 537d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 538d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 539d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);" 540d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b = T(ui_zero, ${COORDS}.yz);" 541d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = myFunc(s);" 542d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 543d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 544d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 545d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 546d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 547d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 548d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 549d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(0, 1, 2); 550d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 551d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 552d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(return, "Struct as a return value", 553d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 554d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 555d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };" 556d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 557d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 558d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 559d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec3 b;" 560d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 561d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 562d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 563d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "S myFunc (void)" 564d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 565d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = S(${COORDS}.x, vec3(0.0), ui_one);" 566d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b = ${COORDS}.yzw;" 567d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " return s;" 568d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}" 569d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 570d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 571d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 572d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = myFunc();" 573d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b.x, s.b.y, s.c);" 574d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 575d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 576d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 577d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ONE); 578d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 579d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 580d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(0, 1, 2); 581d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 582d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 583d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(return_nested, "Nested struct", 584d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 585d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 586d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 587d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 588d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 589d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 590d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int a;" 591d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b;" 592d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 593d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 594d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 595d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b;" 596d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 597d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 598d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 599d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "S myFunc (void)" 600d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 601d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);" 602d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b = T(ui_zero, ${COORDS}.yz);" 603d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " return s;" 604d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}" 605d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 606d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 607d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 608d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = myFunc();" 609d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b.b, s.b.a + s.c);" 610d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 611d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 612d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 613d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 614d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 615d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 616d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 617d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(0, 1, 2); 618d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 619d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 620d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(conditional_assignment, "Conditional struct assignment", 621d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 622d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 623d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 624d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 625d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { mediump float uf_one; };" 626d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 627d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 628d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 629d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec3 b;" 630d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 631d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 632d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 633d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 634d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 635d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);" 636d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (uf_one > 0.0)" 637d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);" 638d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b.xy, s.c);" 639d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 640d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 641d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 642d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 643d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 644d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UF_ONE); 645d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 646d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 647d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(3, 2, 1); 648d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 649d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 650d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(loop_assignment, "Struct assignment in loop", 651d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 652d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 653d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 654d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 655d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 656d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 657d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 658d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec3 b;" 659d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 660d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 661d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 662d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 663d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 664d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);" 665d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int i = 0; i < 3; i++)" 666d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 667d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (i == 1)" 668d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);" 669d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 670d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b.xy, s.c);" 671d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 672d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 673d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 674d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 675d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 676d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 677d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 678d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(3, 2, 1); 679d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 680d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 681d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(dynamic_loop_assignment, "Struct assignment in loop", 682d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 683d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 684d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 685d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 686d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_three; };" 687d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 688d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 689d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 690d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec3 b;" 691d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 692d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 693d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 694d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 695d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 696d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);" 697d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int i = 0; i < ui_three; i++)" 698d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 699d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (i == ui_one)" 700d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);" 701d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 702d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b.xy, s.c);" 703d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 704d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 705d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 706d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 707d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 708d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_THREE); 709d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 710d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 711d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(3, 2, 1); 712d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 713d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 714d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(nested_conditional_assignment, "Conditional assignment of nested struct", 715d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 716d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 717d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 718d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 719d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { mediump float uf_one; };" 720d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 721d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 722d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int a;" 723d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b;" 724d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 725d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 726d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 727d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b;" 728d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 729d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 730d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 731d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 732d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 733d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);" 734d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (uf_one > 0.0)" 735d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b = T(ui_zero, ${COORDS}.zw);" 736d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b.b, s.c - s.b.a);" 737d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 738d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 739d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 740d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 741d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 742d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UF_ONE); 743d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 744d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 745d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(0, 2, 3); 746d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 747d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 748d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(nested_loop_assignment, "Nested struct assignment in loop", 749d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 750d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 751d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 752d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 753d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { mediump float uf_one; };" 754d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 755d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 756d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int a;" 757d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b;" 758d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 759d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 760d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 761d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b;" 762d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 763d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 764d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 765d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 766d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 767d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);" 768d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int i = 0; i < 3; i++)" 769d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 770d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (i == 1)" 771d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b = T(ui_zero, ${COORDS}.zw);" 772d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 773d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b.b, s.c - s.b.a);" 774d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 775d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 776d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 777d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 778d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 779d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UF_ONE); 780d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 781d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 782d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(0, 2, 3); 783d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 784d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 785d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(nested_dynamic_loop_assignment, "Nested struct assignment in dynamic loop", 786d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 787d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 788d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 789d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 790d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_three; };" 791d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { mediump float uf_one; };" 792d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 793d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 794d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int a;" 795d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b;" 796d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 797d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 798d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 799d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b;" 800d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 801d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 802d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 803d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 804d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 805d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);" 806d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int i = 0; i < ui_three; i++)" 807d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 808d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (i == ui_one)" 809d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s.b = T(ui_zero, ${COORDS}.zw);" 810d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 811d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b.b, s.c - s.b.a);" 812d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 813d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 814d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 815d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 816d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 817d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_THREE); 818d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(3u, UF_ONE); 819d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 820d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 821d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(0, 2, 3); 822d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 823d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 824d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(loop_struct_array, "Struct array usage in loop", 825d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 826d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 827d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 828d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 829d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 830d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 831d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 832d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 833d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump int b;" 834d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 835d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 836d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 837d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 838d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s[3];" 839d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0] = S(${COORDS}.x, ui_zero);" 840d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].a = ${COORDS}.y;" 841d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b = -ui_one;" 842d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[2] = S(${COORDS}.z, ui_two);" 843d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 844d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float rgb[3];" 845d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int alpha = 0;" 846d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int i = 0; i < 3; i++)" 847d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 848d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " rgb[i] = s[2-i].a;" 849d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " alpha += s[i].b;" 850d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 851d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);" 852d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 853d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 854d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 855d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 856d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 857d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 858d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 859d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 860d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(2, 1, 0); 861d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 862d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 863d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(loop_nested_struct_array, "Nested struct array usage in loop", 864d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 865d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 866d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 867d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 868d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 869d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { mediump float uf_two; };" 870d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 4) uniform buffer4 { mediump float uf_three; };" 871d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 5) uniform buffer5 { mediump float uf_four; };" 872d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 6) uniform buffer6 { mediump float uf_half; };" 873d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 7) uniform buffer7 { mediump float uf_third; };" 874d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 8) uniform buffer8 { mediump float uf_fourth; };" 875d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 9) uniform buffer9 { mediump float uf_sixth; };" 876d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 877d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 878d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 879d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b[2];" 880d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 881d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 882d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 883d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b[3];" 884d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 885d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 886d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 887d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 888d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 889d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s[2];" 890d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 891d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " // S[0]" 892d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].a = ${COORDS}.x;" 893d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[0].a = uf_half;" 894d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[0].b[0] = ${COORDS}.yx;" 895d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[0].b[1] = ${COORDS}.zx;" 896d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[1].a = uf_third;" 897d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[1].b[0] = ${COORDS}.yy;" 898d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[1].b[1] = ${COORDS}.wy;" 899d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[2].a = uf_fourth;" 900d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[2].b[0] = ${COORDS}.zx;" 901d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[2].b[1] = ${COORDS}.zy;" 902d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].c = ui_zero;" 903d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 904d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " // S[1]" 905d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].a = ${COORDS}.w;" 906d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[0].a = uf_two;" 907d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[0].b[0] = ${COORDS}.zx;" 908d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[0].b[1] = ${COORDS}.zy;" 909d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[1].a = uf_three;" 910d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[1].b[0] = ${COORDS}.zz;" 911d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[1].b[1] = ${COORDS}.ww;" 912d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[2].a = uf_four;" 913d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[2].b[0] = ${COORDS}.yx;" 914d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[2].b[1] = ${COORDS}.wz;" 915d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].c = ui_one;" 916d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 917d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float r = 0.0; // (x*3 + y*3) / 6.0" 918d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float g = 0.0; // (y*3 + z*3) / 6.0" 919d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float b = 0.0; // (z*3 + w*3) / 6.0" 920d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a = 1.0;" 921d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int i = 0; i < 2; i++)" 922d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 923d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int j = 0; j < 3; j++)" 924d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 925d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " r += s[0].b[j].b[i].y;" 926d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " g += s[i].b[j].b[0].x;" 927d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " b += s[i].b[j].b[1].x;" 928d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " a *= s[i].b[j].a;" 929d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 930d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 931d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);" 932d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 933d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 934d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 935d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 936d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 937d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 938d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(3u, UF_TWO); 939d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(4u, UF_THREE); 940d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(5u, UF_FOUR); 941d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(6u, UF_HALF); 942d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(7u, UF_THIRD); 943d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(8u, UF_FOURTH); 944d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(9u, UF_SIXTH); 945d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 946d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 947d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = (c.coords.swizzle(0, 1, 2) + c.coords.swizzle(1, 2, 3)) * 0.5f; 948d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 949d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 950d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(dynamic_loop_struct_array, "Struct array usage in dynamic loop", 951d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 952d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 953d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 954d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 955d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 956d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { int ui_three; };" 957d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 958d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 959d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 960d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump int b;" 961d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 962d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 963d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 964d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 965d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s[3];" 966d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0] = S(${COORDS}.x, ui_zero);" 967d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].a = ${COORDS}.y;" 968d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b = -ui_one;" 969d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[2] = S(${COORDS}.z, ui_two);" 970d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 971d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float rgb[3];" 972d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int alpha = 0;" 973d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int i = 0; i < ui_three; i++)" 974d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 975d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " rgb[i] = s[2-i].a;" 976d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " alpha += s[i].b;" 977d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 978d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);" 979d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 980d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 981d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 982d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 983d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 984d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 985d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(3u, UI_THREE); 986d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 987d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 988d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.coords.swizzle(2, 1, 0); 989d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 990d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 991d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(dynamic_loop_nested_struct_array, "Nested struct array usage in dynamic loop", 992d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 993d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 994d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 995d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 996d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 997d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { int ui_three; };" 998d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 4) uniform buffer4 { mediump float uf_two; };" 999d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 5) uniform buffer5 { mediump float uf_three; };" 1000d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 6) uniform buffer6 { mediump float uf_four; };" 1001d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 7) uniform buffer7 { mediump float uf_half; };" 1002d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 8) uniform buffer8 { mediump float uf_third; };" 1003d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 9) uniform buffer9 { mediump float uf_fourth; };" 1004d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 10) uniform buffer10 { mediump float uf_sixth; };" 1005d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1006d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 1007d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1008d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b[2];" 1009d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1010d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1011d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1012d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b[3];" 1013d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1014d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1015d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1016d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1017d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1018d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S s[2];" 1019d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1020d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].a = ${COORDS}.x;" 1021d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[0].a = uf_half;" 1022d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[0].b[0] = ${COORDS}.yx;" 1023d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[0].b[1] = ${COORDS}.zx;" 1024d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[1].a = uf_third;" 1025d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[1].b[0] = ${COORDS}.yy;" 1026d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[1].b[1] = ${COORDS}.wy;" 1027d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[2].a = uf_fourth;" 1028d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[2].b[0] = ${COORDS}.zx;" 1029d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].b[2].b[1] = ${COORDS}.zy;" 1030d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[0].c = ui_zero;" 1031d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1032d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].a = ${COORDS}.w;" 1033d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[0].a = uf_two;" 1034d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[0].b[0] = ${COORDS}.zx;" 1035d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[0].b[1] = ${COORDS}.zy;" 1036d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[1].a = uf_three;" 1037d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[1].b[0] = ${COORDS}.zz;" 1038d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[1].b[1] = ${COORDS}.ww;" 1039d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[2].a = uf_four;" 1040d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[2].b[0] = ${COORDS}.yx;" 1041d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].b[2].b[1] = ${COORDS}.wz;" 1042d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " s[1].c = ui_one;" 1043d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1044d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float r = 0.0; // (x*3 + y*3) / 6.0" 1045d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float g = 0.0; // (y*3 + z*3) / 6.0" 1046d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float b = 0.0; // (z*3 + w*3) / 6.0" 1047d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a = 1.0;" 1048d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int i = 0; i < ui_two; i++)" 1049d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 1050d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int j = 0; j < ui_three; j++)" 1051d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 1052d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " r += s[0].b[j].b[i].y;" 1053d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " g += s[i].b[j].b[0].x;" 1054d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " b += s[i].b[j].b[1].x;" 1055d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " a *= s[i].b[j].a;" 1056d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 1057d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 1058d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);" 1059d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1060d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1061d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1062d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 1063d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 1064d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 1065d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(3u, UI_THREE); 1066d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(4u, UF_TWO); 1067d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(5u, UF_THREE); 1068d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(6u, UF_FOUR); 1069d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(7u, UF_HALF); 1070d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(8u, UF_THIRD); 1071d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(9u, UF_FOURTH); 1072d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(10u, UF_SIXTH); 1073d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1074d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1075d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = (c.coords.swizzle(0, 1, 2) + c.coords.swizzle(1, 2, 3)) * 0.5f; 1076d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1077d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1078d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(basic_equal, "Basic struct equality", 1079d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1080d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1081d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };" 1082d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_two; };" 1083d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1084d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1085d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1086d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec3 b;" 1087d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1088d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1089d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1090d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1091d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1092d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S a = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);" 1093d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S b = S(floor(${COORDS}.x+0.5), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);" 1094d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S c = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one);" 1095d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S d = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_two);" 1096d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(0.0, 0.0, 0.0, 1.0);" 1097d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a == b) ${DST}.x = 1.0;" 1098d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a == c) ${DST}.y = 1.0;" 1099d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a == d) ${DST}.z = 1.0;" 1100d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1101d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1102d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1103d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ONE); 1104d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_TWO); 1105d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1106d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1107d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal if (deFloatFloor(c.coords[0]) == deFloatFloor(c.coords[0] + 0.5f)) 1108d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.x() = 1.0f; 1109d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal if (deFloatFloor(c.coords[1]) == deFloatFloor(c.coords[1] + 0.5f)) 1110d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.y() = 1.0f; 1111d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1112d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1113d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(basic_not_equal, "Basic struct equality", 1114d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1115d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1116d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };" 1117d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_two; };" 1118d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1119d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1120d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1121d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec3 b;" 1122d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1123d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1124d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1125d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1126d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1127d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S a = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);" 1128d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S b = S(floor(${COORDS}.x+0.5), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);" 1129d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S c = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one);" 1130d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S d = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_two);" 1131d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(0.0, 0.0, 0.0, 1.0);" 1132d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a != b) ${DST}.x = 1.0;" 1133d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a != c) ${DST}.y = 1.0;" 1134d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a != d) ${DST}.z = 1.0;" 1135d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1136d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1137d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1138d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ONE); 1139d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_TWO); 1140d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1141d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1142d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal if (deFloatFloor(c.coords[0]) != deFloatFloor(c.coords[0] + 0.5f)) 1143d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.x() = 1.0f; 1144d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal if (deFloatFloor(c.coords[1]) != deFloatFloor(c.coords[1] + 0.5f)) 1145d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.y() = 1.0f; 1146d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.z() = 1.0f; 1147d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1148d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1149d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(nested_equal, "Nested struct struct equality", 1150d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1151d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1152d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };" 1153d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_two; };" 1154d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1155d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 1156d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec3 a;" 1157d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int b;" 1158d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1159d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1160d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1161d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b;" 1162d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1163d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1164d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1165d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1166d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1167d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S a = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);" 1168d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S b = S(floor(${COORDS}.x+0.5), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);" 1169d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S c = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one), 1);" 1170d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S d = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_two), 1);" 1171d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(0.0, 0.0, 0.0, 1.0);" 1172d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a == b) ${DST}.x = 1.0;" 1173d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a == c) ${DST}.y = 1.0;" 1174d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a == d) ${DST}.z = 1.0;" 1175d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1176d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1177d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1178d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ONE); 1179d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_TWO); 1180d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1181d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1182d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal if (deFloatFloor(c.coords[0]) == deFloatFloor(c.coords[0] + 0.5f)) 1183d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.x() = 1.0f; 1184d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal if (deFloatFloor(c.coords[1]) == deFloatFloor(c.coords[1] + 0.5f)) 1185d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.y() = 1.0f; 1186d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1187d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1188d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LOCAL_STRUCT_CASE(nested_not_equal, "Nested struct struct equality", 1189d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1190d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1191d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };" 1192d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_two; };" 1193d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1194d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 1195d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec3 a;" 1196d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int b;" 1197d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1198d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1199d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1200d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b;" 1201d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1202d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1203d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1204d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1205d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1206d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S a = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);" 1207d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S b = S(floor(${COORDS}.x+0.5), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);" 1208d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S c = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one), 1);" 1209d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S d = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_two), 1);" 1210d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(0.0, 0.0, 0.0, 1.0);" 1211d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a != b) ${DST}.x = 1.0;" 1212d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a != c) ${DST}.y = 1.0;" 1213d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a != d) ${DST}.z = 1.0;" 1214d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1215d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1216d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1217d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ONE); 1218d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_TWO); 1219d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1220d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1221d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal if (deFloatFloor(c.coords[0]) != deFloatFloor(c.coords[0] + 0.5f)) 1222d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.x() = 1.0f; 1223d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal if (deFloatFloor(c.coords[1]) != deFloatFloor(c.coords[1] + 0.5f)) 1224d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.y() = 1.0f; 1225d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.z() = 1.0f; 1226d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1227d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} 1228d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1229d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galclass UniformStructTests : public tcu::TestCaseGroup 1230d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 1231d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galpublic: 1232d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UniformStructTests (tcu::TestContext& testCtx) 1233d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal : TestCaseGroup(testCtx, "uniform", "Uniform structs") 1234d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1235d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal } 1236d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1237d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal ~UniformStructTests (void) 1238d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1239d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal } 1240d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1241d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal virtual void init (void); 1242d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal}; 1243d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1244d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galvoid UniformStructTests::init (void) 1245d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 1246d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal #define UNIFORM_STRUCT_CASE(NAME, DESCRIPTION, SHADER_SRC, SET_UNIFORMS_BODY, EVAL_FUNC_BODY) \ 1247d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal do { \ 1248dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh struct SetUniforms_##NAME { \ 1249dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh static void setUniforms (ShaderRenderCaseInstance& instance, const tcu::Vec4& constCoords) SET_UNIFORMS_BODY /* NOLINT(SET_UNIFORMS_BODY) */ \ 1250dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh }; \ 1251dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh struct Eval_##NAME { static void eval (ShaderEvalContext& c) EVAL_FUNC_BODY }; /* NOLINT(EVAL_FUNC_BODY) */ \ 1252d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal addChild(createStructCase(m_testCtx, #NAME "_vertex", DESCRIPTION, true, Eval_##NAME::eval, SetUniforms_##NAME::setUniforms, SHADER_SRC).release()); \ 1253d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal addChild(createStructCase(m_testCtx, #NAME "_fragment", DESCRIPTION, false, Eval_##NAME::eval, SetUniforms_##NAME::setUniforms, SHADER_SRC).release()); \ 1254d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal } while (deGetFalse()) 1255d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1256d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(basic, "Basic struct usage", 1257d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1258d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1259d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };" 1260d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1261d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1262d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1263d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec3 b;" 1264d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1265d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1266d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { S s; };" 1267d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1268d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1269d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1270d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b.x, s.b.y, s.c);" 1271d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1272d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1273d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1274d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ONE); 1275d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1276d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 1277d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1278d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[3]; 1279d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal tcu::Vec3 b; 1280d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int c; 1281d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1282d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1283d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S s; 1284d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.a = constCoords.x(); 1285d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.b = constCoords.swizzle(1, 2, 3); 1286d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.c = 1; 1287d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(1u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &s); 1288d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1289d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1290d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.constCoords.swizzle(0, 1, 2); 1291d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1292d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1293d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(nested, "Nested struct", 1294d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1295d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1296d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 1297d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 1298d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1299d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 1300d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int a;" 1301d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b;" 1302d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1303d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1304d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1305d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b;" 1306d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1307d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1308d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { S s; };" 1309d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1310d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1311d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1312d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b.b, s.b.a + s.c);" 1313d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1314d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1315d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1316d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 1317d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 1318d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1319d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct T { 1320d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int a; 13211f7f0dcc9f99fef08f4dc493948d313578e1bbf6pflisiko float _padding1[1]; 13225a2bbfbad4c3b87d44fa75188b53ff6fd56cf6c8pflisiko tcu::Vec2 b; 1323d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1324d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1325d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 1326d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1327d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[3]; 1328d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal T b; 1329d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int c; 13301f7f0dcc9f99fef08f4dc493948d313578e1bbf6pflisiko float _padding2[3]; 1331d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1332d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1333d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S s; 1334d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.a = constCoords.x(); 1335d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.b.a = 0; 1336d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.b.b = constCoords.swizzle(1, 2); 1337d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.c = 1; 1338d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(2u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,sizeof(S), &s); 1339d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1340d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1341d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.constCoords.swizzle(0, 1, 2); 1342d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1343d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1344d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(array_member, "Struct with array member", 1345d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1346d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1347d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };" 1348d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1349d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1350d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1351d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float b[3];" 1352d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1353d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1354d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { S s; };" 1355d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1356d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1357d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1358d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.a, s.b[0], s.b[1], s.c);" 1359d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1360d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1361d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1362d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ONE); 1363d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1364d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct paddedFloat { 1365d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float value; 1366d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding[3]; 1367d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1368d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1369d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 1370d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal paddedFloat a; 1371d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal paddedFloat b[3]; 1372d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int c; 1373d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1374d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1375d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S s; 1376d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.a.value = constCoords.w(); 1377d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.b[0].value = constCoords.z(); 1378d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.b[1].value = constCoords.y(); 1379d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.b[2].value = constCoords.x(); 1380d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.c = 1; 1381d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(1u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,sizeof(S), &s); 1382d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1383d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1384d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.constCoords.swizzle(3, 2, 1); 1385d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1386d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1387d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(array_member_dynamic_index, "Struct with array member, dynamic indexing", 1388d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1389d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1390d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 1391d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 1392d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 1393d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1394d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1395d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1396d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float b[3];" 1397d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1398d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1399d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { S s; };" 1400d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1401d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1402d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1403d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s.b[ui_one], s.b[ui_zero], s.b[ui_two], s.c);" 1404d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1405d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1406d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1407d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 1408d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 1409d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 1410d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1411d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct paddedFloat { 1412d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float value; 1413d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding[3]; 1414d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1415d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1416d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 1417d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal paddedFloat a; 1418d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal paddedFloat b[3]; 1419d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int c; 1420d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1421d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1422d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S s; 1423d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.a.value = constCoords.w(); 1424d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.b[0].value = constCoords.z(); 1425d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.b[1].value = constCoords.y(); 1426d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.b[2].value = constCoords.x(); 1427d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s.c = 1; 1428d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &s); 1429d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1430d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1431d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.constCoords.swizzle(1, 2, 0); 1432d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1433d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1434d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(struct_array, "Struct array", 1435d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1436d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1437d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 1438d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 1439d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 1440d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1441d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1442d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1443d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump int b;" 1444d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1445d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { S s[3]; };" 1446d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1447d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1448d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1449d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(s[2].a, s[1].a, s[0].a, s[2].b - s[1].b + s[0].b);" 1450d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1451d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1452d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1453d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 1454d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 1455d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 1456d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1457d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 1458d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1459d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int b; 1460d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[2]; 1461d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1462d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1463d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S s[3]; 1464d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].a = constCoords.x(); 1465d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b = 0; 1466d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].a = constCoords.y(); 1467d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b = 1; 1468d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[2].a = constCoords.z(); 1469d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[2].b = 2; 1470d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3 * sizeof(S), s); 1471d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1472d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1473d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.constCoords.swizzle(2, 1, 0); 1474d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1475d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1476d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(struct_array_dynamic_index, "Struct array with dynamic indexing", 1477d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1478d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1479d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 1480d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 1481d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 1482d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1483d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1484d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1485d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump int b;" 1486d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1487d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { S s[3]; };" 1488d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1489d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1490d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1491d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${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);" 1492d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1493d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1494d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1495d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 1496d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 1497d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 1498d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1499d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 1500d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1501d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int b; 1502d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[2]; 1503d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1504d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1505d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S s[3]; 1506d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].a = constCoords.x(); 1507d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b = 0; 1508d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].a = constCoords.y(); 1509d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b = 1; 1510d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[2].a = constCoords.z(); 1511d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[2].b = 2; 1512d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3 * sizeof(S), s); 1513d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1514d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1515d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.constCoords.swizzle(2, 1, 0); 1516d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1517d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1518d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(nested_struct_array, "Nested struct array", 1519d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1520d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1521d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 1522d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1523d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b[2];" 1524d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1525d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1526d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1527d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b[3];" 1528d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1529d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1530d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { S s[2]; };" 1531d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1532d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1533d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1534d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " 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" 1535d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float g = s[1].b[0].b[0].y * s[0].b[2].a * s[1].b[2].a; // x * 0.25 * 4" 1536d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " 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" 1537d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a = float(s[0].c) + s[1].b[2].a - s[1].b[1].a; // 0 + 4.0 - 3.0" 1538d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(r, g, b, a);" 1539d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1540d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1541d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1542d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1543d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct T { 1544d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1545d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[3]; 1546d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal tcu::Vec4 b[2]; 1547d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1548d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1549d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 1550d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1551d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[3]; 1552d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal T b[3]; 1553d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int c; 1554d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding2[3]; 1555d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1556d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1557d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S s[2]; 1558d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].a = constCoords.x(); 1559d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[0].a = 0.5f; 1560d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[0].b[0] = constCoords.swizzle(0,1,0,0); 1561d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[0].b[1] = constCoords.swizzle(2,3,0,0); 1562d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[1].a = 1.0f / 3.0f; 1563d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[1].b[0] = constCoords.swizzle(2,3,0,0); 1564d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[1].b[1] = constCoords.swizzle(0,1,0,0); 1565d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[2].a = 1.0f / 4.0f; 1566d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[2].b[0] = constCoords.swizzle(0,2,0,0); 1567d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[2].b[1] = constCoords.swizzle(1,3,0,0); 1568d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].c = 0; 1569d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1570d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].a = constCoords.w(); 1571d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[0].a = 2.0f; 1572d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[0].b[0] = constCoords.swizzle(0,0,0,0); 1573d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[0].b[1] = constCoords.swizzle(1,1,0,0); 1574d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[1].a = 3.0f; 1575d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[1].b[0] = constCoords.swizzle(2,2,0,0); 1576d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[1].b[1] = constCoords.swizzle(3,3,0,0); 1577d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[2].a = 4.0f; 1578d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[2].b[0] = constCoords.swizzle(1,0,0,0); 1579d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[2].b[1] = constCoords.swizzle(3,2,0,0); 1580d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].c = 1; 1581d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1582d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(0u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2 * sizeof(S), s); 1583d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1584d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1585d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.constCoords.swizzle(2, 0, 3); 1586d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1587d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1588d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(nested_struct_array_dynamic_index, "Nested struct array with dynamic indexing", 1589d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1590d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1591d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 1592d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 1593d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 1594d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1595d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 1596d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1597d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b[2];" 1598d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1599d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1600d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1601d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b[3];" 1602d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1603d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1604d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (set = 0, binding = 3) uniform buffer3 { S s[2]; };" 1605d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1606d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1607d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1608d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " 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" 1609d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " 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" 1610d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " 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" 1611d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " 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" 1612d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(r, g, b, a);" 1613d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1614d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1615d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1616d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct T { 1617d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1618d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[3]; 1619d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal tcu::Vec4 b[2]; 1620d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1621d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1622d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 1623d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1624d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[3]; 1625d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal T b[3]; 1626d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int c; 1627d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding2[3]; 1628d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1629d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1630d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S s[2]; 1631d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].a = constCoords.x(); 1632d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[0].a = 0.5f; 1633d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[0].b[0] = constCoords.swizzle(0,1,0,0); 1634d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[0].b[1] = constCoords.swizzle(2,3,0,0); 1635d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[1].a = 1.0f / 3.0f; 1636d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[1].b[0] = constCoords.swizzle(2,3,0,0); 1637d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[1].b[1] = constCoords.swizzle(0,1,0,0); 1638d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[2].a = 1.0f / 4.0f; 1639d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[2].b[0] = constCoords.swizzle(0,2,0,0); 1640d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[2].b[1] = constCoords.swizzle(1,3,0,0); 1641d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].c = 0; 1642d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1643d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].a = constCoords.w(); 1644d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[0].a = 2.0f; 1645d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[0].b[0] = constCoords.swizzle(0,0,0,0); 1646d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[0].b[1] = constCoords.swizzle(1,1,0,0); 1647d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[1].a = 3.0f; 1648d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[1].b[0] = constCoords.swizzle(2,2,0,0); 1649d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[1].b[1] = constCoords.swizzle(3,3,0,0); 1650d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[2].a = 4.0f; 1651d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[2].b[0] = constCoords.swizzle(1,0,0,0); 1652d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[2].b[1] = constCoords.swizzle(3,2,0,0); 1653d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].c = 1; 1654d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1655d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 1656d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 1657d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 1658d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2 * sizeof(S), s); 1659d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1660d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1661d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.constCoords.swizzle(2, 0, 3); 1662d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1663d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(loop_struct_array, "Struct array usage in loop", 1664d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1665d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1666d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 1667d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 1668d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 1669d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1670d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1671d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1672d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump int b;" 1673d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1674d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { S s[3]; };" 1675d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1676d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1677d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1678d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float rgb[3];" 1679d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int alpha = 0;" 1680d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int i = 0; i < 3; i++)" 1681d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 1682d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " rgb[i] = s[2-i].a;" 1683d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " alpha += s[i].b;" 1684d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 1685d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);" 1686d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1687d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1688d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1689d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 1690d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 1691d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 1692d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1693d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 1694d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1695d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int b; 1696d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[2]; 1697d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1698d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1699d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S s[3]; 1700d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].a = constCoords.x(); 1701d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b = 0; 1702d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].a = constCoords.y(); 1703d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b = -1; 1704d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[2].a = constCoords.z(); 1705d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[2].b = 2; 1706d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u * sizeof(S), s); 1707d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1708d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1709d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.constCoords.swizzle(2, 1, 0); 1710d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1711d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1712d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(loop_nested_struct_array, "Nested struct array usage in loop", 1713d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1714d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1715d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 1716d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 1717d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 1718d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { mediump float uf_two; };" 1719d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 4) uniform buffer4 { mediump float uf_three; };" 1720d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 5) uniform buffer5 { mediump float uf_four; };" 1721d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 6) uniform buffer6 { mediump float uf_half; };" 1722d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 7) uniform buffer7 { mediump float uf_third; };" 1723d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 8) uniform buffer8 { mediump float uf_fourth; };" 1724d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 9) uniform buffer9 { mediump float uf_sixth; };" 1725d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1726d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 1727d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1728d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b[2];" 1729d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1730d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1731d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1732d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b[3];" 1733d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1734d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1735d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 10) uniform buffer10 { S s[2]; };" 1736d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1737d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1738d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1739d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float r = 0.0; // (x*3 + y*3) / 6.0" 1740d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float g = 0.0; // (y*3 + z*3) / 6.0" 1741d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float b = 0.0; // (z*3 + w*3) / 6.0" 1742d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a = 1.0;" 1743d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int i = 0; i < 2; i++)" 1744d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 1745d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int j = 0; j < 3; j++)" 1746d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 1747d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " r += s[0].b[j].b[i].y;" 1748d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " g += s[i].b[j].b[0].x;" 1749d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " b += s[i].b[j].b[1].x;" 1750d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " a *= s[i].b[j].a;" 1751d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 1752d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 1753d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);" 1754d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1755d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1756d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1757d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 1758d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 1759d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 1760d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(3u, UF_TWO); 1761d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(4u, UF_THREE); 1762d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(5u, UF_FOUR); 1763d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(6u, UF_HALF); 1764d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(7u, UF_THIRD); 1765d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(8u, UF_FOURTH); 1766d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(9u, UF_SIXTH); 1767d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1768d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct T { 1769d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1770d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[3]; 1771d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal tcu::Vec4 b[2]; 1772d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1773d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1774d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 1775d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1776d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[3]; 1777d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal T b[3]; 1778d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int c; 1779d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding2[3]; 1780d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1781d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1782d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S s[2]; 1783d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].a = constCoords.x(); 1784d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[0].a = 0.5f; 1785d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[0].b[0] = constCoords.swizzle(1,0,0,0); 1786d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[0].b[1] = constCoords.swizzle(2,0,0,0); 1787d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[1].a = 1.0f / 3.0f; 1788d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[1].b[0] = constCoords.swizzle(1,1,0,0); 1789d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[1].b[1] = constCoords.swizzle(3,1,0,0); 1790d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[2].a = 1.0f / 4.0f; 1791d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[2].b[0] = constCoords.swizzle(2,1,0,0); 1792d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[2].b[1] = constCoords.swizzle(2,1,0,0); 1793d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].c = 0; 1794d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1795d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].a = constCoords.w(); 1796d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[0].a = 2.0f; 1797d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[0].b[0] = constCoords.swizzle(2,0,0,0); 1798d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[0].b[1] = constCoords.swizzle(2,1,0,0); 1799d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[1].a = 3.0f; 1800d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[1].b[0] = constCoords.swizzle(2,2,0,0); 1801d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[1].b[1] = constCoords.swizzle(3,3,0,0); 1802d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[2].a = 4.0f; 1803d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[2].b[0] = constCoords.swizzle(1,0,0,0); 1804d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[2].b[1] = constCoords.swizzle(3,2,0,0); 1805d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].c = 1; 1806d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1807d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(10u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2 * sizeof(S), s); 1808d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1809d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1810d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1811d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = (c.constCoords.swizzle(0, 1, 2) + c.constCoords.swizzle(1, 2, 3)) * 0.5f; 1812d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1813d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1814d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(dynamic_loop_struct_array, "Struct array usage in dynamic loop", 1815d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1816d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1817d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 1818d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 1819d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 1820d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { int ui_three; };" 1821d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1822d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1823d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1824d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump int b;" 1825d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1826d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 4) uniform buffer4 { S s[3]; };" 1827d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1828d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1829d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1830d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float rgb[3];" 1831d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int alpha = 0;" 1832d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int i = 0; i < ui_three; i++)" 1833d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 1834d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " rgb[i] = s[2-i].a;" 1835d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " alpha += s[i].b;" 1836d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 1837d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);" 1838d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1839d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1840d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1841d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 1842d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 1843d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 1844d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(3u, UI_THREE); 1845d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1846d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 1847d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1848d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int b; 1849d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[2]; 1850d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1851d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1852d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S s[3]; 1853d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].a = constCoords.x(); 1854d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b = 0; 1855d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].a = constCoords.y(); 1856d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b = -1; 1857d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[2].a = constCoords.z(); 1858d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[2].b = 2; 1859d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(4u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u * sizeof(S), s); 1860d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1861d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1862d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1863d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = c.constCoords.swizzle(2, 1, 0); 1864d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1865d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1866d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(dynamic_loop_nested_struct_array, "Nested struct array usage in dynamic loop", 1867d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1868d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1869d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };" 1870d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };" 1871d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };" 1872d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { int ui_three; };" 1873d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 4) uniform buffer4 { mediump float uf_two; };" 1874d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 5) uniform buffer5 { mediump float uf_three; };" 1875d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 6) uniform buffer6 { mediump float uf_four; };" 1876d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 7) uniform buffer7 { mediump float uf_half; };" 1877d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 8) uniform buffer8 { mediump float uf_third; };" 1878d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 9) uniform buffer9 { mediump float uf_fourth; };" 1879d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 10) uniform buffer10 { mediump float uf_sixth; };" 1880d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1881d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct T {" 1882d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1883d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec2 b[2];" 1884d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1885d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1886d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1887d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " T b[3];" 1888d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1889d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1890533b2651cc2f6ac8da907fcb1b2932ec53576e3dpflisiko << "layout (std140, set = 0, binding = 11) uniform buffer11 { S s[2]; };" 1891d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1892d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1893d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1894d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float r = 0.0; // (x*3 + y*3) / 6.0" 1895d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float g = 0.0; // (y*3 + z*3) / 6.0" 1896d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float b = 0.0; // (z*3 + w*3) / 6.0" 1897d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a = 1.0;" 1898d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int i = 0; i < ui_two; i++)" 1899d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 1900d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " for (int j = 0; j < ui_three; j++)" 1901d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " {" 1902d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " r += s[0].b[j].b[i].y;" 1903d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " g += s[i].b[j].b[0].x;" 1904d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " b += s[i].b[j].b[1].x;" 1905d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " a *= s[i].b[j].a;" 1906d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 1907d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " }" 1908d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);" 1909d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1910d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1911d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1912d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UI_ZERO); 1913d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_ONE); 1914d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(2u, UI_TWO); 1915d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(3u, UI_THREE); 1916d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(4u, UF_TWO); 1917d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(5u, UF_THREE); 1918d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(6u, UF_FOUR); 1919d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(7u, UF_HALF); 1920d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(8u, UF_THIRD); 1921d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(9u, UF_FOURTH); 1922d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(10u, UF_SIXTH); 1923d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1924d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct T { 1925d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1926d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[3]; 1927d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal tcu::Vec4 b[2]; 1928d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1929d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1930d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 1931d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 1932d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[3]; 1933d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal T b[3]; 1934d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int c; 1935d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding2[3]; 1936d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 1937d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1938d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S s[2]; 1939d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].a = constCoords.x(); 1940d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[0].a = 0.5f; 1941d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[0].b[0] = constCoords.swizzle(1,0,0,0); 1942d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[0].b[1] = constCoords.swizzle(2,0,0,0); 1943d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[1].a = 1.0f / 3.0f; 1944d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[1].b[0] = constCoords.swizzle(1,1,0,0); 1945d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[1].b[1] = constCoords.swizzle(3,1,0,0); 1946d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[2].a = 1.0f / 4.0f; 1947d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[2].b[0] = constCoords.swizzle(2,1,0,0); 1948d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].b[2].b[1] = constCoords.swizzle(2,1,0,0); 1949d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[0].c = 0; 1950d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1951d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].a = constCoords.w(); 1952d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[0].a = 2.0f; 1953d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[0].b[0] = constCoords.swizzle(2,0,0,0); 1954d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[0].b[1] = constCoords.swizzle(2,1,0,0); 1955d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[1].a = 3.0f; 1956d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[1].b[0] = constCoords.swizzle(2,2,0,0); 1957d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[1].b[1] = constCoords.swizzle(3,3,0,0); 1958d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[2].a = 4.0f; 1959d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[2].b[0] = constCoords.swizzle(1,0,0,0); 1960d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].b[2].b[1] = constCoords.swizzle(3,2,0,0); 1961d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal s[1].c = 1; 1962d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1963d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(11u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2 * sizeof(S), s); 1964d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1965d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 1966d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1967d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xyz() = (c.constCoords.swizzle(0, 1, 2) + c.constCoords.swizzle(1, 2, 3)) * 0.5f; 1968d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 1969d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1970d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(equal, "Struct equality", 1971d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 1972d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 1973d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { mediump float uf_one; };" 1974d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_two; };" 1975d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1976d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 1977d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 1978d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec3 b;" 1979d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 1980d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 1981d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { S a; };" 1982d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { S b; };" 1983d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 4) uniform buffer4 { S c; };" 1984d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 1985d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 1986d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 1987d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S d = S(uf_one, vec3(0.0, floor(${COORDS}.y+1.0), 2.0), ui_two);" 1988d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(0.0, 0.0, 0.0, 1.0);" 1989d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a == b) ${DST}.x = 1.0;" 1990d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a == c) ${DST}.y = 1.0;" 1991d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a == d) ${DST}.z = 1.0;" 1992d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 1993d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 1994d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 1995d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal DE_UNREF(constCoords); 1996d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UF_ONE); 1997d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_TWO); 1998d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 1999d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 2000d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 2001d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[3]; 2002d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal tcu::Vec3 b; 2003d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int c; 2004d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 2005d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2006d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S sa; 2007d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sa.a = 1.0f; 2008d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sa.b = tcu::Vec3(0.0f, 1.0f, 2.0f); 2009d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sa.c = 2; 2010d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(2u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &sa); 2011d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2012d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S sb; 2013d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sb.a = 1.0f; 2014d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sb.b = tcu::Vec3(0.0f, 1.0f, 2.0f); 2015d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sb.c = 2; 2016d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &sb); 2017d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2018d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S sc; 2019d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sc.a = 1.0f; 2020d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sc.b = tcu::Vec3(0.0f, 1.1f, 2.0f); 2021d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sc.c = 2; 2022d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(4u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &sc); 2023d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 2024d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 2025d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xy() = tcu::Vec2(1.0f, 0.0f); 2026d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal if (deFloatFloor(c.coords[1] + 1.0f) == deFloatFloor(1.1f)) 2027d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.z() = 1.0f; 2028d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 2029d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2030d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal UNIFORM_STRUCT_CASE(not_equal, "Struct equality", 2031d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal LineStream() 2032d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "${HEADER}" 2033d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 0) uniform buffer0 { mediump float uf_one; };" 2034d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_two; };" 2035d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 2036d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "struct S {" 2037d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump float a;" 2038d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " mediump vec3 b;" 2039d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " int c;" 2040d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "};" 2041d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 2) uniform buffer2 { S a; };" 2042d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 3) uniform buffer3 { S b; };" 2043d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "layout (std140, set = 0, binding = 4) uniform buffer4 { S c; };" 2044d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "" 2045d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "void main (void)" 2046d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "{" 2047d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " S d = S(uf_one, vec3(0.0, floor(${COORDS}.y+1.0), 2.0), ui_two);" 2048d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${DST} = vec4(0.0, 0.0, 0.0, 1.0);" 2049d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a != b) ${DST}.x = 1.0;" 2050d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a != c) ${DST}.y = 1.0;" 2051d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " if (a != d) ${DST}.z = 1.0;" 2052d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << " ${ASSIGN_POS}" 2053d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal << "}", 2054d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 2055d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal DE_UNREF(constCoords); 2056d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(0u, UF_ONE); 2057d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.useUniform(1u, UI_TWO); 2058d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2059d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal struct S { 2060d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float a; 2061d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal float _padding1[3]; 2062d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal tcu::Vec3 b; 2063d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal int c; 2064d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }; 2065d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2066d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S sa; 2067d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sa.a = 1.0f; 2068d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sa.b = tcu::Vec3(0.0f, 1.0f, 2.0f); 2069d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sa.c = 2; 2070d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(2u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &sa); 2071d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2072d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S sb; 2073d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sb.a = 1.0f; 2074d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sb.b = tcu::Vec3(0.0f, 1.0f, 2.0f); 2075d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sb.c = 2; 2076d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &sb); 2077d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2078d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal S sc; 2079d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sc.a = 1.0f; 2080d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sc.b = tcu::Vec3(0.0f, 1.1f, 2.0f); 2081d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal sc.c = 2; 2082d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal instance.addUniform(4u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &sc); 2083d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }, 2084d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal { 2085d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.xy() = tcu::Vec2(0.0f, 1.0f); 2086d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal if (deFloatFloor(c.coords[1] + 1.0f) != deFloatFloor(1.1f)) 2087d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal c.color.z() = 1.0f; 2088d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal }); 2089d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} 2090d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2091d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galclass ShaderStructTests : public tcu::TestCaseGroup 2092d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 2093d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galpublic: 2094d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal ShaderStructTests (tcu::TestContext& context); 2095d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal virtual ~ShaderStructTests (void); 2096d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2097d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal virtual void init (void); 2098d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2099d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galprivate: 2100d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal ShaderStructTests (const ShaderStructTests&); // not allowed! 2101d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal ShaderStructTests& operator= (const ShaderStructTests&); // not allowed! 2102d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal}; 2103d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2104d994b3a2d869497f1496273b6d9b8affb1752b20Peter GalShaderStructTests::ShaderStructTests (tcu::TestContext& testCtx) 2105d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal : TestCaseGroup(testCtx, "struct", "Struct Tests") 2106d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 2107d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} 2108d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2109d994b3a2d869497f1496273b6d9b8affb1752b20Peter GalShaderStructTests::~ShaderStructTests (void) 2110d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 2111d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} 2112d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2113d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galvoid ShaderStructTests::init (void) 2114d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 2115d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal addChild(new LocalStructTests(m_testCtx)); 2116d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal addChild(new UniformStructTests(m_testCtx)); 2117d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} 2118d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2119d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} // anonymous 2120d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2121d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galtcu::TestCaseGroup* createStructTests (tcu::TestContext& testCtx) 2122d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{ 2123d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal return new ShaderStructTests(testCtx); 2124d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} 2125d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal 2126d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} // sr 2127d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} // vkt 2128