1 #ifndef _GLSDRAWTEST_HPP 2 #define _GLSDRAWTEST_HPP 3 /*------------------------------------------------------------------------- 4 * drawElements Quality Program OpenGL (ES) Module 5 * ----------------------------------------------- 6 * 7 * Copyright 2014 The Android Open Source Project 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file 23 * \brief Draw tests 24 *//*--------------------------------------------------------------------*/ 25 26 #include "tcuTestCase.hpp" 27 #include "gluRenderContext.hpp" 28 29 namespace sglr 30 { 31 32 class ReferenceContextBuffers; 33 class ReferenceContext; 34 class Context; 35 36 } // sglr 37 38 namespace deqp 39 { 40 namespace gls 41 { 42 43 class AttributePack; 44 45 struct DrawTestSpec 46 { 47 enum Target 48 { 49 TARGET_ELEMENT_ARRAY = 0, 50 TARGET_ARRAY, 51 52 TARGET_LAST 53 }; 54 55 enum InputType 56 { 57 INPUTTYPE_FLOAT = 0, 58 INPUTTYPE_FIXED, 59 INPUTTYPE_DOUBLE, 60 61 INPUTTYPE_BYTE, 62 INPUTTYPE_SHORT, 63 64 INPUTTYPE_UNSIGNED_BYTE, 65 INPUTTYPE_UNSIGNED_SHORT, 66 67 INPUTTYPE_INT, 68 INPUTTYPE_UNSIGNED_INT, 69 INPUTTYPE_HALF, 70 INPUTTYPE_UNSIGNED_INT_2_10_10_10, 71 INPUTTYPE_INT_2_10_10_10, 72 73 INPUTTYPE_LAST 74 }; 75 76 enum OutputType 77 { 78 OUTPUTTYPE_FLOAT = 0, 79 OUTPUTTYPE_VEC2, 80 OUTPUTTYPE_VEC3, 81 OUTPUTTYPE_VEC4, 82 83 OUTPUTTYPE_INT, 84 OUTPUTTYPE_UINT, 85 86 OUTPUTTYPE_IVEC2, 87 OUTPUTTYPE_IVEC3, 88 OUTPUTTYPE_IVEC4, 89 90 OUTPUTTYPE_UVEC2, 91 OUTPUTTYPE_UVEC3, 92 OUTPUTTYPE_UVEC4, 93 94 OUTPUTTYPE_LAST 95 }; 96 97 enum Usage 98 { 99 USAGE_DYNAMIC_DRAW = 0, 100 USAGE_STATIC_DRAW, 101 USAGE_STREAM_DRAW, 102 103 USAGE_STREAM_READ, 104 USAGE_STREAM_COPY, 105 106 USAGE_STATIC_READ, 107 USAGE_STATIC_COPY, 108 109 USAGE_DYNAMIC_READ, 110 USAGE_DYNAMIC_COPY, 111 112 USAGE_LAST 113 }; 114 115 enum Storage 116 { 117 STORAGE_USER = 0, 118 STORAGE_BUFFER, 119 120 STORAGE_LAST 121 }; 122 123 enum Primitive 124 { 125 PRIMITIVE_POINTS = 0, 126 PRIMITIVE_TRIANGLES, 127 PRIMITIVE_TRIANGLE_FAN, 128 PRIMITIVE_TRIANGLE_STRIP, 129 PRIMITIVE_LINES, 130 PRIMITIVE_LINE_STRIP, 131 PRIMITIVE_LINE_LOOP, 132 133 PRIMITIVE_LINES_ADJACENCY, 134 PRIMITIVE_LINE_STRIP_ADJACENCY, 135 PRIMITIVE_TRIANGLES_ADJACENCY, 136 PRIMITIVE_TRIANGLE_STRIP_ADJACENCY, 137 138 PRIMITIVE_LAST 139 }; 140 141 enum IndexType 142 { 143 INDEXTYPE_BYTE = 0, 144 INDEXTYPE_SHORT, 145 INDEXTYPE_INT, 146 147 INDEXTYPE_LAST 148 }; 149 150 enum DrawMethod 151 { 152 DRAWMETHOD_DRAWARRAYS = 0, 153 DRAWMETHOD_DRAWARRAYS_INSTANCED, 154 DRAWMETHOD_DRAWARRAYS_INDIRECT, 155 DRAWMETHOD_DRAWELEMENTS, 156 DRAWMETHOD_DRAWELEMENTS_RANGED, 157 DRAWMETHOD_DRAWELEMENTS_INSTANCED, 158 DRAWMETHOD_DRAWELEMENTS_INDIRECT, 159 DRAWMETHOD_DRAWELEMENTS_BASEVERTEX, 160 DRAWMETHOD_DRAWELEMENTS_INSTANCED_BASEVERTEX, 161 DRAWMETHOD_DRAWELEMENTS_RANGED_BASEVERTEX, 162 163 DRAWMETHOD_LAST 164 }; 165 166 enum CompatibilityTestType 167 { 168 COMPATIBILITY_NONE = 0, 169 COMPATIBILITY_UNALIGNED_OFFSET, 170 COMPATIBILITY_UNALIGNED_STRIDE, 171 172 COMPATIBILITY_LAST 173 }; 174 175 static std::string targetToString (Target target); 176 static std::string inputTypeToString (InputType type); 177 static std::string outputTypeToString (OutputType type); 178 static std::string usageTypeToString (Usage usage); 179 static std::string storageToString (Storage storage); 180 static std::string primitiveToString (Primitive primitive); 181 static std::string indexTypeToString (IndexType type); 182 static std::string drawMethodToString (DrawMethod method); 183 static int inputTypeSize (InputType type); 184 static int indexTypeSize (IndexType type); 185 186 struct AttributeSpec 187 { 188 static AttributeSpec createAttributeArray (InputType inputType, OutputType outputType, Storage storage, Usage usage, int componentCount, int offset, int stride, bool normalize, int instanceDivisor); 189 static AttributeSpec createDefaultAttribute (InputType inputType, OutputType outputType, int componentCount); //!< allowed inputType values: INPUTTYPE_INT, INPUTTYPE_UNSIGNED_INT, INPUTTYPE_FLOAT 190 191 InputType inputType; 192 OutputType outputType; 193 Storage storage; 194 Usage usage; 195 int componentCount; 196 int offset; 197 int stride; 198 bool normalize; 199 int instanceDivisor; //!< used only if drawMethod = Draw*Instanced 200 bool useDefaultAttribute; 201 202 bool additionalPositionAttribute; //!< treat this attribute as position attribute. Attribute at index 0 is alway treated as such. False by default 203 bool bgraComponentOrder; //!< component order of this attribute is bgra, valid only for 4-component targets. False by default. 204 205 AttributeSpec (void); 206 207 int hash (void) const; 208 bool valid (glu::ApiType apiType) const; 209 bool isBufferAligned (void) const; 210 bool isBufferStrideAligned (void) const; 211 }; 212 213 std::string getName (void) const; 214 std::string getDesc (void) const; 215 std::string getMultilineDesc (void) const; 216 217 glu::ApiType apiType; //!< needed in spec validation 218 Primitive primitive; 219 int primitiveCount; //!< number of primitives to draw (per instance) 220 221 DrawMethod drawMethod; 222 IndexType indexType; //!< used only if drawMethod = DrawElements* 223 int indexPointerOffset; //!< used only if drawMethod = DrawElements* 224 Storage indexStorage; //!< used only if drawMethod = DrawElements* 225 int first; //!< used only if drawMethod = DrawArrays* 226 int indexMin; //!< used only if drawMethod = Draw*Ranged 227 int indexMax; //!< used only if drawMethod = Draw*Ranged 228 int instanceCount; //!< used only if drawMethod = Draw*Instanced or Draw*Indirect 229 int indirectOffset; //!< used only if drawMethod = Draw*Indirect 230 int baseVertex; //!< used only if drawMethod = DrawElementsIndirect or *BaseVertex 231 232 std::vector<AttributeSpec> attribs; 233 234 DrawTestSpec (void); 235 236 int hash (void) const; 237 bool valid (void) const; 238 CompatibilityTestType isCompatibilityTest (void) const; 239 }; 240 241 class DrawTest : public tcu::TestCase 242 { 243 public: 244 DrawTest (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const DrawTestSpec& spec, const char* name, const char* desc); 245 DrawTest (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* desc); 246 virtual ~DrawTest (void); 247 248 void addIteration (const DrawTestSpec& spec, const char* description = DE_NULL); 249 250 private: 251 void init (void); 252 void deinit (void); 253 IterateResult iterate (void); 254 255 bool compare (gls::DrawTestSpec::Primitive primitiveType); 256 float getCoordScale (const DrawTestSpec& spec) const; 257 float getColorScale (const DrawTestSpec& spec) const; 258 259 glu::RenderContext& m_renderCtx; 260 261 sglr::ReferenceContextBuffers* m_refBuffers; 262 sglr::ReferenceContext* m_refContext; 263 sglr::Context* m_glesContext; 264 265 AttributePack* m_glArrayPack; 266 AttributePack* m_rrArrayPack; 267 268 int m_maxDiffRed; 269 int m_maxDiffGreen; 270 int m_maxDiffBlue; 271 272 std::vector<DrawTestSpec> m_specs; 273 std::vector<std::string> m_iteration_descriptions; 274 int m_iteration; 275 tcu::ResultCollector m_result; 276 }; 277 278 } // gls 279 } // deqp 280 281 #endif // _GLSDRAWTEST_HPP 282