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