1 /*------------------------------------------------------------------------- 2 * drawElements Quality Program OpenGL ES 2.0 Module 3 * ------------------------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Attribute location test 22 *//*--------------------------------------------------------------------*/ 23 24 #include "es2fAttribLocationTests.hpp" 25 26 #include "glsAttributeLocationTests.hpp" 27 28 #include "deStringUtil.hpp" 29 #include "gluDefs.hpp" 30 #include "gluRenderContext.hpp" 31 #include "glwDefs.hpp" 32 #include "glwEnums.hpp" 33 #include "tcuTestLog.hpp" 34 35 #include <vector> 36 37 using namespace deqp::gls::AttributeLocationTestUtil; 38 using std::vector; 39 40 namespace deqp 41 { 42 namespace gles2 43 { 44 namespace Functional 45 { 46 47 TestCaseGroup* createAttributeLocationTests (Context& context) 48 { 49 const AttribType types[] = 50 { 51 AttribType("float", 1, GL_FLOAT), 52 AttribType("vec2", 1, GL_FLOAT_VEC2), 53 AttribType("vec3", 1, GL_FLOAT_VEC3), 54 AttribType("vec4", 1, GL_FLOAT_VEC4), 55 56 AttribType("mat2", 2, GL_FLOAT_MAT2), 57 AttribType("mat3", 3, GL_FLOAT_MAT3), 58 AttribType("mat4", 4, GL_FLOAT_MAT4) 59 }; 60 61 TestCaseGroup* const root = new TestCaseGroup (context, "attribute_location", "Attribute location tests"); 62 63 // Basic bind attribute tests 64 { 65 TestCaseGroup* const bindAttributeGroup = new TestCaseGroup(context, "bind", "Basic attribute binding tests."); 66 67 root->addChild(bindAttributeGroup); 68 69 for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++) 70 { 71 const AttribType& type = types[typeNdx]; 72 bindAttributeGroup->addChild(new gls::BindAttributeTest(context.getTestContext(), context.getRenderContext(), type)); 73 } 74 } 75 76 // Bind max number of attributes 77 { 78 TestCaseGroup* const bindMaxAttributeGroup = new TestCaseGroup(context, "bind_max_attributes", "Test using maximum attributes with bind."); 79 80 root->addChild(bindMaxAttributeGroup); 81 82 for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++) 83 { 84 const AttribType& type = types[typeNdx]; 85 bindMaxAttributeGroup->addChild(new gls::BindMaxAttributesTest(context.getTestContext(), context.getRenderContext(), type)); 86 } 87 } 88 89 // Test aliasing 90 { 91 TestCaseGroup* const aliasingGroup = new TestCaseGroup(context, "bind_aliasing", "Test attribute location aliasing with bind."); 92 93 root->addChild(aliasingGroup); 94 95 for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++) 96 { 97 const AttribType& type = types[typeNdx]; 98 99 // Simple aliasing cases 100 aliasingGroup->addChild(new gls::BindAliasingAttributeTest(context.getTestContext(), context.getRenderContext(), type)); 101 102 // For types which occupy more than one location. Alias second location. 103 if (type.getLocationSize() > 1) 104 aliasingGroup->addChild(new gls::BindAliasingAttributeTest(context.getTestContext(), context.getRenderContext(), type, 1)); 105 106 // Use more than maximum attributes with conditional aliasing 107 aliasingGroup->addChild(new gls::BindMaxAliasingAttributeTest(context.getTestContext(), context.getRenderContext(), type)); 108 109 // Use more than maximum attributes with inactive attributes 110 aliasingGroup->addChild(new gls::BindInactiveAliasingAttributeTest(context.getTestContext(), context.getRenderContext(), type)); 111 } 112 } 113 114 // Test filling holes in attribute location 115 { 116 TestCaseGroup* const holeGroup = new TestCaseGroup(context, "bind_hole", "Bind all, but one attribute and leave hole in location space for it."); 117 118 root->addChild(holeGroup); 119 120 for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++) 121 { 122 const AttribType& type = types[typeNdx]; 123 124 // Bind first location, leave hole size of type and fill rest of locations 125 holeGroup->addChild(new gls::BindHoleAttributeTest(context.getTestContext(), context.getRenderContext(), type)); 126 } 127 } 128 129 // Test binding at different times 130 { 131 TestCaseGroup* const bindTimeGroup = new TestCaseGroup(context, "bind_time", "Bind time tests. Test binding at different stages."); 132 133 root->addChild(bindTimeGroup); 134 135 bindTimeGroup->addChild(new gls::PreAttachBindAttributeTest(context.getTestContext(), context.getRenderContext())); 136 bindTimeGroup->addChild(new gls::PreLinkBindAttributeTest(context.getTestContext(), context.getRenderContext())); 137 bindTimeGroup->addChild(new gls::PostLinkBindAttributeTest(context.getTestContext(), context.getRenderContext())); 138 bindTimeGroup->addChild(new gls::BindRelinkAttributeTest(context.getTestContext(), context.getRenderContext())); 139 bindTimeGroup->addChild(new gls::BindReattachAttributeTest(context.getTestContext(), context.getRenderContext())); 140 } 141 142 // Test relinking program 143 { 144 TestCaseGroup* const relinkHoleGroup = new TestCaseGroup(context, "bind_relink_hole", "Test relinking with moving hole in attribute location space."); 145 146 root->addChild(relinkHoleGroup); 147 148 for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++) 149 { 150 const AttribType& type = types[typeNdx]; 151 152 relinkHoleGroup->addChild(new gls::BindRelinkHoleAttributeTest(context.getTestContext(), context.getRenderContext(), type)); 153 } 154 } 155 156 return root; 157 } 158 159 } // Functional 160 } // gles2 161 } // deqp 162